.net - 是否有可用于 .NET 的完整 user32.dll 包装器库?

标签 .net windows winapi pinvoke

我目前正在通过 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

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

  1. Declare语法是为了保持与 VB 6 做事方式的向后兼容性。官方 .NET 方式(通常用于 C#)是使用 <DllImport>属性,并且由于您正在编写针对 .NET Framework 的全新代码,因此您应该强烈考虑使用官方语法。这里的另一个好处是您的代码对于使用 C# 的人来说会更加熟悉,并且他们将能够更好地帮助您进行声明。您在网上找到的示例很可能是以这种方式编写的,而不是使用遗留的 VB 6 样式语法。

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

另见 this question解决类似问题。

关于.net - 是否有可用于 .NET 的完整 user32.dll 包装器库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572349/

相关文章:

c# - 我如何知道 ComboBox 中的值何时为 "re-selected"?

c# - 如何在 VS2008(自动属性)中使用 "short style"属性设置默认值?

c - OCIObjectGetAttr 和 OCIObjectSetAttr 的 LNK2091 错误

c# - 为什么我在 RestSharp 中的初始调用真的很慢?但其他人之后非常快

.net - 是否有用于 .NET 的 XSLT 2.0 库?

windows - Windows 服务中带有 Autofac 的 NHibernate session 处理程序

windows - 与 Windows dir 命令相比,为什么运行 opendir、readdir、stat 这么慢?

c++ - 如何在 C++ 中模拟指定的键盘击键?

c - 如何在 C 中打印 ListView

c++ - MFT 的大小与 MFT 的解析