ホステッド アプリの作成
Windows 10 Version 2004 以降では、"ホステッド アプリ" を作成できます。 ホステッド アプリは、親の "ホスト" アプリと同じ実行可能ファイルと定義を共有しますが、外観と動作はシステム上で別々のアプリのようになります。
ホステッド アプリは、コンポーネント (実行可能ファイルやスクリプト ファイルなど) がスタンドアロンの Windows 10 アプリのように動作する必要があるものの、そのコンポーネントを実行するためにホスト プロセスが必要な場合に役立ちます。 たとえば、PowerShell または Python スクリプトは、実行するためにホストをインストールする必要があるホステッド アプリとして提供できます。 ホステッド アプリには、独自のスタート タイルや ID を指定できるほか、バックグラウンド タスク、通知、タイル、共有ターゲットなどの Windows 10 の機能と緊密に統合することもできます。
ホステッド アプリの機能は、パッケージ マニフェスト内のいくつかの要素と属性でサポートされています。これにより、ホステッド アプリがホスト アプリ パッケージ内の実行可能ファイルと定義を使用できるようになります。 ユーザーがホステッド アプリを実行すると、OS はホステッド アプリの ID でホスト実行可能ファイルを自動的に起動します。 その後、ホストはホステッド アプリとしてビジュアル資産やコンテンツを読み込んだり、API を呼び出したりすることができます。 ホステッド アプリは、ホストとホステッド アプリとの間で宣言された機能の共通部分を取得します。 つまり、ホステッド アプリは、ホストが提供するよりも多くの機能を要求することはできません。
ホストを定義する
"ホスト" は、ホステッド アプリのメインの実行可能またはランタイム プロセスです。 現在サポートされているホストは、"パッケージ ID" を持つデスクトップ アプリ (.NET または C++ デスクトップ) のみです。 デスクトップ アプリがパッケージ ID を持つには、いくつかの方法があります。
- デスクトップ アプリにパッケージ ID を付与する方法として最も一般的なのは、MSIX パッケージにパッケージ化することです。
- 場合によっては、外部の場所を持つパッケージを作成してパッケージ ID を付与することもできます (「外部の場所でパッケージ化することでパッケージ ID をを参照してください)。 このオプションは、デスクトップ アプリをインストールするために MSIX を採用できない場合に便利です。
ホストは、uap10:HostRuntime 拡張機能によってパッケージ マニフェストで宣言されます。 この拡張機能にある Id 属性には、ホステッド アプリのパッケージ マニフェストでも参照される値を割り当てる必要があります。 ホステッド アプリがアクティブになると、ホストはホステッド アプリの ID で起動され、ホステッド アプリ パッケージからコンテンツまたはバイナリを読み込むことができます。
次の例は、パッケージ マニフェストでホストを定義する方法を示しています。 uap10:HostRuntime 拡張機能はパッケージ全体にわたる機能であるため、Package 要素の子として宣言されます。
<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">
<Extensions>
<uap10:Extension Category="windows.hostRuntime"
Executable="PyScriptEngine\PyScriptEngine.exe"
uap10:RuntimeBehavior="packagedClassicApp"
uap10:TrustLevel="mediumIL">
<uap10:HostRuntime Id="PythonHost" />
</uap10:Extension>
</Extensions>
</Package>
次の要素に関する以下の重要な詳細情報をメモしてください。
要素 | 詳細 |
---|---|
uap10:Extension | windows.hostRuntime カテゴリは、ホステッド アプリのアクティブ化時に使用されるランタイム情報を定義する、パッケージ全体の拡張機能を宣言します。 ホステッド アプリは、拡張機能で宣言された定義を使用して実行されます。 前の例で宣言されたホスト アプリを使用する場合、ホステッド アプリは mediumIL 信頼レベルで実行可能ファイル PyScriptEngine.exe として実行されます。Executable、uap10:RuntimeBehavior、および uap10:TrustLevel の各属性は、パッケージ内のホスト プロセス バイナリの名前と、ホステッド アプリの実行方法を指定します。 たとえば、前の例の属性を使用するホステッド アプリは、mediumIL 信頼レベルでPyScriptEngine.exe 実行可能ファイルとして実行されます。 |
uap10:HostRuntime | Id 属性は、パッケージでこの特定のホスト アプリの一意の ID を宣言します。 パッケージには複数のホスト アプリを備えることができ、それぞれには、一意の Id を持つ uap10:HostRuntime 要素が必要です。 |
ホステッド アプリを宣言する
"ホステッド アプリ" は、"ホスト" へのパッケージの依存関係を宣言します。 ホステッド アプリは、独自のパッケージでエントリ ポイントの実行可能ファイルを指定するのではなく、アクティブ化のためにホストの ID (つまり、ホスト パッケージ内のuap10:HostRuntime 拡張機能の Id 属性) を利用します。 ホステッド アプリには、通常、ホストからアクセスできるコンテンツ、ビジュアル資産、スクリプト、またはバイナリが含まれます。 ホステッド アプリ パッケージ内の TargetDeviceFamily 値は、ホストと同じ値をターゲットにする必要があります。
ホステッド アプリ パッケージは、署名付きでも署名なしでもかまいません。
- 署名付きパッケージには、実行可能ファイルを含めることができます。 これは、バイナリ拡張メカニズムがあり、ホストがホステッド アプリ パッケージに DLL または登録済みコンポーネントを読み込むことができる場合に役立ちます。
- ほとんどのシナリオでは、署名されていないパッケージには実行可能なコンテンツが含まれます。 ただし、 非実行可能ファイル ファイルのみを含む署名されていないパッケージは、ホストがイメージ、アセット、およびコンテンツ ファイルまたはスクリプト ファイルのみを読み込む必要があるシナリオで役立ちます。 署名されていないパッケージは、Identity 要素に特別な
OID
値を含める必要があります。そうしないと、登録できません。 これにより、署名なしパッケージが署名付きパッケージの ID と競合したり、これをスプーフィングしたりするのを防止できます。
ホストテッド アプリを定義するには、パッケージ マニフェストで次の項目を宣言します。
- uap10:HostRuntimeDependency 要素。 これは、Dependencies 要素の子です。
- Application 要素 (アプリの場合) または Extension 要素 (アクティブ化可能な拡張機能の場合) の uap10:HostId 属性。
次の例は、署名なしホステッド アプリのパッケージ マニフェストの関連セクションを示しています。
<Package xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10">
<Identity Name="NumberGuesserManifest"
Publisher="CN=AppModelSamples, OID.2.25.311729368913984317654407730594956997722=1"
Version="1.0.0.0" />
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
<uap10:HostRuntimeDependency Name="PyScriptEnginePackage" Publisher="CN=AppModelSamples" MinVersion="1.0.0.0"/>
</Dependencies>
<Applications>
<Application Id="NumberGuesserApp"
uap10:HostId="PythonHost"
uap10:Parameters="-Script "NumberGuesser.py"">
</Application>
</Applications>
</Package>
次の要素に関する以下の重要な詳細情報をメモしてください。
要素 | 詳細 |
---|---|
ID | この例のホステッド アプリ パッケージは署名がないので、Publisher 属性には OID.2.25.311729368913984317654407730594956997722=1 文字列を組み込む必要があります。 これにより、署名なしパッケージが署名付きパッケージの ID をスプーフィングできないことが確実になります。 |
TargetDeviceFamily | MinVersion 属性は 10.0.19041.0 またはそれ以降の OS バージョンを指定する必要があります。 |
uap10:HostRuntimeDependency | この要素は、ホスト アプリ パッケージへの依存関係を宣言します。 これは、ホスト パッケージの Name と Publisher、および依存している MinVersion で構成されます。 これらの値は、ホスト パッケージの Identity 要素の下にあります。 |
Application | uap10:HostId 属性は、ホストへの依存関係を表します。 ホステッド アプリ パッケージは、Application または Extension の各要素に通常の Executable と EntryPoint の各属性の代わりにこの属性を宣言する必要があります。 その結果、ホステッド アプリは、Executable、EntryPoint およびランタイムの属性を、対応する HostId 値を持つホストから継承します。 uap10:Parameters 属性は、ホスト実行可能ファイルのエントリ ポイント関数に渡されるパラメーターを指定します。 ホストはこれらのパラメーターの処理方法を認識している必要があるため、ホストとホステッド アプリの間には暗黙の契約があります。 |
実行時に署名なしホステッド アプリ パッケージを登録する
uap10:HostRuntime 拡張機能のメリットの 1 つは、PackageManager API を使用して実行時にホステッド アプリ パッケージを動的に生成し、登録できるようになることです。署名する必要はありません。 これにより、ホストは、ホステッド アプリ パッケージのコンテンツとマニフェストを動的に生成し、登録できます。
署名なしのホステッド アプリ パッケージを登録するには、PackageManager クラスの以下の方法を使用します。 これらの方法は、Windows 10 バージョン 2004 以降で使用できます。
- AddPackageByUriAsync: options パラメーターの AllowUnsigned プロパティを使用して、署名なしの MSIX パッケージを登録します。
- RegisterPackageByUriAsync: ルース パッケージ マニフェスト ファイル登録を実行します。 パッケージが署名されている場合、マニフェストが入っているフォルダーには .p7x ファイルとカタログが含まれている必要があります。 署名なしの場合、options パラメーターの AllowUnsigned プロパティが設定されなければなりません。
署名なしのホステッド アプリの要件
- パッケージ マニフェスト内の Application または Extension の各要素には、Executable、EntryPoint、または TrustLevel の各属性などのライセンス認証データを含めることはできません。 代わりに、これらの要素には、ホストへの依存関係を表す uap10:HostId 属性と、uap10:Parameters 属性のみを含めることができます。
- パッケージはメイン パッケージである必要があります。 バンドル、フレームワーク パッケージ、リソース、オプション パッケージにすることはできません。
署名なしのホステッド アプリ パッケージをインストールして登録するホストの要件
- ホストにはパッケージ ID が必要です。
- ホストには、 packageManagement restricted 機能が必要です。
<rescap:Capability Name="packageManagement" />
サンプル
それ自体をホストとして宣言してから、実行時にホステッド アプリ パッケージを動的に登録するというように、適切に機能するサンプル アプリについては、ホステッド アプリのサンプルに関するページを参照してください。
ホスト
ホストには PyScriptEngine という名前が付いています。 これは、Python スクリプトを実行する C# で記述されたラッパーです。 -Register
パラメーターを指定して実行すると、スクリプト エンジンによって、Python スクリプトを含むホステッド アプリがインストールされます。 ユーザーが新しくインストールされたホステッド アプリを起動しようとすると、ホストが起動され、NumberGuesser Python スクリプトが実行されます。
ホスト アプリのパッケージ マニフェスト (PyScriptEnginePackage フォルダー内の Package.appxmanifest ファイル) には、ID PythonHost と実行可能ファイル PyScriptEngine.exe を使用してアプリをホストとして宣言する uap10:HostRuntime 拡張機能が入っています。
Note
このサンプルでは、パッケージ マニフェストは package.appxmanifest という名前で、Windows アプリケーション パッケージ プロジェクトの一部です。 このプロジェクトがビルドされると、AppxManifest.xml という名前のマニフェストが生成され、ホスト アプリの MSIX パッケージがビルドされます。
ホステッド アプリ
ホステッド アプリは、python スクリプトと、パッケージ マニフェストなどのパッケージ成果物で構成されます。 PE ファイルは含まれません。
ホステッド アプリのパッケージ マニフェスト (NumberGuesser/AppxManifest.xml ファイル) には、次の項目が含まれています。
- Identity 要素の Publisher 属性には、署名されていないパッケージに必要な
OID.2.25.311729368913984317654407730594956997722=1
識別子が含まれています。 - Application 要素の uap10:HostId 属性は、PythonHost をホストとして識別します。
サンプルの実行
このサンプルでは、バージョン 10.0.19041.0 以降の Windows 10 と Windows SDK が必要です。
サンプルを開発用コンピューター上の任意のフォルダーにダウンロードします。
PyScriptEngine.sln ソリューションを Visual Studio で開き、PyScriptEnginePackage プロジェクトをスタートアップ プロジェクトとして設定します。
PyScriptEnginePackage プロジェクトをビルドします。
ソリューション エクスプローラーで PyScriptEnginePackage プロジェクトを右クリックし、[配置] を選択します。
コマンド プロンプト ウィンドウを開いて、サンプル ファイルをコピーしたディレクトリに進み、次のコマンドを実行してサンプル NumberGuesser アプリ (ホステッド アプリ) を登録します。
D:\repos\HostedApps
を、サンプル ファイルをコピーしたパスに変更します。D:\repos\HostedApps>pyscriptengine -Register D:\repos\HostedApps\NumberGuesser\AppxManifest.xml
Note
サンプルのホストは AppExecutionAlias を宣言しているため、コマンド ラインで
pyscriptengine
を実行できます。[スタート] メニューを開き、[NumberGuesser] をクリックしてホステッド アプリを実行します。