【发布时间】:2010-10-08 20:23:03
【问题描述】:
我有一个非托管 C++ DLL,它仅导出一个类(不是 COM……它只是一个简单的 C++ 类)作为其接口。我想在 C# 中使用这个类,但被告知它不能仅仅导入到 C# 中。
在我的 C# 应用程序中使用此类的正确方法是什么?
【问题讨论】:
-
对不起,我应该更具体。这不是 COM 类。它只是一个普通的旧 C++ 类。
我有一个非托管 C++ DLL,它仅导出一个类(不是 COM……它只是一个简单的 C++ 类)作为其接口。我想在 C# 中使用这个类,但被告知它不能仅仅导入到 C# 中。
在我的 C# 应用程序中使用此类的正确方法是什么?
【问题讨论】:
假设类 Foo 的简单方法:
然后你让你的 c# 代码依赖于 FooWrapper 项目/dll 并确保非托管 dll 与它一起正确部署,如何完成取决于非托管 dll 但在同一目录中通常就足够了。
如果函数不依赖于类的实例,那么更简单的是 P/Invoke
【讨论】:
对于单个类库来说,这个答案可能有点过头了,但 SWIG 是一个很好的解决方案,可以“包装”C/C++ 类以供其他语言使用。它适用于 C#。
【讨论】:
DllImport 是您最好的选择。有一些数据类型按摩,尤其是在传递结构时,但你几乎可以用它做任何事情。
【讨论】:
您需要一个代理(GoF 模式)中介来桥接托管/非托管边界。
两种选择:
前者会更直接,后者有两个步骤纯C++ -> COM -> .NET。
【讨论】:
implib 为.NET 创建包装器。
有时,提供自己的 C 接口会更容易。 SWIG 的设置很重要。我使用了托管 C++ 和 C++/CLI,它们都很好。最简单的就是做一个 C 包装器(并且可以被任何其他语言使用,因为大多数语言都有调用 C 函数的方法)。
【讨论】: