[原文地址:Howto call WinRT APIs in Windows 8 from C# Desktop Applications - WinRT Diagram]
中文翻译
我曾试着访问一些运行着Windows 8 操作系统的Intel Ultrabook内置传感器。然而,尽管Interl Ultrabook 支持内置在Windows 7或者更高版本的.NET 4 库中的本地传感器, 我想访问完整的内置在Windows 8自身中的传感器和位置平台。这些API 通过COM可用且我可以通过COM调用,但是通过WinRT层来调用它们就更好了。这就是WinRT存在的原因.
这让我思考WinRT以及它的意义。我在数月前发表了一篇博文真正清理了些东西,但是我总觉得所有的各种图表试图解释如何把东西都放在一起为什么会太复杂。
免责声明:所有图表就其性质而言过于简单化。我的工作有关Web方面,而不是Windwos 方面,所以这都是我自己的意见和推测,且用我自己的时间完成。我不在Windows组织中,我只是一个试图为婴儿写一个应用程序的玩家。
我想它不像所有这些图表那么复杂。我画这个是为了帮助自己理解。
就像C 语言有一个C运行时为它提供了一系列功能支持及功能的调用规定,Windows运行时(WinRT)是为Windows和它的语言工作的。这些API和运行时包含有调用规定的元数据,这些规定使得调用WinRTAPI比调用COM更容易。
在图表中看出我是如何从.NET CLR中调用任何API的吗?在我想调用传感器API的情况下,当它们是ultimately Win32 API或者 COM API, 我想使用最高层的调用规定来调用它们,这是一个非常友好的WindowsRT 。
从C# 桌面应用程序调用WinRT API
我喜欢使用小型的控制台应用程序来做测试,但是这些不是“Windows Store应用程序”。所以我能被允许从我的桌面或者控制台应用程序中调用WinRT吗?
当然可以。在MSDN文档中有一章节列出了所有可以从桌面调用的针对Windows 8的WinRT API. 我可以明确地在文档中确认LightSensor 类并且确保它是允许被桌面应用程序调用的。
虽然没有明确定义,但是有文档描述了如何在非Windows Store应用程序中添加WinRT引用.
从一个桌面应用程序添加引用到WinRT
文档说的有些隐晦:
在桌面项目中,核心选项卡默认不会显示。用户可以选择Windows Runtime编写代码,通过打开快捷菜单中的项目节点,选择不加载项目,添加以下代码片段,再次打开快捷菜单中的项目节点,然后选择加载项目。现在,当用户从项目中调用资源管理器对话框,核心选项卡就会显示了。
我将会制作一个.NET4.5 C#的桌面应用程序。我将修改.csproj 文件,添加TargetPlatformVersion行。我将会从解决方案资源管理器的节点的上下文菜单选择添加引用。
我将会添加一小段代码来检查我笔记本上的光传感器的状态:
LightSensor light = LightSensor.GetDefault();
if (light != null)
{
uint minReportInterval = light.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ?minReportInterval : 16;
light.ReportInterval = reportInterval;
light.ReadingChanged += light_ReadingChanged; //event hander
}
然而,当我编译应用程序时,我得到了一个错误,错误出现在我试着挂钩一个eventhandler委托的那一行。用“+=”语言添加多播委托无法工作。
Error 1 Property, indexer, or event
'Windows.Devices.Sensors.LightSensor.ReadingChanged'
is not supported by the language; try directly calling accessor
methods 'Windows.Devices.Sensors.LightSensor.add_ReadingChanged
(Windows.Foundation.TypedEventHandler
or 'Windows.Devices.Sensors.LightSensor.remove_ReadingChanged
(System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken)'
为了解决这个问题,并且将适当的应用程序集加载到我的应用程序来支持从我的桌面应用程序调用WinRT,我需要添加引用System.Runtime 和 System.Runtime.InteropService.WindowsRuntime.dll. 它在我系统的C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETCore\v4.5目录下。
现在编译我的应用程序。我甚至可以将委托改写成lambda表达式这种样式。
light.ReadingChanged += (s, a) =>
{
Console.WriteLine(String.Format("There was light!{0}", a.Reading.IlluminanceInLux));
};
现在我能够运行我的小型控制台应用程序了,感知光线并且检测它的行动。以下是一个截图,显示了一束光照在我笔记本电脑的结果。你可以看到Ambient LightSensor检测到它并且输出到控制台。
现在非Windows Store应用程序调用Windows RT 应用程序能够使用的工具就是Visual Studio中的一个小手册,它的基本能力和运行时必须为我很好的工作。希望这几个手动操作步骤以后能变成某个点的复选框。
看到MSDN文档包涵有关API如何实际被桌面和Windows Store应用程序调用的详细内容也让人感到高兴。
这周的发起者:你的想法。你的应用程序。30天。从今天开始你的30天之旅吧,创建一个Windows Store应用程序或者玩玩Windows8或Windows Phone。