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

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

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


一 混合類

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

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


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

二 實(shí)例

 高手的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;
    }

}
;

測試實(shí)例之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;                
            }

    }
;
}


測試實(shí)例之C#調(diào)用文件:
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的書
今年才出版。  回復(fù)  更多評論   

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

嗯,很有用。  回復(fù)  更多評論   

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

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

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 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| 久久久蜜桃精品| 国产一二三精品| 亚洲欧美三级伦理| 久久蜜桃资源一区二区老牛| 国产一区二区三区精品久久久 | 99av国产精品欲麻豆| 亚洲国产精品电影在线观看| 免费观看日韩av| 亚洲一区图片| 日韩亚洲国产欧美| 欧美色区777第一页| 中文久久乱码一区二区| 欧美日韩美女| 欧美了一区在线观看| 欧美电影美腿模特1979在线看| 欧美中在线观看| 久久疯狂做爰流白浆xx| 午夜精品久久久久久久久久久久久 | 国产精品久久九九| 欧美三级免费| 国产精品视频久久| 亚洲精品乱码久久久久久蜜桃麻豆 | 美女999久久久精品视频| 伊人久久大香线蕉av超碰演员| 亚洲精品女人| 欧美在线一二三四区| 国内精品久久久久久久果冻传媒| 亚洲大胆视频| 久久久久成人精品| 久久香蕉国产线看观看网| 欧美日韩免费观看一区| 蜜桃av一区二区在线观看| 国产精品影院在线观看| 欧美精品播放| 久久久久综合| 欧美激情aaaa| 女人色偷偷aa久久天堂| 国产日韩欧美在线视频观看| 久久久久久高潮国产精品视| 久久亚洲不卡| 亚洲三级影片| 亚洲第一精品夜夜躁人人躁| 噜噜爱69成人精品| 嫩草成人www欧美| 国产精品海角社区在线观看| 日韩视频在线免费观看| 欧美一区永久视频免费观看| 欧美三级不卡| 欧美一级视频一区二区| 久久视频一区| 亚洲精品1234| 久久本道综合色狠狠五月| 一本色道久久综合亚洲精品高清| 国产精品v亚洲精品v日韩精品| 久久精品国产在热久久| 欧美视频国产精品| 日韩一级黄色av| 欧美大片在线看| 久久精品免费看| 激情文学一区| 老妇喷水一区二区三区| 久久精品国产第一区二区三区| 国产精品久久久久久久久久免费| 欧美精品成人91久久久久久久| 亚洲国产一区二区a毛片| 女生裸体视频一区二区三区| 久久国产一区二区三区| 精品91在线| 欧美日韩岛国| 免费视频久久| 亚洲精品在线观看免费| 欧美在线播放一区| 久久av最新网址| 一区二区三区欧美在线| 国产精品永久在线| 激情综合电影网| 国产精品久久77777| 蜜臀久久99精品久久久久久9 | 久久久人成影片一区二区三区| 国内揄拍国内精品久久| 国产精品免费区二区三区观看| 欧美性猛交视频| 国产精品美女久久久久久久| 久久久久9999亚洲精品| 欧美激情网站在线观看| 国产视频在线观看一区二区| 亚洲欧美国内爽妇网| 一本久道久久综合中文字幕| 欧美国产综合视频| 宅男66日本亚洲欧美视频| 一区二区91| 狠狠色综合网| 亚洲精品久久久久久久久久久久| 欧美成人免费一级人片100| 亚洲美女在线视频| 午夜精品99久久免费| 一区免费视频| av成人免费观看| 狠狠色综合一区二区| 亚洲国产日日夜夜| 国产精品一区二区视频| 久久综合网络一区二区| 欧美日韩福利视频| 狂野欧美激情性xxxx| 国产精品高清网站| 欧美第一黄网免费网站| 一区在线免费观看| 久久久久久久一区| avtt综合网| 午夜精品久久| 欧美激情一区二区三级高清视频| 国产三级欧美三级| 亚洲视频一二三| 99视频日韩| 性欧美大战久久久久久久免费观看| 欧美丝袜第一区| 亚洲美洲欧洲综合国产一区| 亚洲国产日韩欧美| 欧美日韩不卡合集视频| 伊人久久综合97精品| 欧美一区二区三区免费观看视频| 欧美顶级艳妇交换群宴| 久久久久国产精品一区| 久久免费视频观看| 亚洲电影免费观看高清完整版在线| 国产九九精品视频| 欧美激情按摩在线| 欧美在线视频全部完| 亚洲一区二区视频| 日韩视频在线免费| 欧美电影打屁股sp| 欧美v日韩v国产v| 久久影院亚洲| 久久精品视频免费观看| 午夜日韩在线观看| 香蕉av777xxx色综合一区| 亚洲小视频在线观看| 亚洲美女在线国产| 亚洲精品字幕| 亚洲免费电影在线| 99国产精品久久久| 一本一道久久综合狠狠老精东影业| 91久久亚洲| 亚洲精品欧美激情| 亚洲麻豆一区| 亚洲美女视频网| 99精品视频免费观看| 在线视频欧美日韩精品| 亚洲五月婷婷| 欧美一区国产二区| 久久精品国产77777蜜臀| 久久久久久久高潮| 牛牛国产精品| 亚洲国产一区二区a毛片| 亚洲破处大片| 亚洲午夜精品| 欧美在线视频二区| 久久综合激情| 欧美日韩成人综合在线一区二区| 国产精品劲爆视频| 国产日韩在线亚洲字幕中文| 精品成人国产| 一本大道久久a久久综合婷婷| 亚洲自拍偷拍视频| 久久久国产成人精品| 欧美成人一区二区| av不卡在线观看| 欧美在线观看一区二区| 噜噜噜噜噜久久久久久91 | 国产精品一区二区你懂得 | 午夜精品免费| 美女免费视频一区| 欧美视频一区在线观看| 国产一区二区三区电影在线观看| 亚洲国产高潮在线观看| 亚洲一区二区三区涩| 美女精品在线观看| 夜夜爽夜夜爽精品视频| 久久av一区二区| 欧美日韩免费高清| 曰韩精品一区二区| 亚洲中无吗在线| 欧美成人免费网站| 亚洲女爱视频在线| 欧美国产日韩一区二区三区| 国产欧美在线视频| 一本色道久久| 女仆av观看一区| 午夜精品99久久免费| 欧美久久久久久蜜桃| 国内自拍亚洲| 午夜电影亚洲| 亚洲理伦电影| 美日韩精品视频免费看| 国产麻豆日韩欧美久久| 一个人看的www久久| 免费在线亚洲欧美| 在线观看欧美激情| 久久精品视频播放|