我正在通过VB.NET对user32.dll进行大量的互操作。 由于user32.dll不是在.NET级别,而是在本机级别,我需要使用Declare语句声明这些函数。虽然这很好用,但我一遍又一遍地声明它们。
我在谷歌搜索,但我遇到的唯一有用的网站是pinvoke.net。虽然它确实包含某种程度的信息,但是在其文档中有许多功能要么没有描述,要么有很多“TODO”部分。
因此,我想知道是否有适用于.NET的user32.dll的完整包装器。我无法找到任何我害怕,但也许我看起来不正确。
答案 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
有几个原因让我认为这是更可取的:
Declare
语法试图保持与VB 6做事方式的向后兼容性。官方的.NET方式(通常在C#中使用)使用<DllImport>
属性,并且由于您正在编写面向.NET Framework的全新代码,因此您应该强烈考虑使用官方语法。这里的另一个好处是,使用C#的人会更熟悉您的代码,他们将能够更好地帮助您完成声明。您在网上找到的样本最有可能以这种方式编写,而不是使用传统的VB 6样式语法。
有时,Declare
语法有一些意外行为。例如,某些类型的编组方式与标准<DllImport>
语法的编组方式不同。对于那些更熟悉标准.NET行为的人来说,这可能会让人感到困惑。
另请参阅this question解决类似问题。
答案 1 :(得分:2)
Vanara Project 实现了几乎所有的 Win32 Windows api。它可以在 github 上或作为 nuget 包获得。开发人员对问题和请求的反应非常迅速。
user32.dll 也完全可用。只需调用 Visual Studio 包管理器并引用 Vanara.PInvoke.User32
答案 2 :(得分:1)
有几种自动P/Invoke signature generators可以帮助您。
答案 3 :(得分:1)
我实际上只是使用名为Managed Windows API的预构建包装器。它没有一切,但它有大多数东西。当与PInvoke.net Visual Studio Add-in结合使用时,您应该有一种非常自动的方法来处理这个问题。
答案 4 :(得分:0)
我希望以下网址能为您提供帮助。