|
英文原文:C# and Visual Basic on the WinRT API
?。ㄗ髡撸篔onathan Allen 譯者:侯伯薇)
盡管我們可以使用 .NET 語(yǔ)言來(lái)調(diào)用 Win32 API,但那樣做會(huì)很困難。所以在過(guò)去的兩年間微軟一直在構(gòu)建替代的方案,它就是實(shí)現(xiàn)了跨語(yǔ)言支持的 Windows 運(yùn)行時(shí),即 WinRT。我們可以在 C++ 和 .NET 中創(chuàng)建 WinRT 組件,并且可由二者以及 JavaScript 使用。
盡管 COM 在表面上是一種基于 OOP 的框架,但它與 .NET 之間有很大的區(qū)別。在 WinRT 出現(xiàn)之前,COM 是基于接口而不是基于類的。這意味著其中缺少很多 .NET 開(kāi)發(fā)者認(rèn)為應(yīng)該有的內(nèi)容,像構(gòu)造函數(shù)以及靜態(tài)方法等。C++組件擴(kuò)展解決了這個(gè)問(wèn)題。
WinRT 形式的 COM 使用的元數(shù)據(jù)格式和通用語(yǔ)言運(yùn)行時(shí)(Common Language Runtime)相同。這些信息存儲(chǔ)在表示結(jié)構(gòu)的 WINMD 文件中,盡管沒(méi)有實(shí)現(xiàn),但在所有公有類中都會(huì)有。FXCop 被用于檢驗(yàn)這些文件所暴露的 API 是否遵循 .NET Framework 的設(shè)計(jì)指南。
.NET 在最開(kāi)始時(shí)就有“API 設(shè)計(jì)委員會(huì)(API Design Board)”。受此啟發(fā),Windows 運(yùn)行時(shí)也會(huì)建立 API 設(shè)計(jì)委員會(huì)來(lái)對(duì)其進(jìn)行管理。很多最初的成員都在 .NET 委員會(huì)中,并且很多指南都直接來(lái)自于 .NET 基本類庫(kù)所遵循的原則。
Windows 運(yùn)行時(shí)會(huì)返回 HRESULT,而不會(huì)拋出異常。對(duì)于眾所周知的 HRESULT 值來(lái)說(shuō),會(huì)拋出相應(yīng)的異常,而對(duì)于其他值就只能拋出 COMException。
WinRT 的 IAsyncOperation 接口現(xiàn)在使用新的 async/await 關(guān)鍵字,就像 .NET 的 Task 對(duì)象一樣。
所有 Windows 運(yùn)行時(shí)的集合接口都被映射到 .NET 框架的等價(jià)物上。在 .NET 4.5中添加了 IReadOnlyList 和 IReadOnlyDictionary,用來(lái)負(fù)責(zé)處理 WinRT 中的只讀集合。
WinRT 和 .NET API 在兩個(gè)地方無(wú)法匹配。WinRT 的 stream 無(wú)法直接與 .NET 的 IO.Stream 類兼容,但是可以調(diào)用名為 AsStream 的擴(kuò)展方法來(lái)進(jìn)行轉(zhuǎn)換。WinRT 還擁有名為 IBuffer 的接口,這在 .NET 中也無(wú)法簡(jiǎn)單地實(shí)現(xiàn)。在此也有一個(gè)擴(kuò)展方法來(lái)進(jìn)行 IBuffer 和比特?cái)?shù)組之間的轉(zhuǎn)換。
我們可以使用 C# 和 VB 來(lái)創(chuàng)建新的 Windows 運(yùn)行時(shí)程序庫(kù),過(guò)程非常簡(jiǎn)單。為了把類暴露為 Windows 運(yùn)行時(shí)組件,我們只需要把項(xiàng)目類型設(shè)置為“WINMD 文件”,并確保遵循以下規(guī)則:
- API 簽名只使用 Windows 運(yùn)行時(shí)的類型
- 結(jié)構(gòu)體只能擁有公有的數(shù)據(jù)字段
- 只允許對(duì) XAML 控件使用繼承,其它類型都必須使用 sealed 關(guān)鍵字。
- 只支持內(nèi)建的泛型
編譯這些庫(kù)之后,我們就可以在 C++ 和 JavaScript 中調(diào)用它們,就像從 .NET 中調(diào)用一樣簡(jiǎn)單。
警告
由于 WinRT 是基于 COM 構(gòu)建的,所以你同樣會(huì)有引用計(jì)數(shù)和 mark-and-sweep 垃圾回收器之間無(wú)法融合的問(wèn)題。對(duì)于實(shí)現(xiàn)了析構(gòu)函數(shù)釋放非內(nèi)存資源的對(duì)象來(lái)說(shuō),這是最常見(jiàn)的問(wèn)題。我們可以考慮調(diào)用“Marshal.FinalReleaseComObject”來(lái)解決問(wèn)題,但是那本身也存在問(wèn)題。
COM 風(fēng)格的 marshaling 需要在 .NET 和本地組件之間調(diào)用。盡管這通常是無(wú)關(guān)緊要的,但是如果 API 非常不正式,那么就會(huì)出現(xiàn)問(wèn)題。
內(nèi)建的 WinRT 庫(kù)(而不是 XAML)是在 Metro 運(yùn)行時(shí)環(huán)境之外提供的。然而,第三方的 WinRT 庫(kù)并非如此。這是 WinRT 中激活框架(activation framework)的限制,而不是 .NET 的問(wèn)題。
NET技術(shù):可供C#和Visual Basic調(diào)用的WinRT API,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。