中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

可供C#和Visual Basic調(diào)用的WinRT API

  英文原文:C# and Visual Basic on the WinRT API

  (作者:Jonathan Allen 譯者:侯伯薇

  盡管我們可以使用 .NET 語言來調(diào)用 Win32 API,但那樣做會(huì)很困難。所以在過去的兩年間微軟一直在構(gòu)建替代的方案,它就是實(shí)現(xiàn)了跨語言支持的 Windows 運(yùn)行時(shí),即 WinRT。我們可以在 C++ 和 .NET 中創(chuàng)建 WinRT 組件,并且可由二者以及 JavaScript 使用。

  盡管 COM 在表面上是一種基于 OOP 的框架,但它與 .NET 之間有很大的區(qū)別。在 WinRT 出現(xiàn)之前,COM 是基于接口而不是基于類的。這意味著其中缺少很多 .NET 開發(fā)者認(rèn)為應(yīng)該有的內(nèi)容,像構(gòu)造函數(shù)以及靜態(tài)方法等。C++組件擴(kuò)展解決了這個(gè)問題。

  WinRT 形式的 COM 使用的元數(shù)據(jù)格式和通用語言運(yùn)行時(shí)(Common Language Runtime)相同。這些信息存儲在表示結(jié)構(gòu)的 WINMD 文件中,盡管沒有實(shí)現(xiàn),但在所有公有類中都會(huì)有。FXCop 被用于檢驗(yàn)這些文件所暴露的 API 是否遵循 .NET Framework 的設(shè)計(jì)指南。

  .NET 在最開始時(shí)就有“API 設(shè)計(jì)委員會(huì)(API Design Board)”。受此啟發(fā),Windows 運(yùn)行時(shí)也會(huì)建立 API 設(shè)計(jì)委員會(huì)來對其進(jìn)行管理。很多最初的成員都在 .NET 委員會(huì)中,并且很多指南都直接來自于 .NET 基本類庫所遵循的原則。

  Windows 運(yùn)行時(shí)會(huì)返回 HRESULT,而不會(huì)拋出異常。對于眾所周知的 HRESULT 值來說,會(huì)拋出相應(yīng)的異常,而對于其他值就只能拋出 COMException。

  WinRT 的 IAsyncOperation 接口現(xiàn)在使用新的 async/await 關(guān)鍵字,就像 .NET 的 Task 對象一樣。

  所有 Windows 運(yùn)行時(shí)的集合接口都被映射到 .NET 框架的等價(jià)物上。在 .NET 4.5中添加了 IReadOnlyList 和 IReadOnlyDictionary,用來負(fù)責(zé)處理 WinRT 中的只讀集合。

  WinRT 和 .NET API 在兩個(gè)地方無法匹配。WinRT 的 stream 無法直接與 .NET 的 IO.Stream 類兼容,但是可以調(diào)用名為 AsStream 的擴(kuò)展方法來進(jìn)行轉(zhuǎn)換。WinRT 還擁有名為 IBuffer 的接口,這在 .NET 中也無法簡單地實(shí)現(xiàn)。在此也有一個(gè)擴(kuò)展方法來進(jìn)行 IBuffer 和比特?cái)?shù)組之間的轉(zhuǎn)換。

  我們可以使用 C# 和 VB 來創(chuàng)建新的 Windows 運(yùn)行時(shí)程序庫,過程非常簡單。為了把類暴露為 Windows 運(yùn)行時(shí)組件,我們只需要把項(xiàng)目類型設(shè)置為“WINMD 文件”,并確保遵循以下規(guī)則:

  1. API 簽名只使用 Windows 運(yùn)行時(shí)的類型
  2. 結(jié)構(gòu)體只能擁有公有的數(shù)據(jù)字段
  3. 只允許對 XAML 控件使用繼承,其它類型都必須使用 sealed 關(guān)鍵字。
  4. 只支持內(nèi)建的泛型

  編譯這些庫之后,我們就可以在 C++ 和 JavaScript 中調(diào)用它們,就像從 .NET 中調(diào)用一樣簡單。

  警告

  由于 WinRT 是基于 COM 構(gòu)建的,所以你同樣會(huì)有引用計(jì)數(shù)和 mark-and-sweep 垃圾回收器之間無法融合的問題。對于實(shí)現(xiàn)了析構(gòu)函數(shù)釋放非內(nèi)存資源的對象來說,這是最常見的問題。我們可以考慮調(diào)用“Marshal.FinalReleaseComObject”來解決問題,但是那本身也存在問題。

  COM 風(fēng)格的 marshaling 需要在 .NET 和本地組件之間調(diào)用。盡管這通常是無關(guān)緊要的,但是如果 API 非常不正式,那么就會(huì)出現(xiàn)問題。

  內(nèi)建的 WinRT 庫(而不是 XAML)是在 Metro 運(yùn)行時(shí)環(huán)境之外提供的。然而,第三方的 WinRT 庫并非如此。這是 WinRT 中激活框架(activation framework)的限制,而不是 .NET 的問題。

NET技術(shù)可供C#和Visual Basic調(diào)用的WinRT API,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品一区二区三区四区五区 | 国产高清一区二区 | 色综合久久天天综合网 | 国产精品欧美一区二区 | 96国产精品久久久久aⅴ四区 | 91久久国产精品 | 久久在线 | 久久9999久久 | 狠狠婷婷综合久久久久久妖精 | 久久久天天 | 日韩无 | 国产精品亚洲片在线播放 | 亚洲欧美在线一区 | 国产成人免费 | 日本精品久久久久久久 | 久草视频观看 | 草草视频在线播放 | 一区二区三区四区免费观看 | 国产精品成人一区二区三区 | 97视频在线观看免费 | 亚洲欧美日韩在线一区二区 | 亚洲福利网 | 欧美一区二区三区在线播放 | 99精品亚洲国产精品久久不卡 | 亚洲欧美国产毛片在线 | 久久久久国产一区二区三区 | 欧美xxxx性xxxxx高清 | 精品久久久久久久久久久 | 日韩精品久久 | 婷婷五月色综合香五月 | 综合久久99 | 精品国产乱码久久久久久88av | 国产一区三区在线 | 亚洲h在线观看 | 玖玖视频免费 | 国产精品久久久久一区二区三区 | 午夜天堂精品久久久久 | 久久亚洲国产精品 | 偷派自拍 | 欧美a级成人淫片免费看 | 99国产精品99久久久久久粉嫩 |