【问题标题】:Is there a tool that generates P/Invoke signatures for arbitrary unmanaged DLL?是否有为任意非托管 DLL 生成 P/Invoke 签名的工具?
【发布时间】:2011-09-13 06:17:03
【问题描述】:

我偶然发现了一个为 Microsoft 自己的非托管 DLL 生成 P/Invoke 签名的工具:PInvoke Interop Assistant

是否有类似的工具可以为第三方非托管 DLL 生成 P/Invoke 签名?

或者,以任何方式将第三方 DLL 提供给 PInvoke Interop Assistant

编辑:Actual issue 我正在尝试解决

【问题讨论】:

  • 通常,您需要输入头文件,因为 DLL 导出表没有签名信息(C++ 损坏的名称除外,但 P/Invoke 无论如何都无法处理大多数 C++ 签名)。你有函数声明的头文件吗?
  • 为什么说助手只针对微软的dll?它应该支持任何 C/C++ 文件。
  • 任何承诺无故障 pinvoke 签名的工具都是在向您推销蛇油。由于 Windows 标头中的 SAL 注释,PInvoke Interop Assistant 运行良好。这在你的身上是不可用的。最好的工具是你耳朵之间的那个。所以。
  • @Hans Passant:如果我要在自己的东西中添加 SAL 注释,那么 P/Invoke 签名的下一步是什么?
  • 您可以在 PIA 的一部分上运行 sigimp.exe 工具。我想,我自己从来没有尝试过。如果您知道如何正确执行 SAL,那么您也应该可以轻松编写自己的 [DllImport] 声明。

标签: c# .net pinvoke unmanaged function-signature


【解决方案1】:

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

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

【讨论】:

  • @GregC:我很感激。是那些对我投反对票的人,我希望得到一些解释。
  • 我猜反对票与引用它是通过谷歌找到的有关。当然,它可能不会增加答案的价值,但答案本身非常有用,所以我个人选择投票代替。
  • 无法下载此软件。有替代品吗?
  • @LuigiSaggese:Microsoft C++/CLI 编译器肯定仍然可用。
  • @LuigiSaggese:我要指出的是,您询问的替代方案已经在我的回答中进行了描述,并且在您发表评论之前已经整整七年了。也许您的评论没有说出您的实际意思?
【解决方案2】:

我通过使用 UI 中标记为“SigImp Translate Snippet”的第三个选项卡将PInvoke Interop Assistant 用于非托管 DLL。只需将标题复制并粘贴到“Native Code Snippet”窗口中,然后按 Generate(或打开 Auto Generate)。作为说明,这里有一些来自question of mine 的代码。请注意,由于某些原因,错误不会出现在错误面板中,而是在生成的代码顶部显示为 cmets。

正如一些人已经说过的,生成的代码应该用作指导 - 您可能必须进行更改才能得到您想要的。

【讨论】:

  • 链接失效
【解决方案3】:

这个项目很活跃,看起来很有希望:https://github.com/mono/CppSharp

【讨论】:

  • 嘿,这是开发,我需要可执行工具。
【解决方案4】:

您可以使用xInterop C++ .NET Bridge with .NET to Native C++ Bridge 为任何本机 DLL 创建 C# 包装器,包括 C 样式的 DLL 导出函数和 C++ DLL 导出类。它可用于免费评估,但有一些限制。

免责声明:我是xInterop C++ .NET Bridge的作者。

【讨论】:

  • 网站上的下载链接显示“找不到文件”
  • 链接好像失效了。
  • 你好 xInterop。我有一个带有本机 DLL 和标头的相机的 C API。对于我的 WPF 项目,我需要将大约 20 个函数转换为 C#。我通过 PInvoke 尝试过,但超过一半对我来说很难。有机会看看吗?
【解决方案5】:

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

【讨论】:

  • CppSharp 生成的代码至少可以在 .NET Core 2 上使用。您必须拥有 .NET Framework 或 Mono 才能运行代码生成器。
  • 使用这些工具比使用 PInvoke 更复杂。为什么没有工具作为输入输出方式。
  • @GNZ 当你必须覆盖一个巨大的 api 时,手工操作可能不是一个有趣的选择。例如,Silk.Net 人员使用工具来自动创建绑定,涵盖了大量本机 API。没有免费的发射。一切简单的东西都会有局限性,通常更多的功能通常意味着更多的复杂性。选择你的毒药并乐在其中。
【解决方案6】:

使用VS SDK自带的Dumpbin.exe, Dumpbin,您仍然需要从转储的数据中手动编写 pinvoke 签名

【讨论】:

  • Dumpbin 的输出不包含类型信息,因为在导出为 extern "C" 的函数的二进制文件中不存在此信息。 C++ 导出使用 Dumpbin 可以解构的修饰名称导出。不过,这不是这个问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2012-03-24
相关资源
最近更新 更多