每当我看到代码调用kernel32.dll或User32.dll时,即使在MSDN上,代码片段也要求开发人员将任何所需的常量(例如WM_SETREDRAW = 11)硬编码到例程中。由于这些常量永远不会按定义更改并始终具有一个标准定义,为什么.net不能在某处提供它们?我觉得我们最终都会根据需要创建自己的常量库和标准的Windows dll调用。看起来这种重复工作是浪费的,容易出错。
也许我看起来不够努力而且他们都在某处,如果有的话,有人可以提供他们的位置吗?
答案 0 :(得分:2)
只有.Net团队可以提供我认为的实际答案,我们只能做出假设。
可能有很多原因。以下是一些猜测:
IntPtr
个对象),这不是.Net的处理方式(例如,你应该使用FileStream而不是CreateFile
/ { {1}} / ReadFile
/ WriteFile
)Environment.NewLine
(CloseHandle
)的原因。因此添加整个Win32 API毫无意义。 Microsoft在Microsoft.Win32
命名空间中添加了一些特定于Windows的类,但它非常有限,而且这些功能是必不可少的(注册表操作,文件管理...)。
关于pinvoke.net,我不会过分依赖它。我经常看到写得不好的方法声明会在x64系统上崩溃(A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.
而不是int
,结构布局问题......)。另一个例子:WriteFile
方法声明不一致。 IntPtr
vs SafeHandle
...等等。
答案 1 :(得分:2)
不仅有一个原因,还有很多原因。我可以想到以下任何一个在不包括它们的决定中发挥作用:
您可以使用Pinvoke Interop Assistant工具。它提供的声明是从Windows SDK标头自动生成的。
答案 2 :(得分:0)
.NET旨在成为一个完整的生态系统。放入Windows API是一种破解,不包括常量是微软劝阻它的方式。