一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

  英文原文: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ī)則:

  1. API 簽名只使用 Windows 運(yùn)行時(shí)的類型
  2. 結(jié)構(gòu)體只能擁有公有的數(shù)據(jù)字段
  3. 只允許對(duì) XAML 控件使用繼承,其它類型都必須使用 sealed 關(guān)鍵字。
  4. 只支持內(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)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99精品国产成人一区二区 | 美女扒开下面无遮挡免费视频 | 国产成人激情 | 成人在线激情网 | 国产精品被窝福利一区 | 国产真实伦正在播放 | 九九精品视频在线 | 国产欧美性综合视频性刺激 | 色偷偷7777www人| 免费一区二区三区在线视频 | 黄色免费在线观看视频 | 久久综合久久88 | 国产综合成人观看在线 | 日韩在线一区二区三区免费视频 | 视频一区 精品自拍 | 五月婷婷在线观看 | 玖玖精品在线视频 | 国产日韩一区二区三区在线播放 | 91系列在线观看 | 精品中文字幕在线 | 久久免费久久 | 国产剧情一区二区 | 欧美亚洲国产成人精品 | 加勒比高清在线 | 欧洲美女高清一级毛片 | 欧美成人天天综合在线视色 | 亚洲综合区图片小说区 | 激情亚洲婷婷 | 69热精品视频在线看影院 | 一区二区在线观看视频 | 久久久久久久网站 | 精品国产一区二区三区四 | 最新香蕉97超级碰碰碰碰碰久 | 国产亚洲一区二区在线观看 | 在线一区二区观看 | 我要看三级全黄 | 色94色欧美一区 | 亚洲黄色小说视频 | 国产高清美女一级a毛片久久 | 婷婷综合久久狠狠色99h | www.亚洲精品.com |