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

pro*_*eek 12 c# c++ pinvoke interop c++-cli

在找到C#和C++之间的互操作方法的过程中,我发现这篇文章解释了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#代码,有没有办法这样做?

Kat*_*ory 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.通常没有必要修改现有的C++代码. (4认同)

Dan*_*ant 5

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

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