我是一位经验丰富的.Net程序员,但在我的生活中没有编译过C / C ++程序。现在我有这个C-dll,标题和文档(第三方,而不是来自Win API),我需要从中调用十种方法。
我在考虑使用Platform Invoke。我发现这三个工具可以为我创建代码:
可能
Pinvoker似乎与Interop助手和向导有一些不同的方法。 Swig我刚刚检查时发现这个问题没有在这里被问到。
这些工具的优点和缺点是什么?
鉴于我对C / C ++不太了解,生成P / Invoke代码的最佳=最简单,最安全的方法是什么?
答案 0 :(得分:4)
有关互操作示例,请参阅http://dotnetperls.com/dllimport-interop,有关详细信息,请参阅此MSDN article。这篇文章的圣经是Adam Nathan's book。
基本上,您需要识别要调用的DLL中的函数。这些需要用extern标记,以使外部世界可以访问它们。下一步,可能会变得棘手的是为函数编写DllImport。这需要在托管和非托管世界之间进行映射。您将需要弄清楚如何将任何复杂的数据结构从C dll编组到托管代码中。
您应该检查DLL是否有任何类型的COM接口。确保你真的需要先使用P / Invoke。
SWIG最初用于包装C / C ++代码以供脚本语言使用。它从接口描述生成C#代码(参见tutorial)。如果P / Invoke是一个选项,我建议不要在C#中使用它。
答案 1 :(得分:2)
如果函数的签名很简单,则设置需要10分钟 - 即如果它们需要2个char *并返回一个int。它只有一次变得复杂而变得混乱
pinvoke上的圣经是Adam Nathans - .NET and COM: The Complete Interoperability Guide
我同意其他海报 - swig不是正确的事情