将ISO C ++类暴露给C#

时间:2010-04-07 20:42:01

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

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

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

  1. 围绕ISO C ++类编写一个包装器C ++ .Net类
  2. 使用C#
  3. 中的C ++ .Net类

    我有以下问题:

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

3 个答案:

答案 0 :(得分: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”,请参阅Languages page

  

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

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

答案 1 :(得分:3)

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

From this posting,简短的故事是新的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 ++语言的互操作性。

答案 2 :(得分:0)

你必须在你的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;
    };

我希望这有帮助 问候

相关问题