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

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 夢在天涯 閱讀(10634) 評論(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

導航

統(tǒng)計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1817752
  • 排名 - 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>
              亚洲午夜视频在线| 久久综合久久综合九色| 在线色欧美三级视频| 欧美日韩免费观看一区=区三区| 久久亚洲春色中文字幕| 亚洲性夜色噜噜噜7777| 亚洲高清视频的网址| 国产在线精品自拍| 国产精品swag| 欧美绝品在线观看成人午夜影视| 日韩视频在线永久播放| 欧美黑人在线播放| 久久看片网站| 久久激情综合网| 亚洲女人av| 亚洲桃色在线一区| 一区二区日韩精品| 国产毛片一区二区| 久久久精品999| 欧美在线视频在线播放完整版免费观看| 久久婷婷久久| 久久本道综合色狠狠五月| 亚洲素人在线| 亚洲天堂av图片| 国产日韩在线一区| 国产精品爽爽爽| 国产精品成人久久久久| 欧美日韩一区二区在线观看| 亚洲香蕉伊综合在人在线视看| 久久精品中文字幕免费mv| 午夜精彩视频在线观看不卡 | 亚洲欧美999| 99精品国产一区二区青青牛奶 | 久久野战av| 欧美在线电影| 欧美一区二区三区免费看| 在线观看亚洲视频| 黄色精品免费| 一区二区三区中文在线观看 | 国产在线高清精品| 欧美精品大片| 欧美精品电影在线| 欧美日韩大片| 欧美午夜在线一二页| 国产精品久久久久久久第一福利 | 国产精品久久久久aaaa樱花| 国产精品高潮呻吟久久av黑人| 久久精精品视频| 久久久久九九视频| 久久夜色精品国产| 蜜桃久久av一区| 欧美日韩精品不卡| 国产精品久久久| 国产精品一二三视频| 国产亚洲精品久久久久动| 黑人一区二区| 亚洲精选中文字幕| 伊人婷婷久久| 亚洲激情视频在线播放| 一本综合久久| 性欧美精品高清| 久久久久欧美精品| 欧美激情在线狂野欧美精品| 日韩视频中文| 亚洲欧美在线视频观看| 久久―日本道色综合久久| 欧美美女操人视频| 国产欧美精品日韩区二区麻豆天美| 欧美国产精品日韩| 国产精品毛片大码女人| 国内精品视频在线观看| 国产精品综合av一区二区国产馆| 欧美日韩亚洲天堂| 国产日韩精品一区观看| 亚洲黄色视屏| 午夜在线成人av| 久久只有精品| aa日韩免费精品视频一| 久久激情婷婷| 欧美三级日韩三级国产三级| 国模精品一区二区三区色天香| 国产热re99久久6国产精品| 国产精品久久久久毛片软件 | 亚洲午夜精品网| 久久久精品免费视频| 欧美日韩四区| 亚洲第一页中文字幕| 亚洲制服av| 欧美黑人一区二区三区| 亚洲欧美中文字幕| 欧美人与性动交cc0o| 国语自产精品视频在线看一大j8| 国产一区二区三区自拍| 一区二区三区精品视频在线观看| 亚洲天堂免费观看| 亚洲女性裸体视频| 亚洲夫妻自拍| 亚洲免费综合| 欧美日韩综合一区| 亚洲人永久免费| 可以看av的网站久久看| 亚洲综合国产激情另类一区| 欧美福利视频在线| 亚洲国产精彩中文乱码av在线播放| 91久久精品国产91久久性色tv| 亚洲国产精品久久久久婷婷884| 亚洲三级色网| 久久综合九色九九| 亚洲一本视频| 欧美日韩在线第一页| 亚洲国产欧美久久| 久久精品亚洲乱码伦伦中文| 一区二区三区色| 亚洲欧美在线免费| 国产精品hd| 一区二区欧美在线| 亚洲国产高清一区二区三区| 欧美在线综合视频| 国产欧美日韩视频一区二区三区| 亚洲第一天堂av| 久久综合免费视频影院| 羞羞色国产精品| 久久综合色综合88| 国产综合久久| 久久久久.com| 欧美综合二区| 国产在线精品自拍| 久久久久久久999| 欧美一级大片在线观看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 欧美区在线播放| 91久久亚洲| 午夜精品久久久久影视| 在线一区视频| 国产精品黄色| 欧美夜福利tv在线| 亚洲欧美一区二区原创| 国产日韩精品电影| 久久久久在线观看| 久久久人人人| 亚洲国产片色| 亚洲激情欧美激情| 欧美女人交a| 中文精品一区二区三区| 一区二区三区 在线观看视频| 久久精品人人爽| 欧美视频一区二区在线观看| 亚洲一区二区伦理| 亚洲视频香蕉人妖| 国产精品一区二区三区免费观看| 亚洲人人精品| 99re成人精品视频| 国产乱肥老妇国产一区二| 久久电影一区| 老司机精品久久| 亚洲美女视频在线观看| 夜色激情一区二区| 欧美成人在线网站| 亚洲视频网在线直播| 欧美高清视频| 欧美在线免费观看亚洲| **性色生活片久久毛片| 亚洲激情视频在线| 国产精品一二三四| 亚洲免费网址| 久久国内精品视频| 亚洲裸体视频| 亚洲综合另类| 亚洲欧洲日本专区| 亚洲免费在线观看| 亚洲欧洲一区二区三区久久| 一本色道久久综合亚洲91| 国产一区导航| 亚洲三级影院| 国产日韩欧美高清免费| 亚洲国产日韩欧美在线图片| 国产精品男人爽免费视频1| 久久亚洲国产精品日日av夜夜| 亚洲欧美久久| 亚洲国产欧美日韩精品| 亚洲午夜视频在线| 91久久久久久| 亚洲欧美日韩精品久久奇米色影视| 国产精品久久国产精品99gif| 亚洲视频一起| 开元免费观看欧美电视剧网站| 精品盗摄一区二区三区| 日韩午夜精品视频| 一区二区三区在线看| 亚洲视频1区| 亚洲精品久久久久久久久久久久久| 亚洲大黄网站| 国产欧美日韩三区| 99re国产精品| 亚洲欧洲综合| 久久精品一区中文字幕| 亚洲免费在线观看| 亚洲欧美在线x视频| 99热免费精品| 久久中文精品|