Windows 執行階段

透過 Windows 執行階段重創應用程式開發

Jason Olson

 

開發 Windows 應用程式,並使用您選擇的程式設計語言中的新 Windows 功能並不總是簡單易懂。 對於 Windows 8 日有最佳的體驗,並使開發人員能夠創建最佳的應用程式在 Windows 上的客戶,需要作出改善的端到端發展的投資經驗在 Windows 上。 這些投資的核心是 Windows 運行庫 (WinRT)。

Windows 運行時的觸覺系統為 Windows 開發人員的體驗的一部分。 它是用來創建新的 Windows 存儲應用程式上 Windows 8 的現代 Windows API 表面。 Windows 運行時從地面向上設計同樣支援幾種主要的程式設計語言 (C# / Visual Basic、 JavaScript 和 c + +),以使開發人員可以利用他們現有的技能和資產,提供周到一致設計的 API 表面,並深深地融入開發人員工具鏈。

Windows 運行時允許選擇語言

有很多應用程式的開發人員。 他們範圍從使用 JavaScript 和 HTML/CSS 創建 Web 應用程式,開發人員使用 C# 開發人員 / Visual Basic 與 Microsoft.NET 框架,本機開發人員創建的應用程式使用 c + + 創建應用程式。 Windows 運行時允許在任何這些程式設計語言,使所有這些開發者開發優秀的 Windows 應用程式,如中所示編寫 Windows 存儲應用程式圖 1

The Windows Runtime Enables New Windows Store Apps to Be Written in Many Languages
圖 1 Windows 運行時允許新的 Windows 存儲應用程式寫入中許多語言

這是對開發商和消費者都有利。 有為開發商賺錢的發展中國家的 Windows 存儲應用程式的巨大的市場機會。 所有主要 Microsoft 語言支援下,大量的開發人員可用來創建應用程式消費者想要購買和使用的大窗戶。

作為開發人員,您有現有的技能和經驗在您的特定程式設計語言的選擇。 你也有很多在開發應用程式 (如現有代碼、 建設基礎設施等等) 時使用的現有資產。 你不需要瞭解一個完全新的程式設計語言和工具集,只是為了開發 Windows 存儲應用程式在 Windows 8 時已有一套豐富的程式設計語言和開發工具由 Microsoft 提供的。

Windows 運行時都是天然的熟悉

以前的 Windows 發展經驗的目的時 C 是占主導地位的程式設計語言中,當基於異常的代碼並不常見,並當綁定到單個語言是可以接受的 Windows 作業系統。 今天的現代開發世界很大不同。 程式設計命名空間、 收藏、 事件等功能,不同步等等不只是普通今天,他們預計。

讓我們看看今天在 Windows 上使用的更常見的設備之一:網路攝像頭。 這是如何成為網路攝像頭的一部分 API 是以前在 Windows 中聲明:

HWND VFWAPI capCreateCaptureWindow(
  LPCTSTR lpszWindowName,
  DWORD dwStyle,
  int x,
  int y,
  nit nWidth,
  int nHeight,
  HWND hWnd,
  int nID
);

以前的 Windows Api 主要被宣佈在本機標頭檔 (*.h),作為 Windows SDK 的一部分提供。 SDK 還包括針對其與代碼中使用該 API 的.lib 檔。 Windows Api 是在 C/c + + 實施作為本機平 C 函數或本機 COM 元件,打包在一個.DLL 檔案,作為 Windows 的一部分提供。 程式設計模型是以本機方式設計性能方面的考慮。

沒有命名空間、 現代收藏或真正的例外情況。 即使對於經典的本機開發人員開發經驗並不理想,有智慧感知、 代碼流覽、 缺乏的命名空間和更多的問題。

這純粹是本機平臺嘗試使用 Windows Api,如中所示的.NET 開發人員提出真正的可用性問題以及圖 2

圖 2 以前的純粹是本機平臺提交了真正的可用性問題

[DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindow")]
static extern int capCreateCaptureWindow(
  string lpszWindowName, int dwStyle,
  int X, int Y, int nWidth, int nHeight,
  System.IntPtr hwndParent, int nID);
[DllImport("avicap32.dll")]
static extern bool capGetDriverDescription(
  int wDriverIndex,
  [MarshalAs(UnmanagedType.LPTStr)] ref string lpszName,
  int cbName,
  [MarshalAs(UnmanagedType.LPTStr)] ref string lpszVer,
  int cbVer);

有人需要編寫大量的代碼來手動填充您的代碼和傳統的 Windows Api 之間存在的差距。 如果沒人了,你會離開試圖自己編寫這複雜的代碼。 許多開發人員資源特別旨在解決這一差距,包括 pinvoke。 淨,Vista 橋樣本庫 (code.msdn.microsoft.com/VistaBridge) 和 Windows API 代碼包為 Microsoft.NET 框架 (code.msdn.microsoft.com/WindowsAPICodePack)。

現在,利用 Windows 8,您可以使用 Windows Api 開箱天 Windows 船舶,今天在您的應用程式中使用其他 Api 的完全相同的方式 (如.NET 框架為 C# / 視覺基本開發人員)。 代碼不再需要編寫,以填充您的代碼與傳統 Windows Api 之間的差距。 例如,使用網路攝像頭更加簡單地今天是:

using Windows.Media.Capture;
MediaCapture captureMgr = new MediaCapture();
await captureMgr.InitializeAsync();
// Start capture preview; capturePreview
// is a CaptureElement defined in XAML
capturePreview.Source = captureMgr;
await captureMgr.StartPreviewAsync();

那麼,如何供開發人員使用 Windows 運行時自然和熟悉嗎? 因為許多應用程式從互聯網中檢索資料,讓我們審議這一問題在範圍內的一個常見的網路方案:檢索 RSS 饋送。 這裡是 C# 非同步檢索這種飼料的代碼:

var feedUri = 
  new Uri("http://www.devhawk.com/rss.xml");
var client = new Windows.Web.Syndication.SyndicationClient();
var feed = await client.RetrieveFeedAsync(feedUri);
var title = feed.Title.Text;

這裡是等效的 Visual Basic 代碼:

Dim feedUri = New Uri("http://www.devhawk.com/rss.xml");
Dim client = New Windows.Web.Syndication.SyndicationClient();
Dim feed = Await client.RetrieveFeedAsync(feedUri);
Dim title = feed.Title.Text;

根命名空間 (Windows),但沒有多大分別在此代碼中您已經編寫與.NET 框架的代碼。 有的命名空間。 有的類和建構函式。 有的方法和屬性。 識別碼是 Pascal 大小寫,因為它們在.NET Framework 中,並且我們也使用非同步程式設計等待關鍵字 — — 開發人員希望編寫今天使用 C# 和 Visual Basic 代碼時的一切。

類似于 C# / Visual Basic 開發經驗,c + + 使用命名空間、 類、 建構函式、 方法和屬性。 您還可以使用內置的 c + + 類型,例如字串 (而不是以前的 Win32 資料類型)。 標準運算子 (如"::"與"->"和其他人也使用像預期的那樣。 非同步程式設計中,我們提供併發運行時般的體驗。 這裡是 c + + 代碼檢索 RSS 源以非同步方式:

auto feedUri = ref new 
  Windows::Foundation::Uri("http://www.devhawk.com/rss.xml");
auto client = ref new Windows::Web::Syndication::SyndicationClient();
task<SyndicationFeed^> 
  retrieveTask(client->RetrieveFeedAsync(feedUri));
retrieveTask.then([this] (SyndicationFeed^ feed) {
  this->title = feed->Title->Text;
});

最後,還有 JavaScript,顯示了一些有趣的差異,等效代碼中:

var title;
var feedUri = 
  new Windows.Foundation.Uri("http://www.devhawk.com/rss.xml");
var client = new Windows.Web.Syndication.SyndicationClient();
client.retrieveFeedAsync(feedUri).done(function (feed) {
  title = feed.title.text;
});

在 JavaScript 中,您會發現所有的方法和屬性是 camel 大小寫,因為自然和 JavaScript 開發人員熟悉的。 我們編寫非同步代碼時還使用一個承諾框架與匿名函數。 我們繼續以及利用這裡的語言的內置類型。

開發人員的體驗也是,熟悉模具的開發人員希望,例如智慧感知的功能和運作標準工具 (如 ILDASM 和.NET 反射器 (請參閱圖 3)。

Visual Studio IntelliSense for WinRT APIs
圖 3 Visual Studio 智慧感知 WinRT api

Windows 運行時允許此自然熟悉的體驗擴展或合併從.NET 和 COM 將添加到 WinRT 的 Api,如類、 建構函式、 靜態變數和事件的現代語義學的基本概念。 這些語義可以以不同的方式,從不同的語言,都取決於什麼是自然和該語言的開發人員熟悉的暴露。

這是可能的因為所有 WinRT Api 都包括程式設計語言使用瞭解如何通過 Windows 運行時公開的 API 的中繼資料。 WinRT 元資料檔案使用.NET 的元資料格式的更新的版本。 因為它安裝在每個 Windows 8 的單機上,是每個開發人員可以使用此中繼資料。

通過觸覺系統 Windows API 開發表面,它不想學習,或使用一個新的平臺。 它並不感到"外星人"。它的外觀和感覺就像你已經寫的代碼。 要利用現有的技能和您已創建新的 Windows 存儲應用程式時的資產。

Windows 運行時有豐富的功能

Windows 運行時有較少比 Win32 Api,因此很容易瞭解,但它有豐富的功能。 豐富的 Windows 運行時是太多條此大小,完全涵蓋但標準的 Windows 功能和您期望在那裡的新 Windows 8 特徵都存在,如中所示圖 4

The Windows Runtime Includes Standard Windows Features and New Windows 8 Features
圖 4 Windows 運行庫包含標準的 Windows 功能和 Windows 8 的新功能

與 Windows 運行時一貫,使用單一的一組統一的 API 設計準則。 你學的概念與一次與單個 API,設計和使用不同的 Api 的整個 Windows API 表面時,然後應用這些知識。

關於 Windows 開發中心 (dev.windows.com),你會發現許多樣品,涵蓋大部分這些地區。 以下是一些例子。

合同 ,可以讓使用者在您的應用程式時他們選擇搜索魅力和搜索窗格中顯示建議中搜索。 您的應用程式也可以與通過共用魅力的另一個應用程式共用的內容。 以下列舉幾個範例:

社會使用 Windows.ApplicationModel.Contacts 命名空間中的類,您可以啟動連絡人選取器並取得聯繫。 需要提供接觸到其他應用程式的應用程式,您可以使用 ContactPickerUI 類創建連絡人的集合:

媒體從簡單的媒體重播和媒體捕獲,到轉碼的媒體和播放媒體與外部設備通過發揮到合同,你會發現 Windows Api,在 Windows.Media 命名空間:

安全可以檢索憑據,然後可以傳遞給 Api,可能需要憑據 (例如,以支援單一登入)。 您還可以使用基於密碼的增強式加密來安全地存儲在本地電腦保護信用卡帳戶、 銀行帳戶和軟體產品的私人資訊。 您甚至可以執行許多不同形式的加密使用的 Windows.Security.Cryptography 命名空間:

網路/網站是否您要連接到網路通過 TCP 使用 StreamSocket 類,連接通過使用者資料包協定 (UDP) 使用 DatagramSocket,或只網路資訊狀態,以找出是否可以保存一些應用程式資料的 Web 服務,或需要將其本地保存的查詢,您可以找到您的 Windows.Networking 命名空間中的需要:

當然這不是 Windows 運行時) 中的所有功能。 作為 Windows 開發人員,為您提供了更多的功能,可以調查進一步在 Windows 開發中心在 bit.ly/yyJI2J

Windows 運行時快速和流體 (本機和非同步)

Windows 運行時在最低級別實施作為本機物件的二進位合同,但將暴露在通過中繼資料、 公共類型系統和共用的成語世界。 WinRT Api 繼續,同時還提供了一個現代的發展經驗,提供以前的 Windows Api 的快速性能功能,如我前面所示。

保持流體和回應的應用程式是一個不同的挑戰。 我們人類本能地得心應手,這直接影響到我們怎來回應我們的應用程式。 我們期望能符合所有交互的應用程式。 當我們使用我們最喜歡的新聞閱讀程式時,我們想要添加新聞源,閱讀新聞文章保存新聞文章,等等。 我們應該能夠做所有這些事情即使應用程式從互聯網上檢索最新的文章。

我們在應用程式使用觸摸交流時尤其重要。 我們注意到當應用程式不會"粘"到我們的手指。 即使輕微的性能問題會降低我們的經驗,並打破的快速和流體的感覺。

許多現代應用程式連接到社會網站、 在雲計算中存儲資料、 使用硬碟上的檔、 與其他小工具和設備、 通信和等。 這些來源的一些具有不可預知的延遲,這使得創建應用,快速和流體具有挑戰性。 正確生成,除非應用程式花更多的時間等待外部環境和更少的時間回應使用者的需求。

解決此連接的世界是 Windows 運行庫的核心原則。 您開發人員,應落入"成功坑"(見 bit.ly/NjYMXM) 創建的應用程式連接到世界時。 要實現這一目標,潛在 O 綁定或長時間運行 Api 是非同步 Windows 運行庫中。 這些都是最有可能的候選人,明顯地降低性能,如果編寫同步 (例如,他們可能可以比長 50 毫秒執行)。 這種 Api 的非同步方法設置你寫代碼,快速和流體在預設情況下並促進應用程式回應能力的重要性,在開發 Windows 存儲應用程式時。

若要瞭解有關 Windows 運行時的非同步特性的詳細資訊,您可以閱讀博客張貼內容,"保持快速和流體與在 Windows 運行時,不同步的應用程式",在 bit.ly/GBLQLr

Windows 運行時允許混合應用程式

Windows 運行時的強大功能是您不受您選擇創建您的應用程式的程式設計語言。 你並不限於只是圖書館和代碼提供給該程式設計語言環境。 您可以使用該語言、 庫或元件,最好是適合這份工作。 它可能是一個開放源碼庫。

如果您正在編寫遊戲的 JavaScript 和 HTML/CSS 和你想要一個非常快的物理庫嗎? 您可以在 c + + 中使用 Box2D。 寫作與 JavaScript 的 Windows 應用程式商店,想要一些壓縮檔的工作嗎? 您可以簡單地在.NET Framework 中使用 zip 功能。 在 C# 和想要創建一個新的 Windows 存儲音樂應用做一些較低級別音訊節目嗎? 沒問題,只是使用 Xaudio 或 WASAPI c + + 中。 這些功能所示圖 5

The Windows Runtime Enables Hybrid Apps
圖 5 Windows 運行庫允許混合應用程式

讓我們看一下使用 C# 編寫的 XAML 的示例軟體合成器應用程式。 我想要向其中添加一些酷篩選器支援,所以我打算利用 Xaudio 有音訊緩衝區的直接控制。 使用 C + + / CX 打造將向 C# 專案公開的 Api。

首先,創建我要公開的 Xaudio 功能簡單的 WinRT 包裝 (見圖 6)。

圖 6 XAudioWrapper.h

#pragma once
#include "mmreg.h"
#include <vector>
#include <memory>
namespace XAudioWrapper
{
  public ref class XAudio2SoundPlayer sealed
  {
    public:
      XAudio2SoundPlayer(uint32 sampleRate);
      virtual ~XAudio2SoundPlayer();
      void Initialize();
      bool   PlaySound(size_t index);
      bool   StopSound(size_t index);
      bool   IsSoundPlaying(size_t index);
      size_t GetSoundCount();
      void Suspend();
      void Resume();
    private:
      interface IXAudio2*                m_audioEngine;
      interface IXAudio2MasteringVoice*  m_masteringVoice;
      std::vector<std::shared_ptr<ImplData>>  m_soundList;
    };
}

第一,注意到的"公共"用法"ref"和"密封"關鍵字在類聲明中的。 這只是你如何聲明一個公共的 WinRT 類的 C + + / CX。 這將允許您從其他語言 (如 JavaScript,C# 或 Visual Basic 此類使用。 它是重要的是要注意這不是託管 c + + 或 C + + / 公共語言基礎結構 (CLI)。 這不編譯到 Microsoft 中間語言 ; 這是通過和本機組件。

您還會注意類的公共功能 (方法、 屬性和等等) 僅限於 c + + 內置類型或 WinRT 類型。 這些是允許的語言過關 WinRT 元件中的唯一類型。 但是,可以使用現有 c + + 庫 (例如,標準範本庫),就像你想的 WinRT 元件執行。

在 c + + 創建 WinRT 元件的更多詳細資訊,您可以在讀取 Windows 開發中心主題,"創建 Windows 運行時元件在 c + +," bit.ly/TbgWz7

現在,我的課,我已定義的基本介面,讓我們看一些如中所示 (詳細資訊不重要) 的實現的方法快速的看圖 7

圖 7 XAudioWrapper.cpp

XAudio2SoundPlayer::XAudio2SoundPlayer(uint32 sampleRate) :
  m_soundList()
{
  ...
XAudio2Create(&m_audioEngine, flags);
  // Create the mastering voice
  m_audioEngine->CreateMasteringVoice(
    &m_masteringVoice,
    XAUDIO2_DEFAULT_CHANNELS,
    sampleRate
  );
}
bool XAudio2SoundPlayer::PlaySound(size_t index)
{
  //
  // Setup buffer
  //
  XAUDIO2_BUFFER playBuffer = { 0 };
  std::shared_ptr<ImplData> soundData = m_soundList[index];
  playBuffer.AudioBytes = soundData->playData->Length;
  playBuffer.pAudioData = soundData->playData->Data;
  playBuffer.Flags = XAUDIO2_END_OF_STREAM;
  HRESULT hr = soundData->sourceVoice->Stop();
  if (SUCCEEDED(hr))
  {
    ...
}
  ...
}

你要從程式碼片段中注意到圖 7,我用 Xaudio2 COM Api 可用的 Windows 存儲區的 Windows SDK 程式綁定音訊引擎。 此外,我正在使用 c + + 構造和超越只是 WinRT 類型的類型,執行必要的功能。

一旦我已經定義並實施我基本的類,我可以簡單地添加從我的 C# 專案對我的 c + + 專案的引用。 其結果是,從我的 c + + 專案公開的類將成為提供給我的 C# 專案 (見圖 8)。

圖 8 MainPage.cs

using XAudioWrapper;
namespace BasicSoundApp
{   
  public sealed partial class MainPage : Page
  {
    XAudio2SoundPlayer _audioPlayer = new XAudio2SoundPlayer(48000);
    public MainPage()
    {
      this.InitializeComponent();
    }
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
      _audioPlayer.Initialize();
    }
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
      _audioPlayer.PlaySound(0);
    }
  }}

您可以看到雖然 XAudioWrapper 在本機 c + + 編寫的它可以使用猶如一個週期性.NET 類。 我引用的命名空間,具現化元件,開始調用它公開的各種方法 — — 完全不需要任何 DllImports 調用本機代碼 !

沒有邊界。 作為一個 JavaScript 開發者,你不是限於 JavaScript 庫。 作為一個 C# / Visual Basic 開發人員,你不是限於.NET 庫。 與 c + + 開發人員,你不是限於 C/c + + 庫。 你需要經常創建您自己的元件嗎? 也許不是。 但該選項是可用的。

總括來說,Windows 運行時創建 Windows 存儲應用程式在 Windows 8 的核心。 它提供了功能強大的平臺,在其上創建 Windows 存儲的應用程式。 Windows 運行庫提供了一個發展面有一致和周到的設計,豐富的功能。 是否是一個 JavaScript 開發者,C# / 視覺基本開發人員或 c + + 開發人員,您現在可以創建新的 Windows 存儲應用程式的 Windows 8 的 Windows 開發人員。

常見問題集

Q。 對於 CLR 或 Microsoft.NET 框架是 Windows 運行時更換嗎?

**答:**號 .NET 框架或任何其他的框架,並不會取代 Windows 運行庫。 當您生成 Windows 程式商店在 C# 中時,仍然使用 CLR 執行代碼。 不僅如此,.NET 框架 (以及 Win32 和 COM) 的子集可用,您可以建立您的 Windows 存儲應用程式時使用。

Q。 所以在 c + + 編寫 Windows 存儲應用程式,當我使用 C + + /cli CLI 嗎?

**答:**號 編寫代碼使用 Windows 存儲區的 Windows 運行時應用程式是使用 C + + / CX。 雖然看起來像是 C + + /cli 起初的 CLI,它是真正本土。 您不會引入垃圾回收或其他 C + + /cli CLI 功能到本機應用程式。

Resources

有關詳細資訊,請檢查下面的資源:

  • Windows 存儲應用程式示例: dev.windows.com
  • "在 Windows 運行時保持快速和流體與不同步的應用程式": bit.ly/GBLQLr
  • "C# 和 Visual Basic 創建 Windows 運行時元件": bit.ly/OWDe2A
  • "在 c + + 創建 Windows 運行時元件:" bit.ly/TbgWz7
  • 用於 Windows 存儲的應用程式 API 參考: bit.ly/zdFRK2

傑森 · 奧爾森 是在 Microsoft Windows 運行時工作的高級專案經理。當他不工作在 Windows 上時,他可以找到西雅圖區域周圍彈鋼琴和花費的時間與他的妻子和兩個男孩。

由於下面的技術專家對本文的審閱:諾埃爾 · 交叉南塔 Kancherla、 Ines Khelifi、 約翰 · 林、 Martyn Lovell、 哈利 · 皮爾遜、 馬赫什 · Prakriya 和史蒂夫 · 羅