在最低级别上,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.Guid
,System.DateTime
和System.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技能在此编程模型中仍然非常相关。