C++和C#的互操作性:P/Invoke与C++/CLI

问题描述:

在找到一种在C#和C++之间互操作的方法的过程中,我发现这个解释关于P/Invoke的articleC++和C#的互操作性:P/Invoke与C++/CLI

我读了很多文章,声称C++/CLI不是精确的C++,并且需要一些努力才能从原始C++代码进行修改。

我想问一下当我想从C#对象中使用一些C++对象(代码/数据)时,最佳的方式是什么。

  • 看起来像为了使用P/Invoke,我应该提供C风格的API。这是真的吗?我的意思是,有没有办法将C++对象导出到C#中,例如带有P/Invoke的SWIG?或者,我是否必须为此使用SWIG?
  • 将C++更改为C++/CLI有多难?与将C++重写为C#相比,是否值得尝试? C++设计良好,因此将它实现到C#并不是什么大事。
  • (离题主题)有没有其他方法?我的意思是,如果我想使用C++中的C#代码,是否有任何方法可以这样做?

我不会推荐将C++库重写到C++/CLI中。相反,我会编写一个可以从C#调用的C++/CLI包装器。这将包括一些public ref class类,每个类可能只是管理本地类的一个实例。您的C++/CLI包装只是“包含标题,链接到lib”以使用本地库。由于您已经编写了public ref class类,因此您的C#代码只是添加了.NET引用。而且你在每个公共ref类中做的所有事情都是使用C++ Interop(又名It Just Works互操作)来调用本地代码。如果你喜欢,你可以在门面上应用门面。

+4

+1。通常不需要修改现有的C++代码。 – 2010-06-30 15:04:08

除了Kate Gregory的回答,从C++调用C#代码,使用C++/CLI是明显的方法,因为它使它非常简单和无缝。

C++/CLI语法很尴尬,但它确实允许您从C++代码公开受管对象。如果你有一个大的C++ API,这可以很方便,并且可以将一些功能抽象为一个更简单的接口供托管代码使用。我已经喜欢Matrox视频库,在那里我可以写我的眼光分析代码在C++中,然后使用C++/CLI扩展揭露高层管理类工具,成功地做到了这一点进行整合。最痛苦的部分可能是字符串和数组的内部操作,但字符串一直很痛苦,即使在普通的C++中。 C++/CLI肯定可以使用任何.NET托管对象,但是如果您使用任何指向托管内存的指针,则必须格外小心(在这种情况下,您需要使用pinning)。如果我需要传递指向API的指针,我通常更愿意保持该内存不受管理,然后创建用于操纵非托管内存的托管包装类。

将您的C++ native类作为指向实现的指针包装到C++/CLI类中,然后通过在.NET应用程序中使用这些基于CLR的类来调用&。这是我推荐的方式。不要在C++/CLI中重写您现有的类。