如何将 C++ 本机对象编组到托管 C++ CLI

Posted

技术标签:

【中文标题】如何将 C++ 本机对象编组到托管 C++ CLI【英文标题】:How to Marshall C++ Native Objects to Managed C++ CLI 【发布时间】:2011-04-30 10:12:15 【问题描述】:

我有一堆原生 C++ 对象和类,其中包含 DTL 映射、映射映射和列表以及向量。

我需要从 C++ 本机代码调用托管 C++ 函数,并且需要将这些本机对象和 STL 容器(列表、地图、地图地图)传递给 C++/CLI。它需要编组或如何序列化这些对象。我怎样才能做到这一点没有任何问题。这样在编组和序列化回托管 C++/CLI 后,地图应该与字典和字典的字典、stl 列表和托管 List 等进行编组..

我怎样才能在所有情况下都做到这一点?是否需要复杂的编组问题处理...?

问候 乌斯曼

【问题讨论】:

【参考方案1】:

STL 内存布局是特定于实现的。例如。当您使用 Visual C++ 附带的实现时,sizeof(std::vector) 在发行版中为 16,在调试模式下为 20。而且您在 STL 类中有指针,这些指针无法有意义地编组到托管内存。如果您想进行封送处理,您可以在界面中切换到与平台无关的 C 或 COM 类型(例如,传递带有计数参数的数组或安全数组),因为 .Net 对这些类型有更好的理解。我推荐 COM,因为它有更丰富的类型,并且支持其他语言以备不时之需。

或者,如果您需要速度,您可以编写 marshal_as 模板函数来进行转换,这样您就可以重用封送代码甚至封送缓冲区,或 write a managed wrapper for your C++ objects。

如果要封送的数据太大而无法放入内存,您还可以将数据序列化到临时文件或数据库中,然后从托管代码中分块读取它们。

【讨论】:

以上是关于如何将 C++ 本机对象编组到托管 C++ CLI的主要内容,如果未能解决你的问题,请参考以下文章

当将一个类从 c# 编组到本机 c++ 时,它会克隆吗?

尝试从 C++/CLI 调用非托管 C++ 时解决错误

如何将本机 C++ 静态库链接到托管 C++ 程序集

如何将 cli::array 从本机代码转换为本机数组?

从 C++ dll 编组导出的字符串向量

在退出之前跟踪 - 并正确结束 - C# - C++/CLI - C++ Windows 窗体应用程序中的本机和托管线程