是否有完整的user32.dll包装程序库可用于.NET?

时间:2010-12-31 21:19:50

标签: .net windows winapi pinvoke

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

我在谷歌搜索,但我遇到的唯一有用的网站是pinvoke.net。虽然它确实包含某种程度的信息,但是在其文档中有许多功能要么没有描述,要么有很多“TODO”部分。

因此,我想知道是否有适用于.NET的user32.dll的完整包装器。我无法找到任何我害怕,但也许我看起来不正确。

5 个答案:

答案 0 :(得分:5)

用于.NET Framework的user32.dll的完整包装器将毫无意义。 user32.dll导出的绝大多数函数都具有.NET Framework本机实现的相应函数。实际上,整个.NET Framework只是Windows API的包装器,包括user32.dll。

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

如果您确定所需的特定功能具有本机等效功能,那么您是否应该考虑P /调用Windows API。在这种情况下,由于您已经大大缩小了必须导入的函数数量,因此使用MSDN文档pinvoke.net和Stack的组合确定函数签名应该只需要很少的工作量。溢出。我说自己编写这段代码的好处(现在你已经将你需要的东西减少到一个更易于管理的大小)是你几乎需要阅读文档并准确理解它是如何工作的。如果您依赖其他人编写的代码,则无法保证其编写正确,遵循最佳实践,实现任何错误处理,甚至您了解其工作原理以及如何使用它。

最后,我建议即使在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#中使用)使用<DllImport>属性,并且由于您正在编写面向.NET Framework的全新代码,因此您应该强烈考虑使用官方语法。这里的另一个好处是,使用C#的人会更熟悉您的代码,他们将能够更好地帮助您完成声明。您在网上找到的样本最有可能以这种方式编写,而不是使用传统的VB 6样式语法。

  2. 有时,Declare语法有一些意外行为。例如,某些类型的编组方式与标准<DllImport>语法的编组方式不同。对于那些更熟悉标准.NET行为的人来说,这可能会让人感到困惑。

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

答案 1 :(得分:2)

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

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

enter image description here

答案 2 :(得分:1)

有几种自动P/Invoke signature generators可以帮助您。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我希望以下网址能为您提供帮助。

http://mwinapi.sourceforge.net/