为什么.net中不包含Windows常量?

J C*_*ins 8 .net windows constants

每当我看到代码调用说kernel32.dll或User32.dll时,即使在MSDN上,代码片段也要求开发人员将任何所需的常量(例如WM_SETREDRAW = 11)硬编码到例程中.由于这些常量永远不会按定义更改并始终具有一个标准定义,为什么.net不能在某处提供它们?我觉得我们最终都会根据需要创建自己的常量库和标准的Windows dll调用.看起来这种重复工作是浪费的,容易出错.

也许我看起来不够努力而且他们都在某处,如果有的话,有人可以提供他们的位置吗?

ken*_*n2k 2

我认为只有.Net团队才能提供实际答案,我们只能做出假设。

原因可能有很多。以下是一些猜测:

  • Win32 API 太多容易出错。许多 Win32 方法要求开发人员操作不安全的句柄(通常表示为IntPtr对象),这不是 .Net 的处理方式(例如,您应该使用 FileStream 而不是CreateFile// ReadFile/ )WriteFileCloseHandle
  • 在 mscorlib 中添加整个 Win32 API 是没有意义的,因为只有 0.1% 的开发人员实际使用它
  • 微软更喜欢开发人员编写托管代码
  • .Net 框架被设计为与平台无关。这就是为什么您会发现Environment.NewLine例如 ( A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.)。因此添加整个 Win32 API 是没有意义的。

微软在命名空间中添加了一些Windows特定的类Microsoft.Win32,但它非常有限,而且这些功能是必不可少的(注册表操作、文件对话框...)。

关于pinvoke.net,我不会太依赖它。我经常看到写得不好的方法声明会在 x64 系统上崩溃(int而不是IntPtr结构布局问题......)。又如:WriteFile方法声明不一致。SafeHandleIntPtr...等