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

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

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

假设类Foo的简单方法:

  1. 创build一个C ++ / CLI项目,调用这个FooWrapper。
  2. 使FooWrapper依赖于非托pipe的DLL(但通常会)。
  3. 创build一个托pipe类ManagedFoo,其中包含一个types为Foo *的私有实例字段。
  4. 在ManagedFoo中提供公共包装函数,将其转发到基础实例字段。
  5. 可选(虽然推荐):
    • 将.net成语(string等)的参数转换成C ++习语(std :: string或char *)
    • 捕获非托pipe的exception,并抛出托pipe的exception

然后,你让你的C#代码依赖于FooWrapper项目/ DLL,并确保非托pipeII与它正确部署,如何完成取决于非托pipe的DLL,但在同一目录通常是足够的。

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

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

http://www.swig.org/

DllImport是你最好的select。 有一些数据types按摩,特别是如果你通过结构,但你几乎可以做任何事情。

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

两个选项:

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

前者会更直接,后者有两个纯粹的C ++ – > COM – > .NET。

有时候,提供你自己的C接口更容易。 SWIG是不平凡的设置。 我使用托pipe的C + +和C + + / CLI,他们很好。 最简单的就是做一个C封装器(因为大多数方法都可以调用C函数,所以可以用于任何其他语言)。