将ISO C++类暴露给C#

Sti*_*MAN 14 c# c++ mono pinvoke c++-cli

我需要向C#公开一些C++类(我在Linux上构建,使用单声道,所以COM不是一个选项)

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

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

我有以下问题:

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

Ree*_*sey 8

您不能使用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.

  • 我同意@Justin的看法,Mono的CXXI更适合两个世界之间的互操作,因为它不需要奇怪的C++语言扩展. (2认同)