生成P / Invoke代码的最简单方法是什么?

我是一位经验丰富的.Net程序员,但在我的生活中还没有编译过C / C ++程序。 现在我有这个C-dll,标题和文档(第三方,而不是Win API),我需要从中调用十种方法。

我在考虑使用Platform Invoke。 我发现这三个工具可以为我创建代码:

  • PInvoker: http ://www.pinvoker.com
  • P / Invoke Interop助手: http : //www.codeplex.com/clrinterop
  • P / Invoke向导: http : //www.paulyao.com/res/pinvoke/pinvoke.aspx

可能

  • Swig: http ://www.swig.org/

Pinvoker似乎与Interop助手和向导有一些不同的方法。 Swig我刚刚检查到这里没有问过这个问题。

这些工具的优缺点是什么?

鉴于我对C / C ++知之甚少,对我来说生成P / Invoke代码的最佳=最简单,最安全的方法是什么?

有关互操作示例,请参阅http://dotnetperls.com/dllimport-interop ,有关详细信息,请参阅此MSDN文章 。 这本书的圣经是Adam Nathan的 书 。

基本上,您需要识别要调用的DLL中的函数。 这些需要用extern标记,以使外部世界可以访问它们。 下一步,可能会变得棘手的是为函数编写DllImport。 这需要在托管和非托管世界之间进行映射。 您将需要弄清楚如何将任何复杂的数据结构从C dll编组到托管代码中。

您应该检查DLL是否有任何类型的COM接口。 确保你真的需要先使用P / Invoke。

SWIG最初用于包装C / C ++代码以供脚本语言使用。 它从接口描述生成C#代码(参见教程 )。 如果P / Invoke是一个选项,我建议不要在C#中使用它。

如果函数的签名很简单,那么设置需要10分钟 – 即如果它们需要2个char *并返回一个int。 它只有一次变得复杂而变得混乱

pinvoke上的圣经是Adam Nathans – .NET和COM:The Complete Interoperability Guide

我赞同其他海报 – swig不是正确的事情