WEB开发网
开发学院软件开发VC Visual C++中删除托管对象、包装库及其他 阅读

Visual C++中删除托管对象、包装库及其他

 2008-11-12 19:26:24 来源:WEB开发网   
核心提示: 有了 ManagedNode 之后,剩下的工作就是包装 AllocateList 了,Visual C++中删除托管对象、包装库及其他(5),这个过程十分简单,首先,使基于 .NET 的语言可以访问它,在托管 C++ 中,调用 AllocateList 来分配本机列表,然后创建一个空的 A

有了 ManagedNode 之后,剩下的工作就是包装 AllocateList 了。这个过程十分简单。首先,调用 AllocateList 来分配本机列表,然后创建一个空的 ArrayList.接下来将所有 NativeNode 复制到 ManagedNode,并将它们添加到托管列表中,您在进行这些操作时会将它们删除。图 3 显示了完整的细节。托管 C++ 的好处之一就是所有代码看起来很简单、整洁,即使您处理的是混合对象。将本机 char* 复制到托管 String 只是一个简单的赋值,如以下的代码行所示:

   以下是引用片段:
  mn->str = nn->str; // String = char*: it just works!

不需要调用转换函数,编译器知道如何去做。CreateList 在运行时会删除本机节点。这比在最后删除节省存储空间。

通过将整个列表转换成托管对象(而不是通过 interop 和 StructLayout 将它导出),您可以为托管客户端营造一种托管环境。这叫入乡随俗!毕竟,一些程序员选择 .NET 的主要原因之一就是它具有自动垃圾回收的功能。如果您直接通过 interop 导出列表,您还必须导出 FreeList,并要求使用其他基于 .NET 语言的程序员要记得调用它。

一般情况下,如果您导出到托管环境,最好是将尽可能多的数据转换成托管对象。什么情况下例外呢?您的客户端也是采用 C++ 编写的。当然,这条规则并不总是适用。有时更好的方式是直接导出结构,并要求客户端释放它们 — 例如,如果复制对性能或内存造成的影响太大而不可接受,就需要这样做。您必须使用判断来决定是进入托管环境还是进入本机环境。

问:我正在使用 C++ 托管扩展来包装现有的 C++ 库,使基于 .NET 的语言可以访问它。在托管 C++ 中,我可以写为

   以下是引用片段:
  String* s = new String();
  s = _T("Hello, world");

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Visual 删除 托管

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接