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

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://m.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>
              欧美喷潮久久久xxxxx| 一区二区日韩精品| 亚洲视频综合在线| 亚洲人线精品午夜| 久久国产主播精品| 欧美影院在线| 国产精品高潮呻吟久久| 亚洲国产乱码最新视频| 精品av久久707| 欧美一区二区高清| 欧美一区二区三区日韩| 欧美新色视频| 亚洲少妇最新在线视频| 日韩亚洲欧美中文三级| 欧美成年视频| 亚洲第一精品电影| 亚洲国产第一页| 麻豆精品一区二区综合av| 久久久久久穴| 黄色成人在线免费| 久久aⅴ国产紧身牛仔裤| 久久精品主播| 韩国v欧美v日本v亚洲v| 久久精品免费电影| 久久综合久久久| 亚洲国产第一| 欧美国产激情| 一本色道久久综合狠狠躁篇的优点| 日韩午夜高潮| 欧美精品1区| 亚洲六月丁香色婷婷综合久久| 日韩一二在线观看| 欧美日韩在线视频一区| 在线一区二区三区四区| 香港久久久电影| 国模私拍视频一区| 美女在线一区二区| 亚洲精品一区二区三区蜜桃久| aⅴ色国产欧美| 国产精品国产三级国产专播精品人 | 在线观看日韩av| 久久综合九色综合网站| 亚洲国产精品女人久久久| 日韩视频不卡| 国产女优一区| 久久一区二区三区国产精品 | 久久综合给合久久狠狠狠97色69| 精品成人一区二区| 欧美激情综合五月色丁香| 亚洲素人在线| 免费不卡视频| 亚洲性图久久| 狠狠色丁香婷综合久久| 欧美成人中文字幕| 亚洲砖区区免费| 欧美黑人国产人伦爽爽爽| 中日韩视频在线观看| 国产热re99久久6国产精品| 老司机免费视频一区二区三区| 亚洲日本欧美| 久久aⅴ国产紧身牛仔裤| 亚洲国产精品专区久久| 国产精品九九| 美日韩精品视频免费看| 亚洲一区二区三区免费视频| 欧美激情视频一区二区三区在线播放 | 国产伪娘ts一区| 欧美精品免费在线| 欧美一区二区三区在线播放| 亚洲日本欧美日韩高观看| 久久久久久久尹人综合网亚洲| 日韩视频国产视频| 国产自产2019最新不卡| 欧美日韩午夜剧场| 久久亚洲精品一区二区| 亚洲欧美精品伊人久久| 亚洲级视频在线观看免费1级| 香蕉久久夜色精品国产使用方法| 亚洲国产三级网| 国产日韩欧美精品| 欧美日韩精品一区二区在线播放 | 欧美午夜精品理论片a级按摩| 久久综合成人精品亚洲另类欧美| 亚洲一区二区黄色| 亚洲伦理自拍| 亚洲国产视频一区二区| 久久亚洲视频| 久久精品视频亚洲| 亚洲自拍偷拍色片视频| 亚洲精品日本| 亚洲日韩欧美视频一区| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品三级久久久久久电影| 欧美激情免费在线| 嫩草伊人久久精品少妇av杨幂| 久久国产精品久久w女人spa| 亚洲欧美日韩一区| 亚洲已满18点击进入久久| 一区二区三区欧美| 99精品视频免费观看视频| 亚洲日本欧美| 亚洲精品一区二区三区蜜桃久 | 欧美午夜寂寞影院| 欧美日韩ab| 欧美日韩中文在线| 欧美日韩福利| 欧美视频二区| 国产精品v欧美精品∨日韩| 欧美区一区二区三区| 欧美精品免费播放| 欧美日韩国产成人| 欧美色图首页| 国产精品影音先锋| 国产视频观看一区| 黄色av日韩| 亚洲高清av| 日韩午夜免费视频| 亚洲四色影视在线观看| 亚洲欧美中文日韩在线| 久久国产精品网站| 久久一区二区三区超碰国产精品| 麻豆成人综合网| 亚洲第一在线综合网站| 亚洲精品少妇30p| 亚洲一区欧美一区| 久久本道综合色狠狠五月| 久久久www成人免费无遮挡大片| 久久亚洲一区二区三区四区| 欧美99久久| 国产精品久久久久av| 国产女主播视频一区二区| 在线成人av网站| 一区二区欧美精品| 欧美一区二区精品久久911| 美女性感视频久久久| 亚洲欧洲视频| 午夜国产精品视频| 麻豆精品传媒视频| 欧美日韩一区二区三区四区在线观看| 国产精品久久一区二区三区| 国产一区二区三区奇米久涩| 最近中文字幕日韩精品 | 麻豆精品在线视频| 99精品视频免费观看| 欧美综合第一页| 欧美巨乳波霸| 韩国一区二区三区在线观看 | 亚洲激情不卡| 亚洲欧美资源在线| 欧美国产日韩精品| 国内久久精品| 亚洲欧美成人| 亚洲高清在线观看一区| 亚洲欧美日韩一区二区三区在线| 麻豆91精品91久久久的内涵| 国产精品久久久久久五月尺| 亚洲国产欧美国产综合一区| 亚洲欧美日本国产有色| 欧美激情精品久久久久久大尺度| 亚洲夜晚福利在线观看| 欧美α欧美αv大片| 国产一区二区三区免费观看| 一区二区三区欧美| 免费在线看一区| 午夜在线播放视频欧美| 欧美日韩不卡合集视频| 亚洲第一色在线| 久久久久欧美精品| 亚洲欧洲在线免费| 久久噜噜亚洲综合| 国产亚洲欧美日韩在线一区| 亚洲午夜一区二区三区| 欧美激情一区| 久久中文字幕一区二区三区| 国产偷自视频区视频一区二区| 亚洲无毛电影| 91久久极品少妇xxxxⅹ软件| 久久影音先锋| 黄色成人在线网址| 久久久久**毛片大全| 亚洲欧美日韩国产一区二区三区| 欧美视频中文一区二区三区在线观看| 亚洲人www| 欧美激情亚洲一区| 免费成人高清视频| 亚洲激情影院| 亚洲成人资源网| 农夫在线精品视频免费观看| 在线看一区二区| 免费不卡在线观看| 久久亚洲一区| 亚洲精品久久久久中文字幕欢迎你 | 欧美在线1区| 亚洲在线播放电影| 国产精品日韩欧美大师| 欧美一级理论性理论a| 亚洲欧美日韩国产精品| 国产偷国产偷精品高清尤物| 久久国产直播| 久久久www|