【问题标题】:Is there a complete user32.dll wrapper library available for .NET?是否有可用于 .NET 的完整 user32.dll 包装库?
【发布时间】:2010-12-31 21:19:50
【问题描述】:

我目前正在通过 VB.NET 对 user32.dll 进行大量互操作。 由于 user32.dll 不在 .NET 级别,而是在本机级别,我需要使用 Declare 语句声明函数。虽然这很有效,但我会一遍又一遍地声明它们。

我在谷歌上搜索,但我发现唯一有用的网站是pinvoke.net。虽然它确实在一定程度上包含了信息,但有相当多的功能没有描述,或者在它的文档中有很多“TODO”部分。

因此,我想知道是否有可用于 .NET 的 user32.dll 的完整包装器。恐怕我找不到任何东西,但也许我看的不正确。

【问题讨论】:

    标签: .net windows winapi pinvoke


    【解决方案1】:

    .NET Framework 的 user32.dll 的 完整 包装器将毫无意义。 user32.dll 导出的绝大多数函数都有对应的函数,这些函数都是由 .NET Framework 原生实现的。事实上,整个 .NET Framework 只是 Windows API 的一个包装器,包括 user32.dll。

    如果有办法使用 .NET Framework 已提供的功能通过托管代码执行此操作,我建议您不要尝试从 user32.dll 执行 P/Invoke 函数。在尝试自己重新发明轮子之前,请先查看 MSDN 或您选择的方便的 .NET 参考指南。

    如果并且当您确定您需要的特定函数具有本机等价物时,那么您应该考虑 P/Invoking Windows API。在这种情况下,由于您已经大大减少了必须导入的函数的数量,因此使用 MSDN 文档pinvoke.net 和 Stack Overflow 的组合来确定函数签名应该只是最少量的工作。我想说自己编写此代码的好处(现在您已将所需内容缩减到更易于管理的大小)是您实际上需要阅读文档并准确了解其工作原理。如果您依赖其他人编写的代码,则无法保证其编写正确、遵循最佳实践、实现任何错误处理,甚至无法保证您了解它的工作原理和使用方法。

    最后,我建议即使在 VB.NET 中,您也对 P/Invoking 函数使用标准 C# 语法,而不是 Declare。例如:

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As MenuFlags, ByVal uIDNewItem As Int32, ByVal lpNewItem As String) As Boolean
    End Function
    

    我认为这是更可取的原因有几个:

    1. Declare 语法试图保持与 VB 6 处理方式的向后兼容性。官方的 .NET 方式(通常用于 C#)是使用 &lt;DllImport&gt; 属性,并且由于您正在编写针对 .NET Framework 的全新代码,因此您应该强烈考虑使用官方语法。这里的另一个好处是使用 C# 的人会更熟悉您的代码,并且他们将更有能力帮助您进行声明。您在网上找到的示例最有可能以这种方式编写,而不是使用传统的 VB 6 样式语法。

    2. 有时,Declare 语法会出现一些意外行为。例如,某些类型的编组方式与标准 &lt;DllImport&gt; 语法不同。对于更熟悉标准 .NET 行为的人来说,这可能会让人很困惑。

    另请参阅 this question 解决类似问题。

    【讨论】:

    • @Downvoter:想对我的回答中您认为不正确的部分发表评论吗?
    • 首先,感谢您的清晰解释。我明白你的意思,但并非所有 user32.dll 的函数都在 .NET Framework 中。我想我会继续创建自己的简单包装器,其中包含我最常使用的需要互操作的功能。但是,最后,我不明白为什么 DllImport 属性可能优于 Declare 语句。我想 VB.NET 有它单独的关键字 Declare 来处理这些事情,我认为这比你使用的符号更清晰。
    • @pimvdb:我了解 P/Invoke 某些功能的需要。我有一个大型包装库,用于处理低级系统挂钩等高级内容。我刚刚在您的问题中注意到您正在寻找一个 complete 包装器,考虑到 .NET Framework 已经在托管代码中为您实现了多少功能,我认为这将是一个错误。我已经更新了我的答案,其中有几个原因我推荐&lt;DllImport&gt; 而不是Declare
    • 我很抱歉不清楚,但基本上我正在寻找一种方法来防止我经常做的所有复制和粘贴。无论如何,你一直非常有帮助,非常感谢。
    【解决方案2】:

    Vanara Project 实现了几乎所有 Win32 Windows api。它可在 github 或作为 nuget 包获得。开发人员对问题和请求的反应非常迅速。

    user32.dll 也完全可用。只需调用 Visual Studio 包管理器并引用 Vanara.PInvoke.User32

    【讨论】:

      【解决方案3】:

      有几个自动P/Invoke signature generators 可以帮助你。

      【讨论】:

      • 我明白了,谢谢。我认为没有简单的包装 DLL 是对的吗?
      • 至少我从未见过。可能它会变得相当 huge 并使您的应用程序变得不必要地大。我只知道 mshtml 包装器大约为 7MB,并且仅适用于一个应用程序。另一个原因可能是不同的操作系统在 user32.dll 中有不同的(子)函数集。
      【解决方案4】:

      我实际上只是使用名为Managed Windows API 的预构建包装器。它没有一切,但它拥有大多数东西。当与PInvoke.net Visual Studio Add-in 一起使用时,您应该有一种非常自动化的方式来处理这个问题。

      【讨论】:

        【解决方案5】:

        希望以下网址对您有所帮助。

        http://mwinapi.sourceforge.net/

        【讨论】:

          猜你喜欢
          • 2011-03-11
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 2012-09-19
          • 2020-07-21
          相关资源
          最近更新 更多