アプリ ブローカーの作り方 1

サイド ローディングされた Windows ストア アプリのための Windows ランタイム コンポーネント ブローカー ホワイトペーパーに記載されている アプリ ブローカーの作り方を解説します。

最初に、Windows ランタイム コンポーネントを作成します(ホワイト ペーパーでは、コントラクトの定義となっている箇所です)。

  1. C# で新規プロジェクトを作成します。
    [Visual C#]-[ストア アプリ]-[Windows アプリ]-[Windows ランタイム コンポーネント] テンプレートを選択します。

  2. ソリューション エクスプローラーでプロジェクトをアンロードします。

  3. プロジェクト ファイルを編集します。
    <TaergetPlatformVersion>要素の下に、以下のコードを追加します。

     <ImplicitlyExpandTargetFramework>false</ImplicitlyExpandTargetFramework>
    
  4. 次にホワイト ペーパーに記載されているように参照設定(ReferencePath要素)を追加します(デスクトップ IPC サーバーの詳細に記載されています)。この作業によって、コア プロファイル(Windows ストア アプリ)とデスクトップ プロファイル(デスクトップのライブラリを使用)が1つのプロジェクトで混在することになります。

  5. プロジェクト ファイルを上書き保存してから、プロジェクトを再読み込みします。

  6. プロジェクト プロパティから、[ビルド]-[すべての構成]-[条件付きコンパイル シンボル]より「;WINDOWS_APP」を削除します。
    NETFX_CORE のみになります。

  7. プロジェクト プロパティから、[ビルド イベント]-[ビルド後に実行するコマンド ライン]に以下のコマンドを登録します(コントラクトの定義に記載されています)。 

     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
    
  8. 後は、インターフェースの定義と実装コードを記述します。

後は、ホワイトペーパーに記述されているように プロキシ スタブのC++プロジェクトを作成し、アプリ ブローカーを利用するWindows ストア アプリを作成します。作成した Windows ストア アプリをデバッグするには、アプリ ブローカーとプロキシ スタブをインストール先のフォルダーへコピーしてから、ACL(ファイルのアクセス権)を設定して、プロキシ スタブをregsvr32.exeで登録しておく必要があります。

このプロジェクトの構造を簡単にまとめると、以下のようになっています。

  • Windows ランタイム コンポーネント プロジェクト
    プロジェクト ファイルを編集することで、デスクトップ ライブラリを使用できるようにする。
    ビルドのコマンドを使用することで、idlを作成し、IIDを定義したコード、ヘッダーファイル、dlldatata.c、プロキシ コードを作成てから、参照用のWindows メタデータを作成します。
  • プロキシ スタブ プロジェクト
    Windows ランタイム コンポーネント プロジェクトで作成した各種のファイルとモジュール定義ファイルから、プロキシ スタブ DLLを作成します。

このソリューションの特徴として、C++のコードを書く必要性はありませんが、C++コンパイラ オプションとリンカ オプションの設定を行う必要があります。必要なC/C++のコードは、ユーティリティで自動生成するということです。

実際にデバッグを行うと理解することができますが、サロゲート プロセス(dllhost.exe)がclrhost.dll(CLRのホスト モジュール)を読み込んでから、Windows メタデータを読み込むことで動作します。