Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
サイド ローディングされた 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 メタデータを読み込むことで動作します。