青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

CLI/C++中混合類的使用


一 混合類

所謂混合類是指CLI/C++中native的Class中可以包含CLR對象,CLR的class也可以包含Naitve的對象。

1)native的class中包含CLR對象,必須通過gcroot<>或auto_gcroot<>。
2)CLR中的class中包含native的對象,必須是指針,也可以使用高手寫的CAutoNativePtr智能指針。


注意:C#中不能調用CLI/C++中的Native的class。同樣Native C++中也不能調用CLI/C++中的Ref的class。

二 實例

 高手的CAutoNativePtr類:

/***
    CAutoNativePtr - A smart pointer for using native objects in managed code.

    Author    :    Nishant Sivakumar
    Email    :    voidnish@gmail.com    
    Blog    :    
http://blog.voidnish.com
    Web        :    
http://www.voidnish.com     

    You may freely use this class as long as you include
    this copyright. 
    
    You may freely modify and use this class as long
    as you include this copyright in your modified version. 

    This code is provided "as is" without express or implied warranty. 
    
    Copyright ?Nishant Sivakumar, 2006.
    All Rights Reserved.
**
*/


#pragma once

template
<typename T> ref class CAutoNativePtr
{
private:
    T
* _ptr;

public:
    CAutoNativePtr() : _ptr(nullptr)
    
{
    }


    CAutoNativePtr(T
* t) : _ptr(t)
    
{
    }


    CAutoNativePtr(CAutoNativePtr
<T>% an) : _ptr(an.Detach())
    
{
    }


    template
<typename TDERIVED> 
        CAutoNativePtr(CAutoNativePtr
<TDERIVED>% an) : _ptr(an.Detach())
    
{
    }


    
!CAutoNativePtr()
    
{    
        delete _ptr;
    }


    
~CAutoNativePtr()
    
{
        
this->!CAutoNativePtr();
    }


    CAutoNativePtr
<T>% operator=(T* t)
    
{
        Attach(t);
        
return *this;
    }


    CAutoNativePtr
<T>% operator=(CAutoNativePtr<T>% an)
    
{
        
if(this != %an)
            Attach(an.Detach());
        
return *this;
    }


    template
<typename TDERIVED> 
        CAutoNativePtr
<T>% operator=(CAutoNativePtr<TDERIVED>% an)
    
{
        Attach(an.Detach());
        
return *this;
    }


    
static T* operator->(CAutoNativePtr<T>% an)
    
{
        
return an._ptr;
    }


    
static operator T*(CAutoNativePtr<T>% an)
    
{
        
return an._ptr;
    }


    T
* Detach()
    
{
        T
* t = _ptr;
        _ptr 
= nullptr;
        
return t;
    }


    
void Attach(T* t)
    
{
        
if(t)
        
{    
            
if(_ptr != t)
            
{
                delete _ptr;
                _ptr 
= t;
            }

        }

        
else
        
{
#ifdef _DEBUG
            
throw gcnew Exception(
                
"Attempting to Attach() a nullptr!");
#endif
        }
        
    }


    
void Destroy()
    
{
        delete _ptr;
        _ptr 
= nullptr;
    }

}
;

測試實例之CLI/C++文件:
// MixedNativeAndCLIDLL.h

#pragma once
#include 
<string>
#include 
<iostream>
#include 
<gcroot.h>
#include 
<msclr/auto_gcroot.h>

#include 
"AutoNative.h"

using namespace System;

namespace MixedNativeAndCLIDLL {

    
public class NativeClass
    
{
    
public:
        
int *pX;    
        NativeClass()
{pX = new int(10);}
        
~NativeClass()
        
{
            
if(pX != NULL)
            
{
                delete pX;
                pX 
= NULL;
            }

        }
        
    }
;

    
public ref class RefClass
    
{
    
public:
        
int x;    
        RefClass()
{x = 20;}
    }
;

    
public class MixedClass0
    
{
        
public:
            NativeClass nativeClass;
            
//RefClass refClass; // error c3265 and error c3149
            gcroot<RefClass^> refClass1;

            std::
string nativeStr;
            
//System::String refStr; // error c3265 and error c3149
            gcroot<System::String^> refStr1;

            MixedClass0()
            
{
                refClass1 
= gcnew RefClass();
                refStr1 
= gcnew System::String("i am a native class mixed some clr members.\n");
            }

            
~MixedClass0()
            
{            
                delete refClass1;
                delete refStr1;
            }


            
void PrintSelf()
            
{
                System::Console::WriteLine(
"my name is MixedClass0");
                System::Console::WriteLine(refClass1
->x);
                System::Console::WriteLine(refStr1);
            }

    }
;

    
public class MixedClass1
    
{
        
public:
            NativeClass nativeClass;
            
//RefClass refClass; // error c3265 and error c3149
            msclr::auto_gcroot<RefClass^> refClass1;

            std::
string nativeStr;
            
//System::String refStr; // error c3265 and error c3149
            msclr::auto_gcroot<System::String^> refStr1;

