有没有一种工具可以为任意非托管DLL生成P/Invoke签名?

43

1
通常情况下,您需要提供一个头文件,因为DLL导出表没有签名信息(除了C++的名称重载,但P/Invoke无法处理大多数C++签名)。您是否有包含函数声明的头文件? - Ben Voigt
1
你为什么说助手只支持微软的dll?它应该支持任何C/C++文件。 - Simon Mourier
9
任何承诺无痛调用Pinvoke的工具都是在卖弄伎俩。PInvoke互操作助手运作相当良好,这得益于Windows头文件中的SAL注释。但这不会适用于你的情况。最好的工具就是你自己的大脑以及Stack Overflow。 - Hans Passant
2
你可以在PIA的一部分上运行sigimp.exe工具。我想,我自己从来没有尝试过。如果你知道如何正确地使用SAL,那么编写自己的[ DllImport ]声明也不应该有问题。 - Hans Passant
1
最近新增了使用新代码生成器的功能 https://github.com/microsoft/CsWin32 - Karel Frajták
显示剩余3条评论
7个回答

48

谷歌很快就找到了 http://www.pinvoker.com (Wayback) (兼容性列为VS2005、2008和2010;似乎没有更新以适用于更新的版本)

Microsoft的C++/CLI编译器也可以做到这一点,如果您使用/clr:safe#include头文件,它将生成p/invoke代码,您可以使用例如ILSpy(免费)或Red Gate Reflector(曾经是免费的)提取。


1
无法再下载此软件。有其他替代方案吗? - Luigi Saggese
@LuigiSaggese:微软的C++/CLI编译器确实仍然可用。 - Ben Voigt
1
@BenVoigt 我只想报告一下答案的第一部分已经过时了(在7年后这很正常)。 - Luigi Saggese
1
.NET是跨平台的,而C++/CLI仅限于Windows,因此这个工具对于很多现代的.NET来说并不好用。 - trampster
在请求后,他们发送了一封电子邮件,内容为“无法找到所请求软件的下载链接。”因此,请重新生成链接。 - GNZ
显示剩余2条评论

17
我使用PInvoke Interop Assistant来使用UI中的第三个选项卡“SigImp Translate Snippet”处理非托管DLL。只需将头文件复制并粘贴到“Native Code Snippet”窗口中,然后按Generate(或打开Auto Generate)即可。这里是我的问题中的一些示例代码。请注意,由于某种原因错误不会出现在错误面板中,而是作为注释出现在生成的代码顶部。

正如几位用户所说,生成的代码应该用作指南-您可能需要进行更改以获得所需结果。

enter image description here


链接已失效。 - GNZ
2
@GNZ GitHub的链接有效。 - R.J. Dunnill

10

嘿,这是开发,我需要可执行工具。 - GNZ
似乎只是C#。 - R.J. Dunnill

4

1
网站上的下载链接显示“文件未找到”。 - Artyom Sokolov
看起来链接现在已经失效了。 - iheartcsharp
你好,xInterop。我有一个带有本地DLL和头文件的相机C API。我需要将其中约20个函数翻译成C#以供我的WPF项目使用。我尝试了PInvoke,但超过一半的函数对我来说都很困难。您能否帮忙看一下吗? - GNZ

4

另一种选择是SharpGenTools。它被SharpDX用于“自动”创建directx api的绑定。 还有CppSharp, 它被QtSharp用于生成与本地C++/C库的绑定。到目前为止,CppSharp仅与.Net Framework 6+兼容。


1
CppSharp生成的代码可以在.NET Core 2上使用。但是,您必须拥有.NET Framework或Mono才能运行代码生成器。 - Dan Lewi Harkestad
使用这些工具比使用PInvoke更加复杂。为什么没有像输入输出那样的工具呢? - GNZ
@GNZ 当你需要覆盖大量API时,手动操作可能不是一个有趣的选择。例如,Silk.Net的开发人员使用工具自动创建绑定来覆盖大量本地API。没有免费的午餐。任何简单的东西都会有限制,通常更多的功能意味着更复杂。选择你的方式并快乐地使用它。 - Francisco Neto

1

我使用ClangSharpPInvokeGenerator命令行开源工具来完成这个任务。

作为输入,它需要一组C头文件。也支持C++文件,不过我没有测试过C++。


-4
使用随附于VS SDK的Dumpbin.exe,Dumpbin,您仍需要手动从转储数据中编写PInvoke签名。

2
Dumpbin的输出不包含类型信息,因为对于以extern "C"导出的函数,这些信息在二进制文件中不存在。C++导出使用装饰名称导出,Dumpbin可以解码。但这仍然不是这个问题的答案。 - IInspectable

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