Windows 8运行时(WinRT / Windows Store应用程序/ Windows 10 Universal App)与Silverlight和WPF相比如何?[关闭]


353

我试图让我领会用于创建Metro风格应用的新Windows 8 Runtime 。我知道您可以将其与XAML一起使用,并且它基于.NET,因此可以使用C#和VB.NET编写应用程序,但随后似乎与HTML,CSS,DOM和JavaScript有关。

有人可以用.NET UI程序员可以理解的方式在几段中解释它吗?(我缺少理解它所必需的“关键”。)


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


22
它不是基于.NET,只是公开给它(有点像COM互操作,但是更加无缝……例如,没有互操作程序集)。
Pavel Minaev 2011年

您是否要求WinRT作为平台(ABI,对象模型等)-在这种情况下,将其与COM或.NET进行比较更有意义-还是关于WinRT标准类库(包括用于UI的类)?
帕维尔·米纳夫2011年

1
注意,您应该区分基础技术,对象模型等(类似于COM)和使用该技术实现的特定库。即使是后者,也不是所有标准库都是UI库-如果您在VS中的对象浏览器中查看,则可以看到Windows.*名称空间涵盖的功能的广度。到目前为止,这里的术语有些令人困惑,因为WinRT既指技术又指整个标准库。我认为,仅UI库(Windows.UI.*)并没有任何简洁的标签。
Pavel Minaev 2011年

@TrueWill:学习所有这三种方法更有意义,这样您的知识将更加全面,因此您可以决定哪种解决方案最适合给定的问题。不要只是学习三个之一。
克里斯·查拉巴鲁克

2
@TrueWill:Silverlight将不会有任何未来的版本:zdnet.com/blog/microsoft/microsoft-releases-silverlight-5/...
Sabuncu

Answers:


479

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

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

然后,根据该对象模型实现了许多库-定义WinRT接口和类。同样,请查看上面提到的“ Windows Metadata”文件夹,以查看其中的内容。或仅在VS中启动对象浏览器,然后在框架选择器中选择“ Windows 8.0”,以查看其中的内容。那里有很多东西,而且它不能单独处理UI-您还会获得诸如Windows.Data.Json,或Windows.Graphics.Printing或的名称空间Windows.Networking.Sockets

然后,您将获得几个专门处理UI的库-大多数这些库是Windows.UI或下的各种名称空间Windows.UI.Xaml。它们中的很多与WPF / Silverlight名称空间非常相似-例如Windows.UI.Xaml.Controls,紧密匹配System.Windows.Controls;同上Windows.UI.Xaml.Documents

现在,.NET可以直接引用WinRT组件,就像它们是.NET程序集一样。这与COM Interop的工作原理不同-您不需要任何中间工件(例如interop程序集),只需/r一个.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>;等等。这是双向的-如果您有一个实现的.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技能在此编程模型中仍然非常相关。


WPF-WinRT兼容性如何?WPF-Silverlight是否会出现不一致情况?

5
@Den WPF在这里不是一个很好的比较基准-API与Silverlight距离非常近。如果以这种方式看待,两者之间存在不一致,但是规模更接近于台式机和WP7 Silverlight,而不是Silverlight和WPF。
帕维尔·米纳夫2011年

11
好答案。WinRT是直接访问NT内核(需要操作系统支持时)还是通过Win32?
Timores


66

从“ 构建”主题演讲中:

主题演讲

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


8
这涉及更多,因为新的XAML东西可用于C#和(本机)C ++。它既不是WPF也不是Silverlight,但与后者非常接近-正如在主题演讲中所演示的,您通常可以通过仅更改现有Silverlight代码中的一堆用法和其他此类琐碎的重构而摆脱困境。WPF / Silverlight背后的核心思想-声明性标记,资源,样式,模板,数据绑定等-都在那里。大多数控件也在那里。
Pavel Minaev 2011年

2
今天早上我看到了一个更好的图形,但是我再也找不到了。编辑:找到,感谢对此问题的另一个答案。dougseven.files.wordpress.com/2011/09/win8-new-platform.png
Chris Charabaruk

1
WPF在幻灯片上的什么位置?
狗仔队2012年

1
它与.NET / Silverlight方式分组在右下角。
BoltClock

1
就现有作品而言,该图片是完全错误的。您几乎可以通过将“ Windows Kernel Services”替换为“ Win32 kernel32.dll”并将“ Win32”替换为“ Win32 user32.dll + gdi32.dll”来修复它...但是IE和.NET / Silverlight应该位于最顶层user32.dll + gdi32.dll的文件,以及C / C ++ / Java / Delphi / etc的文件也可以访问kernel32.dll。重要的是,user32.dll和gdi32.dll不在WinRT的基础上,并且Windows Store Apps无法通过WinRT直接达到kernel32.dll的全部功能。
Ben Voigt

37

关键思想是现在有两个开发轨道-桌面和Metro。

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

一些要点:

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

2
在Metro中,没有重叠的顶层窗口。仍然Popupmsdn.microsoft.com/en-us/library/windows/apps/…),因此,如果您愿意,可以制作类似MDI的东西。显然不建议您滥用它,因为您最终可能会遇到非触摸友好的UI。
帕维尔·米纳夫2011年

@Pavel-很有意思-这是否意味着您可以并排运行几个顶层窗口,但不能重叠?例如平铺...例如共享一半的屏幕?我正在使用的WPF应用程序现在需要这种功能。
dodgy_coder 2011年

3
每个Metro应用程序只有一个顶层窗口。您可以同时运行两个Metro应用程序,但这是用户决定的-应用程序无法强制自己进入此配置。此外,即使您有两个并排运行的应用程序,它们也无法通信以进行协调(除非通过明确的用户手势,例如“共享给”)。
帕维尔·米纳夫2011年

1
另一方面,您当然可以将自己的单个顶层窗口细分为所需的多个区域,并提供可移动的分隔器来调整它们的大小-从用户的角度来看,这看起来像两个平铺的顶层窗口。但是,它们仍然会在应用程序切换器中单独显示(但是,您可能想要它?)。
帕维尔·米纳夫2011年

3
根据马丁·洛夫(Martyn Lovell)的说法,没有任何故意的机制,有意使用的机制受到有意限制。例如,命名管道不存在,内存映射文件也不存在。有套接字(包括服务器套接字),但是当连接到时localhost,您只能连接到同一应用程序。您可以在共享的“已知文件夹”之一中使用普通文件(“文档”,“图片”等),但这是一个相当粗糙的技巧,需要轮询并且对用户可见。
帕维尔·米纳夫2011年

24

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

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

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

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

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

我希望这可以给您更清​​晰的画面。阅读全文:糟糕的情况值得一千个长期讨论。


17

Microsoft提供许多详细信息。

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

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

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


2
可能存在“转换层”(例如,CLR实际上使用RCW),但是现在是实现细节。从开发人员的角度来看,您可以直接引用WinRT .winmd文件,并直接使用其中的类型。
帕维尔·米纳夫2011年

3
尽管thunk层确实使用了RCW,但是Windows运行时的RCW比旧的P / Invoke RCW更轻便。
恢复莫妮卡·拉里·奥斯特曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.