我们正在考虑使用托管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边界后将它们放入带有null删除器的shared_ptrs中.当你必须处理那些使用这种结构的API时,两者都不是很好.RAII没有越过这个边界,所以要注意,你将不得不投入一些时间来调整它以匹配.NET方式.
C++/CLI不执行多重继承,因此如果您的旧库正在使用它,您可能必须使用接口等对此进行建模.
内部编组代码似乎能够处理大多数POD转换,但是您将找到/借用转换std :: strings等的代码.这段代码已经存在,Google上的几分钟应该提起它(抱歉,不要'此刻有任何方便的链接).