换句话说,.NET 框架最终会在某处调用以完成其工作吗?或者微软是否在他们的 .NET 框架中完全重新创建了 win32 库的所有功能。
谢谢!
这是一种混合。显然,诸如 winforms 之类的东西主要是围绕 Win32 功能(或两者兼而有之)的包装,但 WPF 的管理要好得多(就实际控制代码而言;在幕后,正如 Mash 所指出的,它可能使用 DirectX 作为渲染)。同样,文件/网络访问之类的东西(必然)是操作系统对象的包装器,非托管锁对象也是如此Mutex
- 但许多其他东西是 100% 托管的。
所以这不是一个简单的答案。
(编辑)另外 - 请记住,“.NET”是一个非常模糊的术语;Compact Framework、Micro Framework、Silverlight 等可能有不同的非 win32 实现。
.NET 应用程序只是另一个 Win32 进程,所以没有什么神奇之处,显然它将使用下划线操作系统。甚至 .NET 库也在很大程度上使用 Win32。
例子:
内存管理是在内部为托管代码处理的,但对于进程本身,它的处理方式与任何其他 Win32 进程一样。
当前托管的线程也被实现为操作系统线程。
更新:意识到我回答了错误的问题(你说的是运行时而不是类库)......哦,无论如何我都会保持下面的胡言乱语!
这取决于图书馆的一部分:
那只是摆弄反射器。显然,作为 COM 服务器,Microsoft CLR 也严重依赖 win32。
在某些情况下(可能是大多数情况?我没有反映整个框架).NET 框架调用 win32。大多数控件只是带有一些新功能的 win32 控件。
是的,它在内部调用了 win32 函数。例如 File 类中的 OpenRead 方法包含:
return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
它最终会调用:
SafeFileHandle handle = CreateFile(lpFileName, dwDesiredAccess, dwShareMode, securityAttrs, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
这是一个win32原生函数,在方法的深处。
Mono是 .net 运行时的实现,它当然不会映射到 win32 函数调用(至少在 linux 上)
我猜您的问题是指 Microsoft 实现的 .net 运行时。
它确实像所有 Windows 应用程序一样调用 .NET API。但它不仅仅是一个简单的包装器或映射,它更准确地描述为一种抽象。