8

每次我看到调用 kernel32.dll 或 User32.dll 的代码时,即使在 MSDN 上,代码片段也总是要求开发人员将任何所需的常量(例如 WM_SETREDRAW = 11)硬编码到例程中。既然这些常量从不改变定义并且总是有一个标准定义,为什么 .net 不在某个地方提供它们呢?我觉得我们最终都会根据需要创建自己的常量库和标准 Windows dll 调用。这种重复工作似乎是浪费并且容易出错。

也许我看的不够仔细,他们都在某个地方,如果可以,有人可以提供他们的位置吗?

4

3 回答 3

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 是没有意义的。

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

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

于 2012-07-31T16:16:47.687 回答
2

原因不止一个,还有很多。我可以想到以下任何一项在决定不包括它们的过程中发挥了作用:

  • 甚至在框架程序集上工作的团队也没有共享一组通用的 pinvoke 声明,每个团队都编写了自己的
  • Microsoft 仅维护一个单一的 winapi 源,即 Windows SDK
  • SDK 的维护者是一个不同的组,与任何在 .NET 上工作的组没有密切关系
  • 不仅仅是一个 winapi,它严重依赖于目标 Windows 版本,这是您在构建 C/C++ 程序时指定的。这与 .NET 的本质背道而驰,它与版本无关
  • winapi 是巨大的,没有人会对部分版本感到满意
  • winapi 函数的 pinvoke 声明通常从其原始形式重写,以使使用更加简单。特别是采用不透明指针的函数,SendMessage() 是典型的例子
  • .NET 旨在确保您不必依赖 winapi。无论如何,您都可以使用自己的 pinvoke 声明来回填缺失的部分,但是这将在任何可以运行 .NET 程序的 Windows 版本上工作的保证丢失了。Windows 98 和 2000 仍然受到 2.0 的官方支持

您可以使用Pinvoke 互操作助手工具。它提供的声明是从 Windows SDK 标头自动生成的。

于 2012-07-31T22:25:37.747 回答
0

.NET 被设计成一个完整的生态系统。放入 Windows API 是一种 hack,不包括常量是 Microsoft 阻止它的方式。

于 2012-07-31T16:30:35.910 回答