一 混合类
所谓混合类是指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类:

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++文件:


#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.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.cppblog.com/Files/mzty/MixedNativeAndCLITest.rar
- Python-S9-Day99——Web前端框架之Vue.js
01课程安排 02let和const: 03 箭头函数 04 对象的单体模式 05 Node.js介绍和npm操作 06 Webpack,babel介绍和Vue的第一个案例 01课程安排 1.1 ht ...
- c++面试须知
这些都是从zhihu上看到的. 指针,多态(虚函数表.内存layout),作用域,内存的管理 算法与数据结构,数据结构上由掌握哈希.优先级队列,算法上有字符串处理,简单的DFS.BFS.动态规划 系统 ...
- [HNOI2014][bzoj3572] 世界树 [虚树+dp]
题面: 传送门 思路: 一道虚树的好题,是很多虚树博客的入门题目 但是我认为这道题目出的难点和亮点不在于虚树,而在于建出虚树以后dp的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...
- BZOJ2396 神奇的矩阵 【随机化 + 矩乘】
题目链接 BZOJ2396 题解 一种快速判断两个矩阵是否相等的方法: 对于两个\(n * n\)矩阵,两边同时乘一个\(n * 1\)的随机矩阵,如果结果相等,那么有很大概率两个矩阵相等 如果左边是 ...
- Codeforces Round #364 (Div. 2) C 二分处理+求区间不同字符的个数 尺取法
C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- 在react当中巧用扩展运算符
...props可以把没有写到的属性补充完整 ...style 可以把style 属性在styles当中展开
- 贪吃蛇(bzoj 4213)
Description 最近lwher迷上了贪吃蛇游戏,在玩了几天却从未占满全地图的情况下,他不得不承认自己是一个弱菜,只能改去开发一款更弱的贪吃蛇游戏. 在开发的过程中,lwher脑洞大开,搞了一 ...
- 后缀数组基本问题QAQ
以下题目均来自罗穗骞的论文... No.1最长公共前缀 最长公共前缀: 题目: 给定一个字符串,询问某两个后缀的最长公共前缀. 分析: 某两个后缀的最长公共前缀就是区间height最小值,转化为RMQ ...
- BZOJ【1606】购买干草
1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 859 Solved: 63 ...
- [LeetCode] Add Two Numbers 链表
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...