关于C++/CLI中的Interop问题的思考
[转载:http://www.wangchao.net.cn/bbsdetail_49096.html]
在C++/CLI中如何让你的Managed Code和Unmanaged(Native) Code沟通自如?interior_ptr和pin_ptr是桥梁——interior_ptr充当一个Managed Heap上的Native Pointer的角色。而pin_ptr则可以把对象钉在Managed Heap上!
所以,pin_ptr允许把Managed世界里的东西带入Unmanaged(Native)世界。
而如果想反其道而行,即把Unmanaged(Native)世界里的东西带入Managed世界,则可以自己写一个ref/value class的wrapper(目前),以后微软打算允许Native Class在Managed Heap上创建,并且允许Ref Class在栈上创建(彼时ref class关键字是否还有存在的价值?),从而允许更为方便的交互。
但是这里的问题是,基本上这种交互都是处于“基本类型的数据”层次的交互。pin_ptr只能把基本类型钉在Managed Heap上,也就是说,你可以写:
pin_ptr<int> p = ...;
却不能写
pin_ptr<GC_Class> p = ...; //错误!
这是因为.NET的对象模型和Native C++的对象模型是不兼容的,即使可以把GC_Class的对象钉在GC堆上并返回其首地址,也不能把它作为一个Native Class类对象来用。反之亦然。