アプリ ブローカーの作り方 1
サイド ローディングされた Windows ストア アプリのための Windows ランタイム コンポーネント ブローカー ホワイトペーパーに記載されている アプリ ブローカーの作り方を解説します。
最初に、Windows ランタイム コンポーネントを作成します(ホワイト ペーパーでは、コントラクトの定義となっている箇所です)。
C# で新規プロジェクトを作成します。
[Visual C#]-[ストア アプリ]-[Windows アプリ]-[Windows ランタイム コンポーネント] テンプレートを選択します。ソリューション エクスプローラーでプロジェクトをアンロードします。
プロジェクト ファイルを編集します。
<TaergetPlatformVersion>要素の下に、以下のコードを追加します。<ImplicitlyExpandTargetFramework>false</ImplicitlyExpandTargetFramework>
次にホワイト ペーパーに記載されているように参照設定(ReferencePath要素)を追加します(デスクトップ IPC サーバーの詳細に記載されています)。この作業によって、コア プロファイル(Windows ストア アプリ)とデスクトップ プロファイル(デスクトップのライブラリを使用)が1つのプロジェクトで混在することになります。
プロジェクト ファイルを上書き保存してから、プロジェクトを再読み込みします。
プロジェクト プロパティから、[ビルド]-[すべての構成]-[条件付きコンパイル シンボル]より「;WINDOWS_APP」を削除します。
NETFX_CORE のみになります。プロジェクト プロパティから、[ビルド イベント]-[ビルド後に実行するコマンド ライン]に以下のコマンドを登録します(コントラクトの定義に記載されています)。
call "$(DevEnvDir)..\..\vc\vcvarsall.bat" x86 REM 実装用のメタデータを格納するフォルダーを作成します md "$(TargetDir)"\impl REM 参照用のメタデータを格納するフォルダーを作成します md "$(TargetDir)"\reference REM 作成済みのファイルを削除します erase "$(TargetDir)\impl\*.winmd" erase "$(TargetDir)\impl\*.pdb" REM 実装用のメタデータとPDBファイルを impl フォルダーへコピーします xcopy /y "$(TargetPath)" "$(TargetDir)impl" xcopy /y "$(TargetDir)*.pdb" "$(TargetDir)impl" REM メタデータよりIDLを作成します winmdidl /nosystemdeclares /metadata_dir:C:\Windows\System32\Winmetadata "$(TargetPath)" REM IDLより各種のファイル(*.h,*_i.c,dlldatata.c,*_p.c)とメタデータを作成します midl /metadata_dir "%WindowsSdkDir%References\CommonConfiguration\Neutral" /iid "$(SolutionDir)SampleProxy\$(TargetName)_i.c" /env win32 /x86 /h "$(SolutionDir)SampleProxy\$(TargetName).h" /winmd "$(TargetName).winmd" /W1 /char signed /nologo /winrt /dlldata "$(SolutionDir)SampleProxy\dlldata.c" /proxy "$(SolutionDir)SampleProxy\$(TargetName)_p.c" "$(TargetName).idl" REM メタデータより参照用のメタデータを作成します。 mdmerge -n 1 -i "$(ProjectDir)bin\$(PlatformName)\$(ConfigurationName)" -o "$(TargetDir)reference" -metadata_dir "%WindowsSdkDir%References\CommonConfiguration\Neutral" -partial
後は、インターフェースの定義と実装コードを記述します。
後は、ホワイトペーパーに記述されているように プロキシ スタブのC++プロジェクトを作成し、アプリ ブローカーを利用するWindows ストア アプリを作成します。作成した Windows ストア アプリをデバッグするには、アプリ ブローカーとプロキシ スタブをインストール先のフォルダーへコピーしてから、ACL(ファイルのアクセス権)を設定して、プロキシ スタブをregsvr32.exeで登録しておく必要があります。
このプロジェクトの構造を簡単にまとめると、以下のようになっています。
- Windows ランタイム コンポーネント プロジェクト
プロジェクト ファイルを編集することで、デスクトップ ライブラリを使用できるようにする。
ビルドのコマンドを使用することで、idlを作成し、IIDを定義したコード、ヘッダーファイル、dlldatata.c、プロキシ コードを作成てから、参照用のWindows メタデータを作成します。 - プロキシ スタブ プロジェクト
Windows ランタイム コンポーネント プロジェクトで作成した各種のファイルとモジュール定義ファイルから、プロキシ スタブ DLLを作成します。
このソリューションの特徴として、C++のコードを書く必要性はありませんが、C++コンパイラ オプションとリンカ オプションの設定を行う必要があります。必要なC/C++のコードは、ユーティリティで自動生成するということです。
実際にデバッグを行うと理解することができますが、サロゲート プロセス(dllhost.exe)がclrhost.dll(CLRのホスト モジュール)を読み込んでから、Windows メタデータを読み込むことで動作します。