gpt4 book ai didi

.net - 遗留 C++ 库的托管 C++ 包装器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:53 26 4
gpt4 key购买 nike

我们正在考虑使用托管 C++ 为一些遗留 C++ 库编写 .Net 可调用包装器。

这一切看起来都很简单。有什么需要注意的吗?

最佳答案

我发现在 C++/CLI 中包装一些现有的 C++ 库通常很容易,并且遇到的陷阱相对较少。我记得的是:

  • 在同一个可执行文件/DLL 中混合非托管 C++ 代码和 C++/CLI 代码是一个非常糟糕的主意。我在关闭时遇到了竞争内存管理器的问题(基本上是.NET 运行时和常规 C++ 运行时,在关闭时清理内存时相互踩踏,导致不确定的行为哪一个释放了什么)。我没有将静态遗留 C++ 库链接到 C++/CLI 库,而是创建了一个包含遗留 C++ 的 DLL,并将其链接到 C++/CLI DLL,这一劳永逸地解决了问题。
  • 如果您的代码使用枚举,则必须将它们包装在适当的 C++/CLI 枚举类中,否则其他 .NET 语言将无法看到和使用它们。
  • C++/CLI 对象只能保存指向非托管 C++ 对象的指针。不幸的是,在某些情况下,这意味着您将不得不创建薄包装层来处理某些对象。我的“最爱”是我必须要么以这种方式包装 boost::shared_ptrs(并因此添加另一层间接),要么在跨越 .NET/native 边界后将它们放入带有空删除器的 shared_ptrs 中。当您必须处理大量使用这种构造的 API 时,两者都不是很好。 RAII 不会跨越这个边界,所以请注意,您将不得不投入一些时间来调整它以匹配 .NET 方式。
  • C++/CLI 不进行多重继承,因此如果您的遗留库正在使用它,您可能必须使用接口(interface)等对其进行建模。
  • 内部编码代码似乎能够处理大多数 POD 转换,但您将找到/借用转换 std::strings 等的代码。这段代码就在附近,谷歌上几分钟应该会出现它(抱歉,目前这里没有任何方便的链接)。

关于.net - 遗留 C++ 库的托管 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/425752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com