            MixedClass1()
            
{
                refClass1 
= gcnew RefClass();
                refStr1 
= gcnew System::String("i am a native class with some clr members.\n");
            }

            
~MixedClass1()
            
{
                
// no need to delete.
            }
        

            
void PrintSelf()
            
{
                System::Console::WriteLine(
"my name is MixedClass1");
                System::Console::WriteLine(refClass1
->x);
                System::Console::WriteLine(refStr1);
            }

    }
;

    
public ref class MixedClass2
    
{
        
public:
            
//NativeClass nativeClass; // error c4368
            NativeClass * nativeClass1;
            RefClass
^ refClass; 
            
            
//std::string nativeStr; // error c4368
            std::string *nativeStr1;
            System::String
^ refStr; //     

            MixedClass2()
            
{
                nativeClass1 
= new NativeClass();
                nativeStr1 
= new std::string("i am a clr class with some native members.\n");
            }

            
~MixedClass2()
            
{
                delete nativeClass1;
                delete nativeStr1;
            }

            
!MixedClass2(){}

            
void PrintSelf()
            
{
                System::Console::WriteLine(
"my name is MixedClass2");
                std::cout
<<*(nativeClass1->pX)<<std::endl;
                std::cout
<<*nativeStr1<<std::endl;                
            }

    }
;
    
    
public ref class MixedClass3
    
{
        
public:
            
//NativeClass nativeClass; // error c4368
            CAutoNativePtr<NativeClass> nativeClass1;
            RefClass
^ refClass; 
            
            
//std::string nativeStr; // error c4368
            CAutoNativePtr<std::string> nativeStr1;
            System::String
^ refStr; //     

            MixedClass3()
            
{
                nativeClass1 
= new NativeClass();
                nativeStr1 
= new std::string("i am a clr class with some native members.\n");
            }

            
~MixedClass3(){}
            
!MixedClass3(){}

            
void PrintSelf()
            
{
                System::Console::WriteLine(
"my name is MixedClass3");
                std::cout
<<*(nativeClass1->pX)<<std::endl;
                std::cout
<<*nativeStr1<<std::endl;                
            }

    }
;
}


測試實例之C#調用文件:
using System;
using System.Collections.Generic;
using System.Text;

namespace CsharpTest
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            MixedNativeAndCLIDLL.MixedClass0 mixedClass0 
= new MixedNativeAndCLIDLL.MixedClass0();
            
//mixedClass0.PrintSelf();
            MixedNativeAndCLIDLL.MixedClass1 mixedClass1 = new MixedNativeAndCLIDLL.MixedClass1();
            
//mixedClass1.PrintSelf();
            MixedNativeAndCLIDLL.MixedClass2 mixedClass2 = new MixedNativeAndCLIDLL.MixedClass2();
            mixedClass2.PrintSelf();
            MixedNativeAndCLIDLL.MixedClass3 mixedClass3 
= new MixedNativeAndCLIDLL.MixedClass3();
            mixedClass3.PrintSelf();
        }

    }

}


三 代碼下載

http://m.shnenglu.com/Files/mzty/MixedNativeAndCLITest.rar

posted on 2007-12-24 17:47 夢在天涯 閱讀(10625) 評論(3)  編輯 收藏 引用 所屬分類: CPlusPlusC#/.NETManage c++ /CLI

評論

# re: CLI/C++中混合類的使用 2007-12-24 19:00 阿里

CAutoNativePtr類 好像出自一本講述c++/CLI的書
今年才出版。  回復  更多評論   

# re: CLI/C++中混合類的使用 2007-12-24 22:47 天下無雙

嗯,很有用。  回復  更多評論   

# re: CLI/C++中混合類的使用 2007-12-25 08:38 夢在天涯

