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

C++ Programmer's Cookbook

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

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


一 混合類

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

1)native的class中包含CLR對(duì)象,必須通過gcroot<>或auto_gcroot<>。
2)CLR中的class中包含native的對(duì)象,必須是指針,也可以使用高手寫的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;
    }

}
;

測(cè)試實(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;                
            }

    }
;
}


測(cè)試實(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://www.shnenglu.com/Files/mzty/MixedNativeAndCLITest.rar

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

評(píng)論

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

CAutoNativePtr類 好像出自一本講述c++/CLI的書
今年才出版。  回復(fù)  更多評(píng)論   

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

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

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

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

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816414
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 亚洲在线免费| 欧美激情一区在线| 香蕉精品999视频一区二区 | 激情综合在线| 一区二区高清在线| 免费不卡在线观看av| 亚洲网站在线| 欧美夫妇交换俱乐部在线观看| 国产午夜亚洲精品理论片色戒| 日韩视频在线观看免费| 久久亚洲国产精品一区二区| 一本一道久久综合狠狠老精东影业| 久久久久久午夜| 国产精品有限公司| 在线视频欧美精品| 欧美激情aaaa| 久久精品国产99精品国产亚洲性色| 欧美色另类天堂2015| 亚洲国产一区二区三区在线播| 久久国产精品99国产精| 亚洲精品视频在线| 免费观看成人www动漫视频| 国产亚洲在线| 午夜精品在线看| 亚洲精品国精品久久99热一| 欧美一区日韩一区| 国产精品资源| 亚洲免费综合| 日韩视频中文| 欧美精品免费在线| 91久久久国产精品| 免费在线欧美黄色| 久久精品首页| 韩日欧美一区二区| 久久久久久黄| 久久av一区二区三区漫画| 国产精品五月天| 亚洲欧美中文在线视频| 一本色道久久综合亚洲精品婷婷| 欧美激情一区二区三区高清视频| 亚洲高清不卡av| 男人插女人欧美| 久久精品亚洲精品国产欧美kt∨| 国产午夜亚洲精品理论片色戒| 欧美一区二区三区播放老司机 | 亚洲激情午夜| 亚洲黄页一区| 久久精品99无色码中文字幕| 国产精品麻豆成人av电影艾秋| 久久er精品视频| 久久久久久久91| 亚洲韩国精品一区| 亚洲免费激情| 国产欧美日韩视频一区二区三区| 久久久xxx| 免费亚洲一区二区| 国产精品99久久久久久久vr| 亚洲自拍偷拍福利| 精品动漫3d一区二区三区免费版 | 亚洲视频999| 国产亚洲精品久| 亚洲国产成人av好男人在线观看| 欧美日韩免费观看一区三区| 欧美影院久久久| 免费日韩精品中文字幕视频在线| 一区二区三区日韩欧美精品| 午夜日韩在线| 亚洲九九爱视频| 亚洲欧美日韩成人高清在线一区| 在线欧美亚洲| 中国成人在线视频| 影音先锋久久| 正在播放日韩| 亚洲国产小视频在线观看| 亚洲亚洲精品在线观看| 一区二区在线观看视频在线观看| 亚洲精品美女在线| 国产一区 二区 三区一级| 91久久精品国产91久久性色tv | 亚洲国产精品免费| 国产精品视频精品| 欧美激情在线观看| 国产欧美一区二区三区在线老狼 | 国产精品一二三视频| 欧美激情亚洲一区| 国产日韩在线一区二区三区| 亚洲黄色有码视频| 国产一区二区按摩在线观看| 亚洲精品视频啊美女在线直播| 国产一区二区三区奇米久涩| 日韩天堂在线视频| 亚洲第一精品夜夜躁人人爽| 亚洲网在线观看| 亚洲伦理久久| 久久久久九九九九| 香蕉成人伊视频在线观看| 欧美国产先锋| 蜜臀av一级做a爰片久久| 国产精品美女主播在线观看纯欲| 亚洲国产成人在线播放| 国产有码在线一区二区视频| 制服诱惑一区二区| 亚洲免费av电影| 久久久久久9| 久久av免费一区| 欧美午夜片欧美片在线观看| 亚洲国产精品美女| 在线观看久久av| 欧美一区二区视频网站| 亚洲综合大片69999| 欧美精品xxxxbbbb| 欧美成人精品不卡视频在线观看| 国产日韩一区二区三区在线| 在线性视频日韩欧美| 99国产精品久久久久久久久久| 鲁大师成人一区二区三区| 久久久久国产精品厨房| 国产精品一卡二| 一区二区三区高清| 在线视频精品一区| 欧美久久在线| 亚洲黄色毛片| 亚洲精品国产精品久久清纯直播 | 久久久久久久久一区二区| 国产精品老女人精品视频| 99天天综合性| 在线午夜精品| 欧美日韩精品一区二区三区| 亚洲国产成人在线播放| 亚洲黄色在线观看| 猛男gaygay欧美视频| 美女尤物久久精品| 在线观看日韩一区| 久久一区二区三区四区五区| 老色鬼精品视频在线观看播放| 国内成+人亚洲| 欧美在线观看视频一区二区三区 | 亚洲视频999| 亚洲欧美高清| 国产精品丝袜白浆摸在线| 国产精品99久久久久久有的能看| 亚洲一区二区日本| 国产精品大片wwwwww| 正在播放亚洲| 欧美一级成年大片在线观看| 国产精自产拍久久久久久| 亚洲自拍电影| 久久久久国色av免费观看性色| 国产一区二区福利| 久久久久久**毛片大全| 欧美www视频| 亚洲免费观看| 欧美日韩一区二区三区免费看| 9色国产精品| 欧美一级日韩一级| 国产一区二区精品丝袜| 久久久精品动漫| 欧美激情无毛| 亚洲性视频h| 国产欧美韩日| 久久久久久亚洲精品中文字幕| 欧美成人精品在线观看| 亚洲九九精品| 国产精品入口麻豆原神| 欧美有码视频| 亚洲福利视频二区| 亚洲视频在线观看一区| 国产精品综合久久久| 久久精品免费播放| 91久久精品一区二区别| 亚洲永久视频| 国模套图日韩精品一区二区| 免费av成人在线| 日韩视频免费在线| 久久精品国产第一区二区三区| 亚洲成人在线视频播放| 欧美日韩a区| 欧美一进一出视频| 亚洲电影在线看| 午夜精品999| 亚洲第一福利在线观看| 欧美日韩视频不卡| 欧美在线观看一区二区三区| 亚洲国产精品久久精品怡红院| 亚洲一区国产精品| 精品电影在线观看| 欧美手机在线| 久久视频在线免费观看| 一本色道**综合亚洲精品蜜桃冫| 久久久久久9| 亚洲一区二区三区高清| 激情久久中文字幕|