我们正在考虑为一些使用托管 C++ 的遗留 C++ 库编写一个 .Net 可调用包装器。
这一切看起来都很容易。我们有什么需要注意的吗?
我发现在 C++/CLI 中包装一些现有的 C++ 库通常很容易,并且遇到的陷阱相对较少。我记得的有:
它非常简单并且运行良好。它比 PInvoke 容易得多。
您需要注意的一件大事是在您的托管标头中没有任何非托管成员,包括私有成员、方法签名等。虽然私有成员是指向托管类型的指针是可以的,只需使用前向声明为您的类。
另外,请注意对象的生命周期。很容易引入内存泄漏,因为许多 .NET 程序员不习惯自己清理。如果您创建的任何包装类包含指针,请确保它们是一次性的,并确保您在托管代码中处置它们。托管 C++ 中 IDisposable 的语法也很奇怪,但它在文档中。
另外,请记住,每次跨越托管/非托管边界时都会受到轻微影响,因此请尝试相应地规划您的界面。如果任何东西在循环中被重复调用,最好将该循环移动到边界上,这样你只穿过一次。除非您正在谈论数百万个电话,否则请不要太担心这一点。
这篇文章是相反的,但它有一些有用的观点。
使用我们的 ManWrap 库在本机 C++ 代码中充分利用 .NET
也可以看看
只是我们遇到的一些问题:
我将添加到每个人已经说过的内容,
pin_ptr wch = PtrToStringChars(字符串);(其中字符串是 System::String)
会成为你的朋友。
您不能直接将非托管类包含到托管类中,但您可以将指向非托管类的指针放在构造函数中并将其新建并在析构函数中将其删除。
我没有遇到 Timo Geusch 提到的在一个 DLL 中混合 C++ 和 C++/CLI 代码的问题。我的 DLL 广泛使用这两种方法都没有问题。
C++/CLI 并不难(如果您了解 C++ 和 .NET)并且效果很好。
正如其他人所说:98%的时间它只是工作,可调试且快速。
到目前为止,我遇到的超出了提到的范围:
它甚至工作得非常好,以至于我开始编写 C++/CLI 代码来对 C++ 代码运行单元测试。NUnit/Resharper 很乐意在 C++/CLI DLL 中找到并运行单元测试,它可以在任何级别直接调用您的本机代码,甚至可以测试您的模板容器类。