将C++ DLL自动包装成C#

6

我想在C#项目中使用C++库。是否有包装工具可以自动导入所有类?

3个回答

12

SWIG 可以帮助创建由两部分组成的包装器,一部分是 C++ 端,另一部分是 C# 端。
但是需要花费一些时间来设置正确的生成文件。

另一种比较需要手动编码的选择是 C++/CLI。

对于纯 c api,我更喜欢使用 p/invoke 而不是它们中的任何一个。有一个程序可以自动转换 c 头文件。如果我记得正确的话,它被称为 "P/Invoke Interop Assistant" 或者 "Interop Signature Toolkit"。

还有一个名为 mono/cxxi 的工具看起来很酷。


2
+1 给第一个回答 OP 问题的人。 - Nordic Mainframe

3
在.Net中使用本机.dll的过程称为P/Invoke。请参考http://pinvoke.net/了解一些示例。
请注意,您必须将构建目标与.dll版本匹配。因此,对于x86 .dll,您需要将项目锁定在x86上,对于x64也是如此。
请注意,您只需要锁定执行项目(.EXE),而不是从.EXE加载的任何其他项目。如果将它们设置为ANY,则.Net会自动将.Net .dll与CPU目标类型匹配。
来自http://social.msdn.microsoft.com/forums/en-US/clr/thread/c957959e-0f0c-422e-a5be-4ccfdd12e63d的附加注释:您可以使用“dumpbin /exports ”或依赖项查看器(depends.exe)查看导出的符号。它们都包含在Visual Studio中。
关于C++的额外评论:虽然使用从.Net调用C编写的本机.dll相对简单,但使用利用对象的C++二进制文件并不那么容易。解决这个问题的一种方法是使用C++ CLI项目,它是托管.Net代码和非托管C++库之间的绑定。

0
如果这是非托管代码,那么您可以使用P/Invoke。另一个可能性是使用C++/CLI扩展将代码编译成托管程序集,您可以直接使用它。

我想使用这个库http://code.google.com/p/asmlibrary/,它是托管程序集吗?如果不是,我该怎么办? - Baran
看起来是非托管代码。因此,您可以使用 DllImport 属性声明托管包装器,以便调用您想要调用的函数。 - Darin Dimitrov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接