我们正在考虑使用托管C ++为一些遗留C ++库编写.Net可调用包装器。
一切看起来都很简单。有什么我们需要注意的吗?
答案 0 :(得分:6)
我发现在C ++ / CLI中包装一些现有的C ++库通常很容易,并且遇到了相对较少的陷阱。我记得的是:
答案 1 :(得分:2)
这很简单,效果很好。它比PInvoke容易得多。
您需要注意的重要事项是您的托管标头中没有任何非托管成员,包括私有成员,方法签名等。但是,私有成员可以指向托管类型,只需使用向前你的课程的声明。
另外,请注意对象的生命周期。由于许多.NET程序员不习惯自行清理,因此很容易引入内存泄漏。如果它们包含指针,请确保您创建的任何包装类都是一次性的,并确保将它们放在托管代码中。托管C ++中IDisposable的语法也很奇怪,但它在文档中。
另外,请记住每次跨越托管/非托管边界时都会受到轻微打击,因此请尝试相应地规划界面。如果在循环中重复调用任何东西,最好将该循环移过边界,这样你只能跨越一次。除非你在谈论数以百万计的电话,否则不要过于担心。
本文采用另一种方式,但它有一些有用的点。
Use Our ManWrap Library to Get the Best of .NET in Native C++ Code
另见
Managed Code in Visual Studio 2005和
Deleting Managed Objects, Wrapping a Library, and More
答案 2 :(得分:1)
我们遇到的一些问题:
答案 3 :(得分:1)
我只想补充每个人已经说过的话,
pin_ptr wch = PtrToStringChars(string); (其中string是System :: String)
将成为你的朋友。
您不能直接将非托管类包含到托管类中,但是您可以将指针放到非托管类中,并在构造函数中将其新建,并在析构函数中将其删除。
我没有遇到Timo Geusch在一个DLL中混合C ++和C ++ / CLI代码时提到的问题。我的DLL广泛使用而没有问题。
C ++ / CLI并不困难(如果您了解C ++和.NET)并且效果很好。
答案 4 :(得分:1)
正如其他人所说:98%的时间它只是工作,它的可调试性和快速性。
到目前为止,我所遇到的情况:
它甚至运行良好,我开始编写C ++ / CLI代码来运行C ++代码的单元测试。 NUnit / Resharper将很高兴地在C ++ / CLI DLL中找到并运行单元测试,它可以直接调用任意级别的本机代码,甚至可以测试模板容器类。