关于C++/CLI中的Interop问题的思考
2009-04-16 10:45
337 查看
[转载: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类对象来用。反之亦然。
在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类对象来用。反之亦然。
相关文章推荐
- 关于C/C++中全局变量的初始化问题的深入思考
- 关于c++中一些指针问题的思考
- 解决C++/CLI中关于“MissingManifestResourceException类型的未经处理的异常出现在mscorlib.dll”问题一例
- 二、关于C++版本的OpenTLD问题
- C++中关于时间的处理问题
- 思考问题的本质--关于vim Ctrl-]的一个小问题的思考
- c++中 关于字符串的一些需要注意的问题
- 问一个关于c++的问题
- 关于移动硬盘格式化问题的思考
- [置顶] 关于C++、C#实现EXCEL数据库批量导入数据库万行以上数据效率问题
- 关于图灵机器人访问网址中中文编码的问题(C++下 UrlEncode编码过程)
- C++关于文件流的初级问题解决
- 关于C++的一个栈空间被占用问题的总结
- 关于约瑟夫环的思考(一) c++
- C++关于函数声明和定义中参数赋值为0调用问题演示
- 关于C++现状的一些思考
- 关于C++的一些问题的整理
- VS2010C#调用C++ dll关于.Net版本问题
- C++面试中关于智能指针的问题
- 【编程题目】打印1到最大的n位数——关于大数问题的探讨(C++实现)