将ISO C ++类暴露给C#
我需要向C#公开一些C ++类(我在Linux上构建,使用mono,因此COM不是一个选项)
到目前为止我收集的证据表明,解决这个问题的最佳方法是:
- 在ISO C ++类周围编写一个包装器C ++ .Net类
- 从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; };
我希望这有助于此