358

我试图了解用于创建Metro风格应用程序的新 Windows 8 运行时。我知道您可以将它与XAML一起使用,它基于 .NET,因此 C# 和 VB.NET 可用于编写应用程序,但它似乎与 HTML、CSS、DOM 和 JavaScript 有关。

有人可以用.NET UI 程序员可以理解的几段来解释它是什么吗?(我错过了理解它所必需的“关键”。)


我们都知道 WPF、SilverlightWindows Forms等至少在 Intel 系统上将继续在 Windows 8(和 Windows 10)下工作,所以请不要告诉我......

4

5 回答 5

483

在最低级别,WinRT 是在 ABI 级别上定义的对象模型。它使用 COM 作为基础(因此每个 WinRT 对象都实现IUnknown并执行引用计数),并从那里构建。与旧的 COM 相比,它确实添加了很多新概念,其中大部分直接来自 .NET - 例如,WinRT 对象模型具有委托,并且事件以 .NET 样式完成(具有委托和添加/删除订阅者方法,每个事件一个),而不是事件源和接收器的旧 COM 模型。在其他值得注意的事情中,WinRT 还具有参数化(“通用”)接口。

另一大变化是所有 WinRT 组件都有可供它们使用的元数据,就像 .NET 程序集一样。在 COM 中,你有点像 typelibs 那样,但不是每个 COM 组件都有它们。对于 WinRT,元数据包含在 .winmd 文件中 - 查看 Developer Preview 中的“C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata\”。如果您四处寻找,您会发现它们实际上是没有代码的 CLI 程序集,只是元数据表。实际上,您可以使用 ILDASM 打开它们。请注意,这并不意味着 WinRT 本身是受管理的 - 它只是重复使用文件格式。

然后根据该对象模型实现了许多库 - 定义 WinRT 接口和类。再次,查看上面提到的“Windows 元数据”文件夹,看看里面有什么;或者只是在 VS 中启动对象浏览器并在框架选择器中选择“Windows 8.0”,以查看涵盖的内容。那里有很多,而且它不仅仅处理 UI - 您还可以获得诸如Windows.Data.Json, or Windows.Graphics.Printing, or之类的命名空间Windows.Networking.Sockets

然后你会得到几个专门处理 UI 的库——这些库大多是Windows.UIor下的各种命名空间Windows.UI.Xaml。其中很多与 WPF/Silverlight 命名空间非常相似——例如Windows.UI.Xaml.Controls,非常匹配System.Windows.Controls;同上Windows.UI.Xaml.Documents

现在,.NET 能够直接引用 WinRT 组件,就好像它们是 .NET 程序集一样。这与 COM 互操作不同 - 您不需要任何中间工件,例如互操作程序集,您只需/r一个 .winmd 文件,并且元数据中的所有类型及其成员都对您可见,就好像它们是 .NET 对象一样。请注意,WinRT 库本身是完全本机的(因此使用 WinRT 的本机 C++ 程序根本不需要 CLR) - 将所有这些东西公开为托管的魔法在 CLR 本身内部,而且级别相当低。如果您创建一个引用 .winmd 的 .NET 程序,您会发现它实际上看起来像一个外部程序集引用 - 没有诸如类型嵌入之类的花招。

这也不是一个生硬的映射 - CLR 会尽可能将 WinRT 类型调整为它们的等价物。因此,例如 GUID、日期和 URI 分别变为System.GuidSystem.DateTimeSystem.Uri;WinRT 集合接口,例如IIterable<T>andIVector<T>成为IEnumerable<T>and IList<T>;等等。这是双向的 - 如果您有一个实现 .NET 对象IEnumerable<T>并将其传递回 WinRT,它会将其视为IIterable<T>.

