在C#应用程序中使用C ++类DLL

时间:2009-02-20 13:44:56

标签: c# dll c++-cli unmanaged

我有一个非托管的C ++ DLL,它只导出一个类(不是COM ......它只是一个简单的C ++类)作为它的接口。我想在C#中使用这个类,但我被告知它不能仅仅导入C#。

在我的C#应用​​程序中使用此类的正确方法是什么?

5 个答案:

答案 0 :(得分:44)

假设类Foo的简单方法:

  1. 创建一个C ++ / CLI项目,调用此FooWrapper。
  2. 让FooWrapper依赖于非托管dll(不管你通常会这样)。
  3. 创建一个托管类ManagedFoo,其中包含一个类型为Foo *。
  4. 的私有实例字段
  5. 在ManagedFoo中提供公共包装函数,该函数转发到底层实例字段。
  6. 可选(尽管推荐):
    • 将.net惯用语(字符串等)中的参数转换为C ++习语(std :: string或char *)
    • 捕获非托管异常并抛出托管异常
  7. 然后你使你的c#代码依赖于FooWrapper项目/ dll并确保非托管dll与它一起正确部署,如何完成取决于非托管dll,但在同一目录中通常就足够了。

    如果函数不依赖于类的实例,则更简单的是P / Invoke

答案 1 :(得分:8)

对于单个类库,这个答案可能有点过分,但SWIG是一个很好的解决方案,用于“包装”C / C ++类以供其他语言使用。它适用于C#。

请参阅 http://www.swig.org/

答案 2 :(得分:3)

DllImport是你最好的选择。有一些数据类型按摩,特别是如果你传递结构,但你几乎可以做任何事情。

答案 3 :(得分:2)

您需要一个代理(GoF模式)中介来桥接托管/非托管边界。

两个选项:

  • C ++ / CLI包装器
  • COM包装器。

前者更直接,后者有两步纯C ++ - > COM - > .NET。

答案 4 :(得分:2)

有时,提供自己的C接口更容易。设置SWIG并非易事。我使用托管C ++和C ++ / CLI,他们很好。最简单的只是做一个C包装器(并且可以被任何其他语言使用,因为大多数人都有办法调用C函数)。