Windows Runtime 类型系统映射

不同的编程言是如何知道并且调用WinRT的?在.NET框架中,一种语言写的代码可以通过元数据与不同语言写的代码交互。元数据是描述类型和成员的信息。微软的WinRT团队也使用了.NET团队创建的元数据格式(ECMA-335)。也就是说,Windows SDK通过一个包括了WinRT组件元数据的DLL暴露出来,这个DLL的扩展名是WinMD格式,是Windows MetaData的简称。新建商店应用项目的时候,Visual Studio 会自动引用WinMD文件,此文件可以在在%WindowsSdkDir%\References\CommonConfiguration\Neutral\Windows.WinMD. 找到。

因为这个文件就像是普通的.NET二进制,所以可以用ILDasm.exe或Reflector.exe打开看。因为WinRT代码是native代码,所以WinMD文件没有IL代码,而只有元数据。

当编译本地C、C++代码时,编译器可以解析Windows.WinMD文件,让WinRT API可以被C、C++调用。C#,VB也一样。运行时,CLR使用不同的WinMD文件。

另外,此文件还被拆分成多个部分,因为很少有应用使用所有接口。

当运行js应用时,IE浏览器的虚拟机也解析WinMD文件,让WinRT可以被JS调用,目的是解析成JS可以识别的类型。

下面是C#调用WinRT接口:

using System;          
// .NET Framework Class Library using Windows.Storage; 
// Most Windows.* namespaces are for WinRT APIs using Windows.UI.Popups;  
private async void ReadText() {    
var filename = "MyFile.txt";    
StorageFolder folder = ApplicationData.Current.LocalFolder;    
StorageFile file = await folder.GetFileAsync(filename);    
String text = await FileIO.ReadTextAsync(file);    
MessageDialog dialog = new MessageDialog(text, "File's Text");    
await dialog.ShowAsync(); 
}


你不需要理解这些代码是干啥的,重要的是理解这些代码用了很多winrt的api(storagefolder,>using namespace Windows::Storage; using namespace Windows::UI::Popups; void SimpleSampleCx::MainPage::ReadText() { auto filename = "MyFile.txt"; create_task(ApplicationData::Current->LocalFolder->GetFileAsync(filename)) .then([this](StorageFile^ file) { create_task(FileIO::ReadTextAsync(file)).then([this](String^ txt) { MessageDialog^ dialog = ref new MessageDialog(txt, "File's Text"); dialog->ShowAsync(); }); }); }


熟悉C++/CLI的开发者可能以为这是托管代码,因为用了 ^ 符号。实际上不是,这个符号叫做C++>function>function readText() { var filename = 'MyText.txt'; var localFolder = Windows.Storage.ApplicationData.current.localFolder; localFolder.getFileAsync(filename).then( function(file){ Windows.Storage.FileIO.readTextAsync(file).then( function(txt){ var dialog = new Windows.UI.Popups.MessageDialog(txt, "File's Text"); dialog.showAsync(); }) }); }

 

上面是用js实现的代码。

注意:JS代码的winrt方法的首字母是小写的,这是IE虚拟机映射winrt api的方式,因为js开发者熟悉这样。

对于.net开发者,有两种映射:

CLR映射:由CLR显式映射,通常重新解释元数据。比如clr让所有的winrt组件看起来像是从system.object派生。

框架映射:由代码显示映射,可以用.net框架新引入的 api。比如stream input和output.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值