WinRTをデスクトップ・アプリから使用するのに必要な準備作業は、「マネージデスクトップアプリとWindowsランタイム」に書かれている。何の作業が必要かを次に列挙する。
では、具体的な作業を説明していく。
Visual Studio 2012のIDEを起動して、次の画面のように[新しいプロジェクト]ダイアログで「コンソール・アプリケーション」を作成する*2。
*2 言語は、Visual C#かVisual Basicを選ぶ。.NET Frameworkのバージョンは必ず「4.5」を選択する必要がある。なお、当然ながらWindows 8上で開発する必要がある。
次に、[ソリューション エクスプローラー]を使ってプロジェクトのコンテキスト・メニューより、[プロジェクトのアンロード]を行う(次の画面を参照)。
アンロードしたプロジェクトのコンテキスト・メニューより、[編集−<プロジェクト・ファイル名(この例では「ConsoleApplication1.csproj」)>]を使ってプロジェクト・ファイルの編集モードに切り替える(次の画面はその例)。
Visual Studioのコード・エディタを使って、次のコード例のように<TargetPlatformVersion>ノードを追加して、値に「8.0」を設定する。
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{1C7B3AE7-5AA0-4328-8698-017DA8B9D1C8}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ConsoleApplication1</RootNamespace>
<AssemblyName>ConsoleApplication1</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>
<TargetFrameworkVersion>タグを追加して上書き保存すれば、プロジェクト・ファイルの編集は終了となる。これでWinRTを使用するプロジェクトの準備ができたので、再度[ソリューション エクスプローラー]のコンテキスト・メニューを使って[プロジェクトの再読み込み]を行っておこう。
リスト1はVisual C#プロジェクトの例だが、Visual Basicプロジェクトでも変わらない。筆者のお勧めは、<TargetFrameworkVersion>タグが存在する<PropertyGroup>の終了タグの直前に追加することだ。理由は、今回の機能がWindows 8限定で、.NET Framework 4.5のみであり、双方を対の関係で管理すべきと考えるからだ。もちろん、「マネージデスクトップアプリとWindowsランタイム」に書かれているように次に示すコードを追加してもよい。
<PropertyGroup>
<TargetPlatformVersion>8.0</TargetPlatformVersion>
</PropertyGroup>
次に、ソリューションエクスプローラーを使って[参照設定]−[参照の追加]*3をクリックして、次に示すライブラリへの参照設定を行う(次の画面はそれを実際に行っているところ)。
*3 Visual Basicでは、[ソリューション エクスプローラー]でプロジェクト項目のコンテキスト・メニューより[参照の追加]を選択して[参照マネージャー]ダイアログを表示する。
*4 「%ProgramFiles(x86)%」の部分は、64bit版Windowsでは「C:\Program Files(x86)」に、32bit版Windowsでは「C:\Program Files」になる。使用しているOSによって、各自で読み替えてほしい。
WinRT(厳密にはWindows.winmdファイル)への参照を追加したら、次にSystem.Runtime.dllファイルへの参照を追加するために[参照マネージャー]ダイアログの[ブラウズ]タブを使用する(次の画面を参照)。
これでWinRTを使用する準備の完了である。次は、WinRTの使い方を説明していく。
WinRTを使用するには、「%ProgramFiles(x86)%\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd」ファイルへの参照を必要する。Windows.winmdファイルのバージョンは「255.255.255.255」というマジック・ナンバーになっている。また、WinRTの実体となるメタデータは、「%SystemRoot%\System32\WinMetadata」フォルダに存在する。さらに、WinRTの実際のライブラリ群はネイティブ・コードとして「%SystemRoot%\System32」フォルダに存在している。これらのファイル群に対して、開発時に使用するメタデータが「Windows.winmd」というアセンブリになるわけだ。つまり、開発したプログラムの実行ではWindows.winmdファイルを使用しないという仕組みになっているのだ。
また、System.Runtime.dllファイルについては「%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades」フォルダの中にあるアセンブリを参照するのだが、「Facades」というフォルダ名から類推できるように実行時に使用するアセンブリではなく、開発用に使用するアセンブリとなっている(Facadeとは「建物の正面や一面」といった意味。この場合は、実際のアセンブリ群へアクセスするための玄関的な意味合いで使われている)。Facadesフォルダに配置されているアセンブリは、メタデータのみを持つもので、ビルド時にアプリを使用する環境に応じたアセンブリを参照するように参照情報が解決される仕組みになっているのだ。この理由から、プロジェクト・ファイルのReferenceノードを確認すると「Include="System.Runtime"」となっており、アセンブリに対するパス情報が含まれないのだ。もし、ビルド時にアセンブリに関するエラーが表示されるケースに出会ったら、プロジェクト・ファイルのReferenceノードを修正するか、参照設定をし直してほしい。
WinRTは、メタデータによって将来のバージョン変更に備えるとアナウンスがされている。バージョン番号がマジック・ナンバーになっていることから、将来のバージョン変更がどのように実現されるかは現時点では不確定と考えるのが得策だと思われる(これは、所属する組織の公式見解ではなく、筆者個人の考えだ)。なぜならば、現時点の仕組みを理解しておくことで、将来的に発生する問題を調べるときに役立つと筆者が信じているからである。
Copyright© Digital Advantage Corp. All Rights Reserved.