it-swarm.cn

Windows 8 Runtime(WinRT/Windows应用商店应用程序/ Windows 10通用应用程序)与Silverlight和WPF相比如何?

我试图了解用于创建 Metro style应用程序的新Windows 8 Runtime。我知道你可以用它来 _ xaml _ 它它基于.NET所以C#和VB.NET可以用来编写应用程序,但它似乎与HTML,CSS,DOM有关和JavaScript。

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


我们都知道WPF, SilverlightWindows Forms 等将至少在英特尔系统上继续在Windows 8(和Windows 10)下运行,所以请不要告诉我......

349
Ian Ringrose

在最低级别,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 Metadata”文件夹,看看那里有什么;或者只是在VS中启动对象浏览器并在框架选择器中选择“Windows 8.0”,以查看所涵盖的内容。那里有很多,它不仅仅涉及UI - 你还可以获得名称空间,例如Windows.Data.JsonWindows.Graphics.PrintingWindows.Networking.Sockets

然后你会得到几个专门处理UI的库 - 主要是Windows.UIWindows.UI.Xaml下的各种命名空间。其中很多与WPF/Silverlight命名空间非常相似 - 例如Windows.UI.Xaml.ControlsSystem.Windows.Controls紧密匹配;同上Windows.UI.Xaml.Documents等.

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

它也不是一种生硬的映射 - 在可能的情况下,CLR会尝试将WinRT类型调整为等效类型。所以例如GUID,日期和URI分别变为System.GuidSystem.DateTimeSystem.Uri; WinRT集合接口,如IIterable<T>IVector<T>,变为IEnumerable<T>IList<T>;等等。这有两种方式 - 如果你有一个实现IEnumerable<T>的.NET对象,并将其传递给WinRT,它会将其视为IIterable<T>

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

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

475
Pavel Minaev

来自 Build keynote:

Keynote stack

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

65
RandomEngy

关键的想法是,现在有两个开发轨道 - 桌面和地铁。

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

一些要点:

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

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

Windows 8 Platform and Tools (including the CLR)

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

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

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

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

23
vendettamit

微软的很多细节 这里

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

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

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

16
Steve Rowe