11

换句话说,.NET 框架最终会在某处调用以完成其工作吗?或者微软是否在他们的 .NET 框架中完全重新创建了 win32 库的所有功能。

谢谢!

4

7 回答 7

17

这是一种混合。显然,诸如 winforms 之类的东西主要是围绕 Win32 功能(或两者兼而有之)的包装,但 WPF 的管理要好得多(就实际控制代码而言;在幕后,正如 Mash 所指出的,它可能使用 DirectX 作为渲染)。同样,文件/网络访问之类的东西(必然)是操作系统对象的包装器,非托管锁对象也是如此Mutex- 但许多其他东西是 100% 托管的。

所以这不是一个简单的答案。

(编辑)另外 - 请记住,“.NET”是一个非常模糊的术语;Compact Framework、Micro Framework、Silverlight 等可能有不同的非 win32 实现。

于 2009-04-27T08:13:27.107 回答
6

.NET 应用程序只是另一个 Win32 进程,所以没有什么神奇之处,显然它将使用下划线操作系统。甚至 .NET 库也在很大程度上使用 Win32。

例子:

  • 内存管理是在内部为托管代码处理的,但对于进程本身,它的处理方式与任何其他 Win32 进程一样。

  • 当前托管的线程也被实现为操作系统线程。

于 2009-04-27T08:12:19.370 回答
6

更新:意识到我回答了错误的问题(你说的是运行时而不是类库)......哦,无论如何我都会保持下面的胡言乱语!

这取决于图书馆的一部分:

  • System.Xml 库使用 MSXML
  • System.Reflection 不会,因为它都是基于 IL 的
  • System.Text 做和不做。有一些对字符串操作的“快速”调用
  • System.Text.RegularExpressions 不像 XML 命名空间一样,它都是使用 RegexRunner 内部类自定义的。
  • System.Diagnostics 使用 kernel32.dll 调用,例如 CreateProcess
  • System.IO 命名空间也确实 pinvoke
  • System.Threading 使用内部方法调用,最终(在 CLR 内部)调用 winapi 方法
  • System.Windows.Forms 是一个混合体,但最终使用 GDI
  • System.Net (NetworkStream) 使用 ws2_32.dll 例如 WSARecv(..)

那只是摆弄反射器。显然,作为 COM 服务器,Microsoft CLR 也严重依赖 win32。

于 2009-04-27T08:51:46.670 回答
5

在某些情况下(可能是大多数情况?我没有反映整个框架).NET 框架调用 win32。大多数控件只是带有一些新功能的 win32 控件。

于 2009-04-27T08:11:06.363 回答
3

是的,它在内部调用了 win32 函数。例如 File 类中的 OpenRead 方法包含:

    return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);

它最终会调用:

    SafeFileHandle handle = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, securityAttrs, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);

这是一个win32原生函数,在方法的深处。

于 2009-04-27T08:14:29.710 回答
2

Mono是 .net 运行时的实现,它当然不会映射到 win32 函数调用(至少在 linux 上)

我猜您的问题是指 Microsoft 实现的 .net 运行时。

于 2009-04-27T11:05:10.797 回答
1

它确实像所有 Windows 应用程序一样调用 .NET API。但它不仅仅是一个简单的包装器或映射,它更准确地描述为一种抽象。

于 2009-04-27T08:31:31.680 回答