如何将 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++/CLI - C++ Windows 窗体应用程序中的本机和托管线程