WinRT XAML - 托管和非托管 - 它是如何工作的?

Dea*_*alk 4 c++ clr xaml windows-runtime c++-cx

这是关于新的WinRT API以及针对它的语言(直接或间接)以及它们与XAML的关系,我不明白.

  1. .NET语言(C#,VB.Net,F#)可用于构建在"api限制"CLR上运行的XAML Metro应用程序,后者又在WinRT上运行
  2. C++可用于构建直接在WinRT API之上运行的非托管XAML应用程序

我的问题是 - 方案1中的XAML是否转换为BAML,然后转换为MSIL(根据传统的.NET应用程序),或者是否有新的机制?如果没有,那么构建非托管应用程序的编译器如何将相同的XAML转换为本机指令?这两种方案是否可以使用相同的编译策略解决?如果是这样,那怎么样?

sar*_*esh 6

在方案1中编写metro应用程序时,您不再使用.Net XAML实现System.Windows.Controls命名空间,而是使用Windows.UI.Xaml.Controls中的XAML控件.

新命名空间中的XAML实现现在是WinRT的一部分,因此它是不受管理的.当您在metro .Net应用程序中使用这些控件时,您实际上正在为这些WinRT控件使用Runtime Callable Wrappers.

当您在非托管C++ metro应用程序中使用XAML时,您使用的是无人管理的WinRT控件,所以是的,它们被编译为本机代码,但没有从.Net到本机代码的转换.

  • 简短回答:当您使用托管语言编写XAML来编写metro应用程序时,实际上您使用的是WinRT实现而不是.Net实现.有两个原因,这是不明显的1)WinRT编译时生成.winmd文件,它是程序集元数据文件,它以CLI中指定的相同格式生成.这允许我们使用这些WinRT控件,就像它们是.Net控件一样.CLR负责所有互操作魔法,因此不需要互操作程序集.2.尽管在不同的命名空间中,WinRT控件具有相同的名称. (2认同)