我目前正在通过 VB.NET 与 user32.dll 进行大量互操作。 由于 user32.dll 不是 .NET 级别而是 native 级别,因此我需要使用 Declare 语句声明函数。虽然这很好用,但我一遍又一遍地声明它们。
我在谷歌上四处搜索,但我遇到的唯一有用的网站是 pinvoke.net .虽然它确实包含了一定程度的信息,但有相当多的功能没有描述,或者在它的文档中有很多“TODO”部分。
因此,我想知道是否有可用于 .NET 的 user32.dll 的完整包装器。恐怕我找不到任何东西,但也许我没看对。
最佳答案
用于 .NET Framework 的 user32.dll 的完整 包装器将毫无意义。 user32.dll 导出的绝大多数函数都具有由 .NET Framework native 实现的相应函数。事实上,整个 .NET Framework 只是 Windows API 的包装器,包括 user32.dll。
如果可以使用 .NET Framework 已提供的功能通过托管代码执行此操作,我建议您不要尝试从 user32.dll 中 P/Invoke 函数。在尝试自己重新发明轮子之前,请先查看 MSDN 或您选择的方便的 .NET 引用指南。
如果并且当您确定您需要的特定功能不具有 native 等效项时,那么并且只有在那时您才应该考虑 P/调用 Windows API。在这种情况下,由于您已经大大减少了必须导入的函数数量,因此使用 MSDN 文档 pinvoke.net 的组合来确定函数签名应该只是最少量的工作。和堆栈溢出。我想说的是,您自己编写此代码的好处(现在您已经将需要的内容削减到更易于管理的大小)是您实际上需要阅读文档并准确理解它是如何工作的。如果您依赖其他人编写的代码,则无法保证其编写正确、遵循最佳实践、实现任何错误处理,甚至无法保证您了解其工作原理和使用方法。
最后,我建议即使在 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解决类似问题。
关于.net - 是否有可用于 .NET 的完整 user32.dll 包装器库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572349/