桌面應(yīng)用程序中調(diào)用Windows?
盡管Interl Ultrabook 支持內(nèi)置在Windows 7或者更高版本的.NET 4 庫中的本地傳感器, 我想訪問完整的內(nèi)置在Windows 8自身中的傳感器和位置平臺。這些API 通過COM可用且我可以通過COM調(diào)用,但是通過WinRT層來調(diào)用它們就更好了。這就是WinRT存在的原因. 這讓我思考WinRT以及它的意義。我在數(shù)月前發(fā)表了一篇博文真正清理了些東西,但是我總覺得所有的各種圖表試圖解釋如何把東西都放在一起為什么會太復(fù)雜。 免責(zé)聲明:所有圖表就其性質(zhì)而言過于簡單化。我的工作有關(guān)Web方面,而不是Windwos 方面,所以這都是我自己的意見和推測,且用我自己的時間完成。我不在Windows組織中,我只是一個試圖為嬰兒寫一個應(yīng)用程序的玩家。 我想它不像所有這些圖表那么復(fù)雜。我畫這個是為了幫助自己理解。 就像C 語言有一個C運行時為它提供了一系列功能支持及功能的調(diào)用規(guī)定,Windows運行時(WinRT)是為Windows和它的語言工作的。這些API和運行時包含有調(diào)用規(guī)定的元數(shù)據(jù),這些規(guī)定使得調(diào)用WinRTAPI比調(diào)用COM更容易。 在圖表中看出我是如何從.NET CLR中調(diào)用任何API的嗎?在我想調(diào)用傳感器API的情況下,當(dāng)它們是ultimately Win32 API或者 COM API, 我想使用最高層的調(diào)用規(guī)定來調(diào)用它們,這是一個非常友好的WindowsRT 。 從C# 桌面應(yīng)用程序調(diào)用WinRT API 我喜歡使用小型的控制臺應(yīng)用程序來做測試,但是這些不是“Windows Store應(yīng)用程序”。所以我能被允許從我的桌面或者控制臺應(yīng)用程序中調(diào)用WinRT嗎? 當(dāng)然可以。在MSDN文檔中有一章節(jié)列出了所有可以從桌面調(diào)用的針對Windows 8的WinRT API. 我可以明確地在文檔中確認(rèn)LightSensor 類并且確保它是允許被桌面應(yīng)用程序調(diào)用的。 雖然沒有明確定義,但是有文檔描述了如何在非Windows Store應(yīng)用程序中添加WinRT引用. 從一個桌面應(yīng)用程序添加引用到WinRT 文檔說的有些隱晦: 在桌面項目中,核心選項卡默認(rèn)不會顯示。用戶可以選擇Windows Runtime編寫代碼,通過打開快捷菜單中的項目節(jié)點,選擇不加載項目,添加以下代碼片段,再次打開快捷菜單中的項目節(jié)點,然后選擇加載項目?,F(xiàn)在,當(dāng)用戶從項目中調(diào)用資源管理器對話框,核心選項卡就會顯示了。<PropertyGroup><TargetPlatformVersion>8.0</TargetPlatformVersion></PropertyGroup> 我將會制作一個.NET4.5 C#的桌面應(yīng)用程序。我將修改.csproj 文件,添加TargetPlatformVersion行。我將會從解決方案資源管理器的節(jié)點的上下文菜單選擇添加引用。 我將會添加一小段代碼來檢查我筆記本上的光傳感器的狀態(tài):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 } 然而,當(dāng)我編譯應(yīng)用程序時,我得到了一個錯誤,錯誤出現(xiàn)在我試著掛鉤一個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 Windows.Devices.Sensors.LightSensorReadingChangedEventArgs>)' or 'Windows.Devices.Sensors.LightSensor.remove_ReadingChanged (System.Runtime.InteropServices.WindowsRuntime.EventRegistrationToken)' 為了解決這個問題,并且將適當(dāng)?shù)膽?yīng)用程序集加載到我的應(yīng)用程序來支持從我的桌面應(yīng)用程序調(diào)用WinRT,我需要添加引用System.Runtime 和 System.Runtime.InteropService.WindowsRuntime.dll. 它在我系統(tǒng)的C:\Program Files (x86)\ReferenceAssemblies\Microsoft\Framework\.NETCore\v4.5目錄下。 現(xiàn)在編譯我的應(yīng)用程序。我甚至可以將委托改寫成lambda表達(dá)式這種樣式。light.ReadingChanged += (s, a) =>{Console.WriteLine(String.Format("There was light!{0}", a.Reading.IlluminanceInLux));}; 現(xiàn)在我能夠運行我的小型控制臺應(yīng)用程序了,感知光線并且檢測它的行動。以下是一個截圖,顯示了一束光照在我筆記本電腦的結(jié)果。你可以看到Ambient LightSensor檢測到它并且輸出到控制臺。 現(xiàn)在非Windows Store應(yīng)用程序調(diào)用Windows RT 應(yīng)用程序能夠使用的工具就是Visual Studio中的一個小手冊,它的基本能力和運行時必須為我很好的工作。希望這幾個手動操作步驟以后能變成某個點的復(fù)選框。 看到MSDN文檔包涵有關(guān)API如何實際被桌面和Windows Store應(yīng)用程序調(diào)用的詳細(xì)內(nèi)容也讓人感到高興。 這周的發(fā)起者:你的想法。你的應(yīng)用程序。30天。