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

Ian*_*ose 353 wpf windows-runtime windows-store-apps win-universal-app windows-10

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

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


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

Pav*_*aev 479

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

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

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

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

  • 很好的答案.WinRT是否直接访问NT内核(何时需要操作系统支持)或是否通过Win32? (11认同)
  • @Den WPF在这里不是一个很好的比较基础 - API与Silverlight更接近.如果以这种方式看待它们,两者之间存在不一致,但规模更接近桌面与WP7 Silverlight,而不是Silverlight与WPF. (5认同)
  • 轻微修正/添加:[WinRT组件实现了IInspectable接口,它来自IUnknown ...](http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/under-the -covers-的-的WinRT-使用-c.aspx) (4认同)

Ran*_*ngy 66

Build主题演讲:

主题演讲

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

  • 这涉及更多,因为新的XAML thingy可用于C#和(本机)C++.它既不是WPF也不是Silverlight,而是非常接近后者 - 正如主题演讲所示,你可以经常在现有的Silverlight代码中改变一堆使用和其他如此微不足道的重构.WPF/Silverlight背后的核心思想 - 声明性标记,资源,样式,模板,数据绑定等 - 都在那里.大多数控件都在那里. (8认同)
  • 我今天早上看到了更好的图形,但我再也找不到了.编辑:发现,感谢关于这个问题的另一个答案.http://dougseven.files.wordpress.com/2011/09/win8-new-platform.png (2认同)

dod*_*der 37

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

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

一些要点:

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

  • 每个Metro应用程序只有一个顶级窗口.您可以并排运行两个Metro应用程序,但这是用户决定的 - 应用程序无法强制进入此配置.此外,即使您有两个并排运行的应用程序,它们也无法进行通信协调(除非通过明确的用户手势,例如"分享到"). (3认同)
  • 根据Martyn Lovell的说法,没有任何有意识的机制,可以用于它的一些机制是故意限制的.例如,命名管道不在那里,也不是内存映射文件.有套接字(包括服务器套接字),但是当连接到`localhost`时,你只能连接到同一个应用程序.您可以在其中一个共享的"已知文件夹"(文档,图片等)中使用普通文件,但这是一个相当粗糙的黑客,需要轮询并且对用户可见. (3认同)
  • 在Metro中,没有重叠的_top-level_窗口.还有`Popup`(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.primitives.popup),所以如果你愿意,你可以做一些MDI -喜欢.显然不建议滥用它,因为你最终会冒险使用非触摸友好的UI. (2认同)

ven*_*mit 24

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

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

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

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

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

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


Ste*_*owe 17

这里有很多来自微软的细节.

使用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++访问.

  • 虽然thunking层确实使用了RCW,但是Windows运行时的RCW比旧的P/Invoke RCW更轻量级. (3认同)
  • "thunking layer"可能存在 - 例如CLR实际上使用RCW - 但它现在是一个实现细节.从dev角度来看,您可以直接引用WinRT .winmd文件,并直接使用里面的类型. (2认同)