pim*_*vdb 7 .net windows pinvoke winapi
我正在通过VB.NET对user32.dll进行大量的互操作.由于user32.dll不是在.NET级别,而是在本机级别,我需要使用Declare语句声明这些函数.虽然这很好用,但我一遍又一遍地声明它们.
我在谷歌搜索,但我遇到的唯一有用的网站是pinvoke.net.虽然它确实包含某种程度的信息,但是在其文档中有许多功能要么没有描述,要么有很多"TODO"部分.
因此,我想知道是否有可用于.NET的user32.dll的完整包装器.我一直无法找到任何我害怕,但也许我看起来不正确.
用于.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 Overflow 的组合来确定函数签名应该是最少量的工作.我说自己编写这段代码的好处(现在你已经将你需要的东西减少到一个更易于管理的大小)是你几乎需要阅读文档并准确理解它是如何工作的.如果您依赖其他人编写的代码,则无法保证其编写正确,遵循最佳实践,实现任何错误处理,甚至您了解其工作原理以及如何使用它.
最后,我建议即使在VB.NET中,也可以使用标准C#语法进行P/Invoking函数,而不是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
Run Code Online (Sandbox Code Playgroud)
有几个原因我认为这是更可取的:
该Declare语法是保持向后兼容做事的VB 6路兼容性的尝试.官方的.NET方式(通常在C#中使用)正在使用该<DllImport>属性,并且由于您正在编写面向.NET Framework的全新代码,因此您应该强烈考虑使用官方语法.这里的另一个好处是,使用C#的人会更熟悉您的代码,他们将能够更好地帮助您完成声明.您在网上找到的样本最有可能以这种方式编写,而不是使用传统的VB 6样式语法.
有时,Declare语法有一些意想不到的行为.例如,某些类型的编组方式与标准<DllImport>语法的编组方式不同.对于那些更熟悉标准.NET行为的人来说,这可能会让人感到困惑.
另请参阅此问题以解决类似问题.