我有一个非托管的C ++ DLL,它只导出一个类(不是COM ......它只是一个简单的C ++类)作为它的接口。我想在C#中使用这个类,但我被告知它不能仅仅导入C#。
在我的C#应用程序中使用此类的正确方法是什么?
答案 0 :(得分:44)
假设类Foo的简单方法:
然后你使你的c#代码依赖于FooWrapper项目/ dll并确保非托管dll与它一起正确部署,如何完成取决于非托管dll,但在同一目录中通常就足够了。
如果函数不依赖于类的实例,则更简单的是P / Invoke
答案 1 :(得分:8)
对于单个类库,这个答案可能有点过分,但SWIG是一个很好的解决方案,用于“包装”C / C ++类以供其他语言使用。它适用于C#。
请参阅 http://www.swig.org/。
答案 2 :(得分:3)
DllImport是你最好的选择。有一些数据类型按摩,特别是如果你传递结构,但你几乎可以做任何事情。
答案 3 :(得分:2)
您需要一个代理(GoF模式)中介来桥接托管/非托管边界。
两个选项:
前者更直接,后者有两步纯C ++ - > COM - > .NET。
答案 4 :(得分:2)
有时,提供自己的C接口更容易。设置SWIG并非易事。我使用托管C ++和C ++ / CLI,他们很好。最简单的只是做一个C包装器(并且可以被任何其他语言使用,因为大多数人都有办法调用C函数)。