この記事は機械翻訳されたものです。

Windows ランタイム

Windows ランタイムを使用したアプリ開発を再考する (機械翻訳)

Jason Olson

 

Windows アプリケーションの開発と新しい Windows 機能選択したプログラミング言語を使用して常にシンプルでわかりやすいされていません。 Windows 8 では、最高の経験を持ち、Windows 上の最高のアプリを作成する開発者を支援するお客様には、エンド-エンドの開発を向上させることに必要な投資は Windows 上経験します。 これらの投資の中心には、Windows のランタイム (WinRT) です。

Windows のランタイムは、Windows の開発者の作業の reimagining の一部です。 それ Windows 8 の新しい Windows Store のアプリを作成に使用される現代の Windows API 表面です。 同様にいくつかの主要なプログラミング言語をサポートするまで Windows ランタイムが地上から設計 (c#/Visual Basic、JavaScript および C++)、開発者は、既存の能力を思慮深く、一貫して設計された API 表面を提供し、開発者ツール チェーンに深く統合するための資産を活用するを許可します。

Windows のランタイム言語を選択をできます。

そこのアプリの開発者が多い。 彼らは、JavaScript、HTML、CSS を使用する開発者は、c# を使用して、Web アプリを作成する開発者から範囲/を Microsoft .NET Framework のネイティブ コードの開発者にアプリを作成する Visual Basic と C++ のアプリを作成します。 Windows ランタイム Windows の店の apps はこれらの言語のプログラミング、これらすべての偉大な Windows アプリケーションを開発する開発者に示すように権限を与えるに書き込むことができます図 1

The Windows Runtime Enables New Windows Store Apps to Be Written in Many Languages
図 1 Windows ランタイム Windows ストアの新しいアプリケーションを多くの言語で書き込むことができます。

これは、開発者と消費者の両方に有益です。 開発者は、開発途上の Windows ストアのアプリによってお金を稼ぐための巨大な市場機会です。 すべての主要な Microsoft 言語のサポートにより、膨大な数の開発者のアプリの消費者が購入し、使用したい偉大な Windows を作成することが可能します。

開発者として、あなたは既存のスキルがあるとプログラミング言語の選択の経験あなたの特定の。 あなたも多くのアプリ (既存のコード、ビルド インフラストラクチャなど) を開発するときを使用して既存の資産があります。 完全に新しいプログラミング言語ととき、すでにプログラミング言語、マイクロソフトによって提供される開発ツールの豊富なセット、単に Windows ストア アプリケーションに Windows 8 開発ツールセットを学ぶ必要はなりません。

Windows のランタイムに精通し自然です。

C 支配的なプログラミング言語では、例外に基づくコードは一般的ではなかったときにバインドされている 1 つの言語が Windows OS の許容されたときだったとき、以前の Windows の開発経験が設計されました。 今日の近代的な開発の世界はかなり異なっています。 名前空間、コレクション、イベントなどの機能をプログラミング、非同期性というように今日は一般的ではありません、彼らが期待しています。

一般的なデバイスの 1 つは今日上の 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 は、.lib ファイルに対して、API を使用してコードのリンクも含まれて。 Windows Api は C または C++ では、ネイティブ COM コンポーネント、またはネイティブのフラット C 関数として実装され Windows の一部として出荷された .dll ファイルにパッケージ化します。 プログラミング モデルは、ネイティブ パフォーマンスを念頭に設計されました。

名前空間、現代的なコレクションまたは真の例外がないです。 IntelliSense、コードの参照、名前空間の不足などの問題があったとも古典的なネイティブ開発者の開発経験を理想的なではなかった。

この純粋なネイティブ プラットフォームの .NET 開発者向けの Windows Api を使用して示すようにしようとして本物のユーザビリティの問題を提示図 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 を含むこのギャップに対処するためです。 net を Vista の橋のサンプル ライブラリ (code.msdn.microsoft.com/VistaBridge) と、Windows API コード パックの Microsoft .NET Framework (code.msdn.microsoft.com/WindowsAPICodePack)。

今、Windows 8 であなた Windows Api、箱から出して一日の Windows 船他の Api、アプリを今日使用、正確な同じ方法使用できます (のような .NET Framework は c#/Visual 基本的な開発者)。 コードは、コードと伝統的な 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 Framework に既に記述コードから多くの異なる。 名前空間があります。 クラスとコンス トラクターです。 メソッドとプロパティがあります。 彼らは .NET Framework では、我々 はまた非同期プログラミングに await キーワードを使用するため、識別子 pascal です — すべて、開発者期待今日 c# および Visual Basic を使用してコードを記述する場合。

同様に、c#/Visual Basic の開発経験、C++ の名前空間、クラス、コンス トラクター、メソッド、およびプロパティを使用します。 (以前の Win32 データ型) ではなく文字列などの組み込みの C++ 型を使用することもできます。 標準の演算子など、"::""->"と他の人にも期待どおりに使用されます。 非同期プログラミングには、同時実行ランタイムのような経験を提供します。 ここで非同期に RSS を取得するために C++ コードは、次のとおりです。

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 で自然と JavaScript 開発者におなじみのためにすべてのメソッドとプロパティがキャメル ケースにあることがわかります。 使用我々 も約束フレームワーク匿名関数を非同期コードを記述しています。 私たちもここの言語の組み込み型を活用し続けます。

開発者の経験はまた使い慣れたツール開発者の期待などの IntelliSense 機能および ILDASM と .NET Reflector などの標準ツールに機能して、です (を参照してください図 3)。

Visual Studio IntelliSense for WinRT APIs
図 3 の Visual Studio の IntelliSense WinRT Api

Windows ランタイムこの自然でおなじみのエクスペリエンスを拡張し、.NET および COM クラスのコンス トラクター、静的変数、イベントなど、WinRT Api にモダンなセマンティクスを追加するから基礎的な概念を組み合わせることによってことができます。 これらのセマンティクスは、すべてに応じて何自然であり、その言語の開発者におなじみの異なる言語からさまざまな方法で公開できます。

これは、プログラミング言語を介して Windows ランタイムの API の公開方法を知っているを使用してメタデータすべて WinRT Api を含めるためにです。 WinRT メタデータ ファイルは、.NET メタデータ形式の更新バージョンを使用します。 それすべて単一の Windows 8 のマシンにインストールされているために、このメタデータはすべての開発者に利用可能です。

Windows API の開発面を考え直しで、学習や新しいプラットフォームを使用してのようなを感じることはありません。 それは「エイリアン」感じていません。それは、見えるし、まで書いてきたコードのような感じています。 既存のスキルと新しい Windows Store のアプリを作成するときがある資産を活用しています。

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 を 1 回デザインを学び、その後 Windows API 表面全体の異なる Api を使用する場合の知識を適用できます。

Windows 開発センター (dev.windows.com)、これらの分野のほとんどをカバーする多くのサンプルを見つけることができます。 次は、いくつかの例です。

契約ユーザーをさせることができます彼らは検索魅力を選択し、[検索] ウィンドウで候補を表示するとき、あなたのアプリケーション内で検索します。 あなたのアプリケーションも共有魅力を介して別のアプリケーションでコンテンツを共有できます。 次にいくつか例を示します。

  • 検索契約のサンプル: bit.ly/QxsLQk
  • コンテンツ ソースのアプリケーションのサンプルを共有する: bit.ly/H10Nd0
  • 共有アプリケーションのコンテンツ ターゲットのサンプル。 bit.ly/HeuMOL

社会 Windows.ApplicationModel.Contacts 名前空間からクラスを使用して、連絡先ピッカーの起動し、連絡先を取得します。 連絡先に他のアプリを供給するのに必要があるアプリケーションでは、連絡先のコレクションを作成するのに ContactPickerUI クラスを使用できます。

  • 連絡先ピッカーのアプリのサンプル: bit.ly/OFsebV

メディア簡単なメディアの再生とトランスコーディングのメディアとメディアの再生を再生する契約を介して外部デバイスへのメディアのキャプチャから、Windows.Media 名前空間の Windows Api を見つけることができます。

  • XAML メディア再生のサンプル: bit.ly/RPlk4q
  • HTML メディア再生のサンプル: bit.ly/NwMjPL
  • サンプルは、メディアを再生する: bit.ly/OYIZTg
  • トランス メディア サンプル: bit.ly/NevTxK
  • キャプチャ メディア キャプチャ デバイスのサンプルを使用します。 bit.ly/HHb76Z

セキュリティ 、資格情報 (たとえば、シングル サインオンをサポートする) 必要があります Api に渡すことができる資格情報を取得できます。 クレジット カード口座、銀行口座およびソフトウェア製品を保護するために、ローカル コンピューター上の個人情報を安全に格納するのにパスワード ベースの強力な暗号化を使用することもできます。 Windows.Security.Cryptography 名前空間を使用して暗号化のさまざまな形式を実行することもできます。

ネットワーク/Web ユーザー データグラム プロトコル (DatagramSocket を使用して UDP 経由で) 接続する StreamSocket クラスを使用して TCP を経由してネットワークに接続しているかどうか、または単に照会するかどうかいくつかのアプリケーションのデータを Web サービスに保存することができますまたはそれをローカルに保存する必要がある情報ステータス ネットワー キングのため、Windows.Networking 名前空間に必要なものを見つけることができます。

これは Windows 実行時に、すべての機能はもちろんありません。 Windows の開発者としては、利用可能な多くの機能があるし、調べることができます Windows の開発センターでさらに bit.ly/yyJI2J

Windows のランタイムです高速流体 (ネイティブおよび非同期)

Windows ランタイム最下位レベルでは、バイナリの契約とネイティブ オブジェクトとして実装されますが、メタデータ、共通型システム、共有イディオムを通じて世界にさらされています。 WinRT Api は、前に示したよう以前の Windows Api の高速パフォーマンス機能はまた、現代の開発経験を提供しながら提供してまいります。

流体と応答性を維持するためのアプリは、別の課題です。 私たち人間は本能的、どのように我々 は私たちに対応するアプリを期待には直接影響マルチタスクします。 すべての対話に応答するアプリを期待します。 私たちは私たちのお気に入りのニュースをアプリを使用すると、我々 は、ニュース フィード、ニュース記事を読むのニュース記事をようにを保存を追加します。 我々 もアプリの最新の記事をインターネットから取得は、これらすべてのものを行うことができるはずです。

我々 はタッチを使用するアプリケーションと相互作用しているとき、これは特に重要になります。 我々 は、アプリは"私たちの指に固執しない場合は「気づきます。 マイナーなパフォーマンスの問題は私たちの経験が低下し、高速かつ流体感を破る。

多くの近代的なアプリ社会の Web サイトに接続、他のガジェットとデバイスは、通信し、ように、データをクラウドに保存、ハード ディスク上のファイルを使用します。 これらのソースのいくつか予期しない遅延が困難な高速で、流体のアプリを作成するがあります。 正しく構築されていない限り、アプリの外部環境を待っているより多くの時間と、ユーザーのニーズに応えるより少ない時間を過ごします。

この接続の世界に対処する Windows ランタイムのコア原則です。 開発者は「成功のピット」に落ちる必要があります (を参照してください bit.ly/NjYMXM) の世界に接続しているアプリを作成するとき。 これを実現するには、I/O バインドまたは実行時間の長い可能性のある Api は Windows の実行時に非同期です。 これらは目に見えて同期的に書かれた場合のパフォーマンスが低下する可能性が最も高い候補です (たとえば、彼らは可能性が高い実行する 50 ms よりもかかることが)。 この非同期アプローチの Api には、高速であり、既定で流体および Windows ストアのアプリを開発するときにアプリケーションの応答性の重要性を促進する書き込みコードまでを設定します。

詳細については、Windows の実行時の非同期の性質を理解するには、ブログの記事を読むことができます"アプリ高速と流体 Windows 実行時に、非同期性が維持する「 bit.ly/GBLQLr

Windows ランタイム ハイブリッド アプリケーションことができます。

Windows のランタイムの強力な機能は、あなたのアプリケーションを作成するを選択するプログラミング言語によって制限されていないことです。 あなたは、ライブラリとそのプログラミング言語環境で使用できるコードだけに限定されていません。 ライブラリまたは最高のコンポーネントをその仕事に向いて、言語を使用できます。 それは、オープン ソースのライブラリがあります。

どのような場合、JavaScript、HTML、CSS とのゲームを書いているし、非常に高速の物理ライブラリをか? Box2D C++ で使用できます。 Javascript の Windows ストアのアプリを書くと zip 形式のファイルをいくつかの仕事をしたいですか? 圧縮機能は、.NET Framework で簡単な方法で使用できます。 C# やしたい新しい Windows ストア音楽アプリを作成するいくつかのオーディオ プログラミング下位を行うか? いいえ問題は、Xaudio または WASAPI C++ でだけ使用します。 これらの機能を示す図 5

The Windows Runtime Enables Hybrid Apps
図 5 Windows ランタイム ハイブリッド アプリケーションことができます。

C# で記述された XAML を使用して例のソフトウェア シンセサイザー アプリを見てみましょう。 Xaudio オーディオ バッファーの直接制御に活用するんだいくつかのクールなフィルターのサポートを追加したいと思います。 C + 使用する c++/cli CX を c# プロジェクトに公開される Api を構築します。

まず、単純な WinRT ラッパーを公開したい Xaudio 機能作成 (を参照してください図 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"および「密封」のキーワードをクラス宣言。 これは単に C + でパブリック WinRT クラスを宣言する方法です + CX。 これは JavaScript、c# や Visual Basic などの他の言語からこのクラスを使用できます。 このマネージ C++ または C + ではないことに注意してくださいすることが重要である c++/cli 共通言語基盤 (CLI)。 これは、Microsoft 中間言語をコンパイルされていない; これは、ネイティブ コンポーネントを通じてです。

また、クラスのパブリックな機能 (メソッド、プロパティ) が C++ の組み込み型または WinRT 種類に限られていることがわかります。 それらは、WinRT コンポーネントにおける言語の境界を横断するを許可種類のみです。 ただし、WinRT のコンポーネントの実装では出来る限り既存の C++ ライブラリ (たとえば、標準テンプレート ライブラリ) を使用できます。

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、私は、オーディオ エンジンを配線する Windows SDK の Windows ストア アプリケーションで使用できる Xaudio2 COM Api を使用しています。 さらに、私の 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 8 Windows ストアのアプリを作成するの中心にです。 それを Windows の店の apps を作成する強力なプラットフォームを提供します。 Windows のランタイムは一貫した、思慮深いデザインと機能が豊富で、開発の表面を提供します。 かどうか君は JavaScript 開発者は、c#/Visual 基本的な開発者または C++ 開発者は、今すぐ Windows 8 のための新しい Windows Store のアプリを作成 Windows 開発者をすることができます。

Frequently Asked Questions

Q。 Windows のランタイムは CLR または Microsoft .NET Framework なりますか。

**A.**号 Windows のランタイムは、.NET Framework またはその他のフレームワークは置き換えられません。 C# の Windows ストア アプリケーションをビルドすると、コードは CLR を使用して実行中です。 それだけでなく、.NET Framework (として Win32 と COM) のサブセットを Windows ストアのアプリを構築するときに使用できるかではないです。

Q。 C++ での Windows の店の apps を書くときに、私が C + 使っているように c++/cli CLI ですか?

**A.**号 Windows 実行時の Windows ストアのアプリを使用してコードを書かれて C + を使用して c++/cli CX。 C + のような見えるかもしれませんが c++/cli CLI 最初は本当にネイティブです。 ガベージ コレクションまたはその他 C + を紹介しません c++/cli CLI 機能をネイティブ アプリケーションに。

Resources

詳細については、次のリソースをチェック アウト:

  • Windows ストアのアプリのサンプル: dev.windows.com
  • 「アプリを高速に保つ流体との非同期 Windows ランタイムに」: bit.ly/GBLQLr
  • 「Windows のランタイム コンポーネントの c# および Visual Basic で作成」。 bit.ly/OWDe2A
  • 「Windows ランタイム コンポーネントは C++ で作成:」 bit.ly/TbgWz7
  • Windows ストアのアプリの API リファレンス: bit.ly/zdFRK2

Jason Olson Windows ランタイムは、マイクロソフトが取り組んでシニア プログラム マネージャーです。 彼は Windows で動作していないときに、彼は、シアトル周辺のピアノ演奏と彼の妻と 2 人の少年との時間を費やして見つけるができます。

この記事のレビュー、次技術専門家のおかげで。ノエル クロス、サラ Kancherla イネス Khelifi、ジョン ・ ラムは、マーティン ・ ラヴェル、ハリー ・ ピアソン、マヘシュ Prakriya、スティーブ ・ ロウ