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

22
我是一名有经验的.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 Interop Assistant的镜像,以防Codeplex宕机:https://drive.google.com/file/d/0B_OGphRNB0qPcWU1QVFKLS1NeWs/view?usp=sharing - Samvel Avanesov
这个回答解决了你的问题吗?有没有一种工具可以为任意非托管 DLL 生成 P/Invoke 签名? - StayOnTarget
你可能想要编辑你的帖子,让其他人知道pinvoker链接目前被恶意行为者所拥有。 - undefined
2个回答

3
请参阅http://dotnetperls.com/dllimport-interop了解Interop示例,以及此MSDN文章了解更多信息。这方面的权威指南是Adam Nathan书籍
基本上,您需要确定要调用的DLL中的函数。这些需要使用extern标记,以使它们对外部世界可访问。下一步是编写函数的DllImport,这可能会变得棘手。这需要在托管和非托管世界之间进行映射。您需要找出如何将C dll中的任何复杂数据结构转换为托管代码。
您应该检查是否有任何类型的COM接口可用于DLL。首先确保您真的需要使用P/Invoke。

SWIG最初是用于将C/C++代码包装为脚本语言可用。它从接口描述生成C#代码(请参见tutorial)。如果可以使用P/Invoke,我不建议从C#中使用它。


不,没有COM接口。需要调用本地的C-dll。 - Ope

2

如果函数的签名很简单,那么设置应该只需要10分钟 - 也就是说,如果它们接受两个char *参数并返回int类型。只有当它们变得复杂时才会变得混乱。

关于PInvoke的参考书是Adam Nathans - .NET和COM:完整的互操作指南

我同意其他帖子中提到的观点 - SWIG不是合适的工具。


接口并不简单:输入和输出结构复杂。虽然不是超级复杂,但每次调用都有3-6个参数,其中一些是具有多个参数的结构体。因此,我真的希望能得到帮助生成代码。 - Ope
1
你能在这里发布函数签名吗?你可以对它们进行某种程度的混淆。 - Brian Lyttle
我需要检查一下。但是签名(以及相关的结构体)大约有100行。你是在说这些生成工具在根本上不好吗(如果是这样,为什么)?或者为什么我要逐行手动进行所有的插件和参数设置,而不是使用这些工具呢? - Ope
由于这些工具(swig)不适用于原始的C++头文件,而是使用您必须编写、维护和生成C++头文件和.cs文件的特殊语言中间文件。因此,与仅解析和转换原始C++头文件的工具相比,它并不自然,感觉笨拙。 - StuWeldon

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