6

我四处浏览并发现了类似的问题,所有的回答都不清楚和模糊不清,而且对 Windows 体系结构没有清晰的了解让我很恼火。Windows 中有层在我的脑海中一直看起来像这样(从上到下):

[。网]

[Win32]

[微内核]

[哈尔]

[硬件]

最近看到这样的图: 在此处输入图像描述 在此处输入图像描述

我很困惑,尤其是 CLR 似乎与 WinAPI 并行运行的事实。我想我的问题是这样的:

更新 问:我在哪里可以找到描述 Windows 最新版本(7,8、Server 2012 等)中操作系统架构的清晰和解释性资源?

4

2 回答 2

14

我假设这个问题是关于 WinRT 的,否则它完全太模糊而无法回答。

底部的图表非常具有误导性。它从你作为程序员需要了解的角度展示了你的观点。如果你创建了一个 WinRT 应用程序,那么旧的 winapi 就不是你直接处理的东西了。它已被 WinRT api 取代,您只能使用它来获取操作系统服务。

实现方式非常不同。CLR 仍然很大程度上运行在 winapi 之上,就像它在桌面应用程序中一样。并且它与非托管代码互操作,Windows 本质上是一个非托管操作系统。WinRT 也是如此,它是一个基于 COM 的非托管 API。

每个 WinRT 应用程序实际上都是一个进程外 COM 服务器,就像 30 年前使用的此类服务器一样。它确实在一种特殊模式下运行,微软为使 UAC 工作的管道添加了一个额外的层。它被称为“应用程序容器”,它像沙盒一样工作。就像如果用户没有被 UAC 提示提升权限,UAC 会阻止程序访问某些目录或注册表项,应用程序容器也会阻止程序使用麻烦的 winapi 函数。那种会造成可用性或安全问题或电池耗尽过快的类型。WinRT 可以替代此类 winapi 函数。

COM 有点臭名昭著,它是微软使用的通用互操作解决方案,但它并不是特别容易编程。微软做了很多工作来使 COM 更可用,主要是完全隐藏它。值得注意的是,类型库被替换为 .winmd 文件,这是一个大大增强的版本,可以表达更多的细节。他们使用 .NET 元数据的数据格式。

他们隐藏 COM 的一个关键方式是内置在各种运行时支持库中的语言投影。对于 C++,它隐藏在 C++/CX 语言扩展和运行时库中。对于 Javascript,它隐藏在 Chakra 执行引擎中。对于托管代码,它隐藏在 .NET 框架中,在参考程序集中带有 [TypeForwardedTo]。语言投影从 WinRT 类型和行为转换为特定于语言的类型。基本的东西,如 COM 错误代码被转换为异常。WinRT HSTRING 类型被转换为 System.String。等等。

有几个地方的语言投影从裂缝中窥视,在看似奇怪的限制中可见。就像 WinRT 组件必须始终是密封类一样,COM 的副作用是不支持实现继承。或者,您可以在组件中公开 DateTimeOffset,但不能公开 DateTime。并且某些 WinRT 类型不能很好地映射到 .NET 类型,IBuffer 是臭名昭著的。

于 2013-08-15T13:00:49.500 回答
3

WinRT 主要是一组 API,用于为所有 Metro 支持的平台(包括 Windows 8 for ARM)构建 Metro 应用程序。Windows 运行时为 Windows 体验开发人员提供了大量新的 API。

来自http://arstechnica.com/features/2012/10/windows-8-and-winrt-everything-old-is-new-again/5/

WinRT 名称代表“Windows 运行时”。但是,这不是Microsoft 的 .NET Runtime 是运行时的方式,或者 Oracle 的 Java 运行时环境是运行时的方式。在 .NET 和 Java 案例中,运行时是一个比较大的软件组件,它提供虚拟机环境、垃圾回收内存、各种代码安全验证等。.NET 和 Java 运行时几乎与 .NET 或 Java 程序所做的一切密切相关,为软件开发人员提供了广泛的基础设施。

WinRT 没有提供与那些运行时完全一样的东西。WinRT 是一组提供 API 的软件库,提供一系列服务——图形、网络、存储、打印。除此之外,还有一个相对较小的基础设施组件。

开发 Metro 风格应用时,.NET Framework 和公共语言运行时 (CLR) 与 WinRT 集成。CLR 4.5 作为 Windows 8 中 Microsoft .NET Framework 4.5 的一部分提供,使开发人员能够编写托管代码以自然地使用 Windows 运行时 API ( http://msdn.microsoft.com/en-us/library /hh694558.aspx)。WinRT 在 Windows 7 或以前版本的 Windows 中不可用。

http://arstechnica.com/features/2012/10/windows-8-and-winrt-everything-old-is-new-again/上有一篇很棒的文章....在 7 个部分中深入描述来自 COM > .NET > WinRT 的历史记录。要跳入 WinRT,请查看它的第 5 部分

希望它能澄清你的疑惑。如果有其他问题,请告诉我。

于 2013-08-15T11:57:16.727 回答