将ISO C ++类暴露给C#

我需要向C#公开一些C ++类(我在Linux上构建,使用mono,因此COM不是一个选项)

到目前为止我收集的证据表明,解决这个问题的最佳方法是:

  1. 在ISO C ++类周围编写一个包装器C ++ .Net类
  2. 从C#中使用C ++ .Net类

我有以下问题:

  • 首先,这是实现将C ++类暴露给C#的目标的“最佳”方式吗?
  • 到目前为止,我还没有看到任何实际显示如何执行此操作的示例 – 任何人都可以建议一些链接,或者代码片段来显示如何为虚拟类完成此操作?
  • 如何从C ++代码向C#代码发送异步消息通知? 理想情况下,我想使C#类引发事件,并将接收到的数据作为参数

您不能使用Mono在Linux上执行C ++ /。NET类。 Mono不支持托管C ++或C ++ / CLI,因此无法“围绕ISO C ++类编写包装C ++ .Net类”。

您最好的选择是为您的C ++类生成一个C API,可以通过Platform Invoke访问它。

话虽这么说,缓解这个问题的一个选择是使用SWIG为你生成包装器。 它支持从C ++类生成C#包装器(以及其他语言的包装器),并且在Linux / Mono上运行良好。


编辑:

对于官方“Mono不支持混合模式C ++ / CLI”,请参阅语言页面 :

重要的是要注意,任何编译为纯IL的语言都应该在Mono下工作。 某些语言(如Microsoft的托管C ++)并不总是编译为纯IL,因此它们并不总是按预期工作,因为它们不是真正独立于平台的。

用于本机互操作的C ++ / CLI需要非纯IL,因此它不适用于Mono。

Mono最近在CXXI中发挥了C ++互操作性的一些相当大的进步(发音性感)。

从这篇文章中可以看出,新的CXXI技术允许C#/ .NET开发人员:

  • 从C#或任何其他.NET语言轻松使用现有的C ++类
  • 从C#实例化C ++对象
  • 从C#代码调用C ++类中的C ++方法
  • 从C#代码调用C ++内联方法(假设您的库使用-fkeep-inline-functions编译或者您提供了代理库)
  • 来自C#的子类C ++类
  • 使用C#方法覆盖C ++方法
  • 将C ++类或混合C ++ / C#类的实例暴露给C#代码和C ++,就好像它们是本机代码一样。

CXXI是Google Summer of Code两个夏季工作的结果,旨在提高Mono与C ++语言的互操作性。

你必须像这样在你的iso c ++类周围写一个c ++托管包装器

public ref class MyWrapper { public: MyWrapper (void) { pObj = new CMyUnmanagedClass(); } ~MyWrapper (void) { delete pObj; } int foo(void) { //pass through to the unmanaged object return pObj->foo(); } private: CMyUnmanagedClass* pObj; }; 

我希望这有助于此