CAutoNativePtr這個來自C++/CLI in Action一書!  回復  更多評論   

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1814985
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              精品白丝av| 麻豆久久精品| 亚洲欧洲日本在线| 久久国产日韩| 亚洲高清在线观看| 亚洲国产精品专区久久| 欧美va天堂| 久久亚洲欧美| 激情欧美丁香| 亚洲精品在线观看视频| 国产精品一区二区久激情瑜伽| 欧美系列电影免费观看| 欧美一区二区网站| 欧美成人一区二区在线| 亚洲欧美日本另类| 麻豆精品在线播放| 性欧美暴力猛交69hd| 蜜臀va亚洲va欧美va天堂| 亚洲永久免费av| 免费成人黄色av| 久久www成人_看片免费不卡| 麻豆九一精品爱看视频在线观看免费| 亚洲视频你懂的| 欧美精品不卡| 亚洲国产一区在线观看| 亚洲国产成人久久综合一区| 亚洲欧美第一页| 亚洲欧美日韩区| 亚洲高清一区二| 亚洲国产高清视频| 蜜桃久久av一区| 亚洲高清一区二| 中文av一区二区| 国产精品乱码一区二区三区| 一本大道久久a久久综合婷婷| 亚洲伦理一区| 国产精品福利在线观看网址| 国产精品久久久久一区二区| 亚洲国产欧美在线人成| 亚洲片国产一区一级在线观看| 免费视频一区二区三区在线观看| 亚洲国产高清在线| 亚洲五月婷婷| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美一区不卡| 国产亚洲一本大道中文在线| 久久久激情视频| 99热在线精品观看| 久热精品视频在线观看| 一区二区三区久久| 红桃av永久久久| 久久嫩草精品久久久精品| 在线看国产日韩| 国产精品乱看| 欧美日韩成人在线播放| 性感少妇一区| 亚洲精品亚洲人成人网| 久久免费观看视频| 亚洲欧美日韩综合| 亚洲免费高清| 1024国产精品| 国产欧美日韩一区二区三区在线观看| 久久久久国产精品一区三寸| 一区二区三区免费在线观看| 免费高清在线视频一区·| 午夜久久福利| 亚洲一区二区三区午夜| 亚洲国产综合在线| 亚洲第一福利社区| 国内揄拍国内精品少妇国语| 国产九九精品| 亚洲精品免费网站| 性欧美激情精品| 午夜伦理片一区| 国产精品久久久久久久7电影| 欧美日韩1区2区| 国产精品va在线播放| 欧美视频日韩视频在线观看| 欧美视频专区一二在线观看| 国产精品高清在线| 国产日韩欧美黄色| 在线观看的日韩av| 亚洲精品久久久久久久久| 一本色道久久综合一区| 午夜欧美理论片| 暖暖成人免费视频| 亚洲精品在线一区二区| 亚洲欧美日韩爽爽影院| 久久久亚洲一区| 欧美视频在线一区二区三区| 国产亚洲观看| 一本色道久久综合亚洲精品不| 亚洲欧美一区二区视频| 麻豆国产精品777777在线| 欧美电影在线观看| 国产欧美精品日韩| 亚洲精品日韩精品| 欧美伊人久久久久久久久影院| 欧美jizz19性欧美| 亚洲欧美日韩在线观看a三区| 男女视频一区二区| 国产一二精品视频| 亚洲综合视频网| 亚洲美女精品一区| 免费成人av在线| 国产欧美一区二区精品性| 亚洲狼人精品一区二区三区| 久久久www成人免费无遮挡大片| 亚洲二区在线观看| 久久久噜噜噜久久人人看| 国产精品有限公司| 亚洲一区二区三区午夜| 亚洲美女在线一区| 欧美日韩精品一二三区| 亚洲一区一卡| 欧美日韩网站| 国产精品成人一区二区三区夜夜夜| 亚洲国产日韩欧美| 欧美成人一区二区三区片免费| 欧美亚洲色图校园春色| 国产一区二区0| 欧美freesex8一10精品| 久久在线视频| 一区二区三区.www| 亚洲一区二三| 韩日成人av| 亚洲人成精品久久久久| 欧美全黄视频| 香蕉成人久久| 久久影音先锋| 午夜精品免费| 蜜桃av一区二区| 在线视频亚洲欧美| 久久av老司机精品网站导航| 亚洲国产精品成人综合色在线婷婷| 亚洲国产天堂久久综合网| 国产精品久久久久久久免费软件 | 欧美日韩免费精品| 亚洲欧美卡通另类91av| 久久久久国产一区二区三区| 99国产精品久久久久久久| 亚洲深夜激情| 亚洲精品一区二区三区在线观看 | 欧美体内she精视频| 久久亚洲不卡| 国产精品入口福利| 日韩午夜电影| 一区二区三区免费看| 另类尿喷潮videofree| 欧美在线一二三四区| 国产精品久久久久久久久久尿| 亚洲第一毛片| 亚洲精品免费网站| 欧美高清不卡| 在线观看一区欧美| 久久精品首页| 久久午夜影视| 亚洲韩国日本中文字幕| 久久尤物视频| 欧美成人精品在线| 亚洲第一黄网| 欧美乱人伦中文字幕在线| 亚洲欧洲另类| 一区二区三区精品视频在线观看 | 久久国产精品99国产| 久久精品亚洲一区| 亚洲第一精品久久忘忧草社区| 久久日韩粉嫩一区二区三区| 欧美波霸影院| 亚洲视频欧洲视频| 国产精品一二一区| 久久久蜜臀国产一区二区| 亚洲成人在线免费| 久久国产精品一区二区三区四区 | 亚洲视频观看| 乱人伦精品视频在线观看| 日韩视频免费在线观看| 国产精品福利在线| 久久亚洲精品网站| 亚洲欧美日韩一区| 91久久精品国产91久久性色tv | 亚洲在线观看视频| 亚洲国产日韩在线一区模特| 欧美日韩亚洲综合一区| 久久久999精品免费| 亚洲视频香蕉人妖| 伊人久久大香线| 欧美性做爰毛片| 午夜精品福利在线| 国产一区二区三区在线免费观看 | 亚洲无线视频| 91久久精品国产91久久性色tv| 久久精品久久99精品久久| 亚洲一本视频| 亚洲男女自偷自拍| 一区二区三区欧美亚洲| 日韩视频免费看| 一本色道久久| 在线视频精品一区| 亚洲综合色网站|