在C#应用程序中使用C ++类DLL
我有一个非托pipe的C ++ DLL,它只是导出一个类(不是COM …它只是一个简单的C ++类)作为它的接口。 我想在C#中使用这个类,但被告知它不能被导入到C#中。
在我的C#应用程序中使用这个类的正确方法是什么?
假设类Foo的简单方法:
- 创build一个C ++ / CLI项目,调用这个FooWrapper。
- 使FooWrapper依赖于非托pipe的DLL(但通常会)。
- 创build一个托pipe类ManagedFoo,其中包含一个types为Foo *的私有实例字段。
- 在ManagedFoo中提供公共包装函数,将其转发到基础实例字段。
- 可选(虽然推荐):
- 将.net成语(string等)的参数转换成C ++习语(std :: string或char *)
- 捕获非托pipe的exception,并抛出托pipe的exception
然后,你让你的C#代码依赖于FooWrapper项目/ DLL,并确保非托pipeII与它正确部署,如何完成取决于非托pipe的DLL,但在同一目录通常是足够的。
如果函数不依赖类的实例,那么更简单的是P / Invoke
这个答案对于单个类库来说可能是过分的,但是SWIG对于“包装”C / C ++类来使用其他语言来说是一个很好的解决scheme。 它适用于C#。
DllImport是你最好的select。 有一些数据types按摩,特别是如果你通过结构,但你几乎可以做任何事情。
您需要一个代理(GoF模式)中介来桥接托pipe/非托pipe边界。
两个选项:
- 一个C ++ / CLI包装器
- 一个COM包装器。
前者会更直接,后者有两个纯粹的C ++ – > COM – > .NET。
有时候,提供你自己的C接口更容易。 SWIG是不平凡的设置。 我使用托pipe的C + +和C + + / CLI,他们很好。 最简单的就是做一个C封装器(因为大多数方法都可以调用C函数,所以可以用于任何其他语言)。