最终,这意味着您的 .NET Metro 应用程序可以访问现有标准 .NET 库的子集,以及(本机)WinRT 库,其中一些 - 特别是Windows.UI- 在 API 方面看起来与 Silverlight 非常相似。您仍然有 XAML 来定义您的 UI,并且您仍然处理与 Silverlight 中相同的基本概念 - 数据绑定、资源、样式、模板等。在许多情况下,可以简单地通过using新的命名空间来移植 Silverlight 应用程序,并调整代码中调整 API 的几个地方。

WinRT 本身与 HTML 和 CSS 没有任何关系,它与 JavaScript 的关系只是在某种意义上它也暴露在那里,类似于它为 .NET 所做的事情。当您在 .NET Metro 应用程序中使用 WinRT UI 库时,您不需要处理 HTML/CSS/JS(好吧,我想,如果您真的想要,您可以托管一个WebView控件......)。您的所有 .NET 和 Silverlight 技能在此编程模型中仍然非常重要。

于 2011-09-14T23:14:21.897 回答
67

来自Build主题演讲:

基调堆栈

他们为 HTML/CSS/JavaScript 应用程序和 C#/XAML 应用程序提供通用 API。将使用 C# 和 XAML,但不会完全是 WPF 或 Silverlight。

于 2011-09-14T17:03:27.073 回答
37

关键思想是现在有两个开发轨道——桌面和地铁。

  • 桌面是旧应用程序所在的地方。
  • 新的应用程序类别 Metro 应用程序可以通过多种方式构建,包括通过 VB.NET、C# 或 C++。这三种语言选项可以使用 XAML 来构建 UI。另一种方法是使用 JavaScript/HTML5/CSS 来开发 UI 和应用程序代码。

一些重要的点:

  • Windows 8 感觉有点像升级后的手机操作系统。
  • 在 Metro 中,没有重叠的顶层窗口,就像在手机上一样。如果你想要一个 MDI 风格的应用程序,你需要留在桌面上。
  • Metro 风格的应用程序在不可见时会自动挂起。这样做是为了延长电池寿命。这意味着将许多现有的桌面应用程序移植到 Metro 是没有意义的,这些桌面应用程序即使在用户不与它们交互时也会执行后台处理。
  • Windows 8 的 ARM 版本将不支持桌面应用程序。因此,如果您想编写一个应用程序并希望它在任何版本的 Windows 上运行,那么它必须是 Metro 应用程序。
于 2011-09-15T05:52:05.760 回答
24

架构的修改版本肯定会帮助您了解事物的确切位置。Telerik 的一位忍者与CLR团队聊天并修改了图片:

Windows 8 平台和工具(包括 CLR)

在这里,您可以看到 CLR 所在的位置。.NET 框架现在有两个配置文件

1- .NET Metro 配置文件(处理 Metro 应用程序的 CLR)

2- .NET 客户端配置文件(C# 和 VB.NET 应用程序的 CLR 运行时)

我希望这能给你一个更清晰的画面。阅读完整的文章一张糟糕的图片值得一千次长时间的讨论。.

于 2011-09-17T07:16:46.893 回答
17

微软在这里提供了很多细节。

Windows 运行时使用 API 元数据(.winmd 文件)公开。这与 .NET 框架 (Ecma-335) 使用的格式相同。底层二进制合约使您可以轻松地以您选择的开发语言直接访问 Windows 运行时 API。Windows 运行时 API 的形状和结构可以通过 C# 等静态语言和 JavaScript 等动态语言来理解。IntelliSense 在 JavaScript、C#、Visual Basic 和 C++ 中可用。

简而言之,Windows 运行时是一组新的库,它公开了 Windows 功能并可用于 JavaScript/C#/VB/C++。每种语言都可以理解并能够直接调用它们,而不必通过一些 thunking 层。

Silverlight 和 WPF 是在 CLR 上运行的 XAML 风格。在其他功能中,Windows 运行时公开了一个与 Silverlight 非常相似的 XAML 版本,但以本机方式进行,而不是通过 CLR。它可以从 CLR 访问,也可以从 C++ 访问。

于 2011-09-15T01:34:12.510 回答