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

时间:2010-06-30 14:58:41

标签: c# c++ c++-cli pinvoke interop

在寻找C#和C ++之间互操作的方法的过程中,我发现这个article解释了P / Invoke。

我读了很多文章声称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#代码,有没有办法这样做?

4 个答案:

答案 0 :(得分:19)

我不建议将C ++库重写为C ++ / CLI。相反,我会编写一个可以从C#调用的C ++ / CLI包装器。这将包含一些public ref class类,每个类可能只管理本机类的实例。您的C ++ / CLI包装器只是“包含标头,链接到lib”以使用本机库。因为您已经编写了public ref class个类,所以您的C#代码只会添加一个.NET引用。而你在每个公共引用类中所做的只是使用C ++ Interop(又名It Just Works interop)来调用本机代码。如果你愿意的话,你可以在外观时使用外观。

答案 1 :(得分:5)

C ++ / CLI语法很笨拙,但它确实允许您从C ++代码公开托管对象。如果您拥有大型C ++ API并且可以将某些功能抽象为更简单的接口以供托管代码使用,那么这将非常方便。我已经成功完成了与Matrox视觉库等工具的集成,在那里我可以用C ++编写视觉分析代码,然后使用C ++ / CLI扩展来公开高级托管类。最痛苦的部分可能是字符串和数组交互操作,但字符串总是很痛苦,即使在普通的C ++中也是如此。

C ++ / CLI绝对可以使用任何.NET托管对象,但如果你使用任何指向托管内存的指针,你必须特别小心(在这种情况下你需要使用固定。)如果我需要通过指向API的指针,我通常更喜欢保持内存不受管理,然后创建托管包装类来操作非托管内存。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

将C ++本机类(作为实现的指针)包装到C ++ / CLI类中,然后调用&通过在.net应用程序中“使用”它们来使用这些基于CLR的类。这是我推荐的方式。不要在C ++ / CLI中重写现有的类。