每次我看到调用 kernel32.dll 或 User32.dll 的代码时,即使在 MSDN 上,代码片段也总是要求开发人员将任何所需的常量(例如 WM_SETREDRAW = 11)硬编码到例程中。既然这些常量从不改变定义并且总是有一个标准定义,为什么 .net 不在某个地方提供它们呢?我觉得我们最终都会根据需要创建自己的常量库和标准 Windows dll 调用。这种重复工作似乎是浪费并且容易出错。
也许我看的不够仔细,他们都在某个地方,如果可以,有人可以提供他们的位置吗?
我认为只有.Net团队才能提供实际答案,我们只能做出假设。
可能有很多原因。以下是一些猜测:
IntPtr
,这不是 .Net 的处理方式(例如,您应该使用 FileStream 而不是CreateFile
// ReadFile
/ WriteFile
)CloseHandle
Environment.NewLine
例如 ( A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.
) 的原因。所以添加整个 Win32 API 是没有意义的。Microsoft 在 namespace 中添加了一些特定于 Windows 的类Microsoft.Win32
,但它非常有限,并且这些功能是必不可少的(注册表操作、文件对话框......)。
关于 pinvoke.net,我不会过分依赖它。我经常看到写得不好的方法声明会在 x64 系统上崩溃(int
而不是IntPtr
结构布局问题......)。另一个例子:WriteFile
方法声明不一致。SafeHandle
与IntPtr
...等。
原因不止一个,还有很多。我可以想到以下任何一项在决定不包括它们的过程中发挥了作用:
您可以使用Pinvoke 互操作助手工具。它提供的声明是从 Windows SDK 标头自动生成的。
.NET 被设计成一个完整的生态系统。放入 Windows API 是一种 hack,不包括常量是 Microsoft 阻止它的方式。