この記事では、Windows 10 アプリ拡張機能を作成し、アプリでホストする方法について説明します。 アプリ拡張機能は、UWP アプリとパッケージ化されたデスクトップ アプリ
アプリ拡張機能を作成する方法を示すために、この記事では、Math Extension コード サンプルのパッケージ マニフェスト XML とコード スニペットを使用します。 このサンプルは UWP アプリですが、サンプルで示されている機能は、パッケージ化されたデスクトップ アプリにも適用できます。 サンプルの使用を開始するには、次の手順に従います。
- Math Extension コード サンプルをダウンロードして解凍します。
- Visual Studio 2019 で、MathExtensionSample.slnを開きます。 ビルドの種類を x86 に設定します ([Build
Configuration Manager ] をし、プラットフォーム 両方のプロジェクトの x86 を に変更します)。 - ソリューションのデプロイ: ビルド>ソリューションをデプロイします。
アプリ拡張機能の概要
Windows 10 では、アプリ拡張機能は、プラグイン、アドイン、およびアドオンが他のプラットフォームで実行する機能と同様の機能を提供します。 アプリ拡張機能は、Windows 10 Anniversary エディション (バージョン 1607、ビルド 10.0.14393) で導入されました。
アプリ拡張機能は、ホスト アプリとコンテンツおよび展開イベントを共有できる拡張機能宣言を持つ UWP アプリまたはパッケージ デスクトップ アプリです。 拡張機能アプリでは、複数の拡張機能を提供できます。
アプリ拡張機能は単なる UWP アプリまたはパッケージ化されたデスクトップ アプリであるため、完全に機能するアプリ、ホスト拡張機能、および他のアプリに拡張機能を提供することもできます。個別のアプリ パッケージを作成する必要はありません。
アプリ拡張機能ホストを作成すると、アプリのエコシステムを開発する機会が生まれます。このエコシステムでは、他の開発者が、想定していなかったか、リソースを持っていない可能性のある方法でアプリを強化できます。 Microsoft Office 拡張機能、Visual Studio 拡張機能、ブラウザー拡張機能などを検討してください。これにより、付属の機能を超える豊富なエクスペリエンスがアプリに提供されます。 拡張機能は、アプリに価値と寿命を追加できます。
大まかに言うと、アプリ拡張機能の関係を設定するには、次の手順を実行する必要があります。
- アプリを拡張機能ホストとして宣言します。
- アプリを拡張機能として宣言します。
- 拡張機能をアプリ サービス、バックグラウンド タスク、またはその他の方法で実装するかどうかを決定します。
- ホストとその拡張機能の通信方法を定義します。
- ホスト アプリの Windows.ApplicationModel.AppExtensions API を使用して拡張機能にアクセスします。
拡張機能を使用して新しい関数を追加できる架空の計算ツールを実装する
アプリを拡張機能ホストとして宣言する
アプリは、Package.appxmanifest ファイルで <AppExtensionHost>
要素を宣言することによって、アプリ拡張機能ホストとして自身を識別します。 この方法については、MathExtensionHost プロジェクトの Package.appxmanifest ファイルを参照してください。
MathExtensionHost プロジェクト で Package.appxmanifest を
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap uap3 mp">
...
<Applications>
<Application Id="App" ... >
...
<Extensions>
<uap3:Extension Category="windows.appExtensionHost">
<uap3:AppExtensionHost>
<uap3:Name>com.microsoft.mathext</uap3:Name>
</uap3:AppExtensionHost>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
...
</Package>
xmlns:uap3="http://..."
と uap3
に IgnorableNamespaces
が存在していることに注意してください。 uap3 名前空間を使用しているため、これらは必要です。
<uap3:Extension Category="windows.appExtensionHost">
は、このアプリを拡張機能ホストとして識別します。
の <uap3:AppExtensionHost>
要素は、拡張コントラクトの 名です。 拡張機能が同じ拡張コントラクト名を指定すると、ホストはそれを見つけることができます。 慣例により、他の拡張コントラクト名との競合の可能性を回避するために、アプリまたは発行元の名前を使用して拡張コントラクト名を構築することをお勧めします。
同じアプリで複数のホストと複数の拡張機能を定義できます。 この例では、1 つのホストを宣言します。 拡張機能は別のアプリで定義されています。
アプリを拡張機能として宣言する
アプリは、<uap3:AppExtension>
ファイルで 要素を宣言することで、自身をアプリ拡張機能として識別します。
MathExtension プロジェクトで Package.appxmanifest ファイルを開き、その方法を確認します。
MathExtension プロジェクトで Package.appxmanifest を操作する:
<Package
...
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap uap3 mp">
...
<Applications>
<Application Id="App" ... >
...
<Extensions>
...
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.microsoft.mathext"
Id="power"
DisplayName="x^y"
Description="Exponent"
PublicFolder="Public">
<uap3:Properties>
<Service>com.microsoft.powservice</Service>
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
</Application>
</Applications>
...
</Package>
ここでも、xmlns:uap3="http://..."
行と、uap3
に IgnorableNamespaces
が存在していることに注意してください。 これらは、uap3
名前空間を使用しているために必要です。
<uap3:Extension Category="windows.appExtension">
は、このアプリを拡張機能として識別します。
<uap3:AppExtension>
属性の意味は次のとおりです。
特性 | 説明 | 必須 |
---|---|---|
名前 | これは拡張コントラクト名です。 ホストで宣言された名 と一致すると、そのホストはこの拡張機能を見つけられるようになります。 | ✔️ |
身分証明書 | この拡張機能を一意に識別します。 同じ拡張コントラクト名を使用する複数の拡張機能が存在する可能性があるため (複数の拡張機能をサポートするペイント アプリを想像してください)、ID を使用して区別することができます。 アプリ拡張機能ホストでは、ID を使用して拡張機能の種類に関する情報を推測できます。 たとえば、1 つの拡張機能をデスクトップ用に設計し、もう 1 つをモバイル用に設計し、ID を差別化することができます。 Properties 要素を使用することもできます。これについては、以下で説明します。 | ✔️ |
DisplayName | ホスト アプリから使用して、ユーザーへの拡張機能を識別できます。 これは、ローカライズのために新しいリソース管理システム ( |
|
説明 | ホスト アプリから、拡張機能をユーザーに説明するために使用できます。 これは、ローカライズのために新しいリソース管理システム ( |
|
公開フォルダー | パッケージ ルートを基準としたフォルダーの名前。拡張機能ホストとコンテンツを共有できます。 慣例により、名前は "Public" ですが、拡張機能内のフォルダーと一致する任意の名前を使用できます。 | ✔️ |
<uap3:Properties>
は、ホストが実行時に読み取ることができるカスタム メタデータを含む省略可能な要素です。 コード サンプルでは、拡張機能がアプリ サービスとして実装されているため、ホストは、それを呼び出すことができるように、その App Service の名前を取得する方法を必要とします。 アプリ サービスの名前は、定義した <Service> 要素で定義されます (必要なものは何でも呼び出すことができました)。 コード サンプルのホストは、実行時にこのプロパティを検索して、App Service の名前を学習します。
拡張機能を実装する方法を決定します。
アプリ拡張機能に関する Build 2016 セッションでは、ホストと拡張機能の間で共有されるパブリック フォルダーを使用する方法を示します。 この例では、拡張機能は、ホストが呼び出すパブリック フォルダーに格納されている JavaScript ファイルによって実装されます。 この方法には軽量であるという利点があり、コンパイルは必要ありません。また、拡張機能の手順とホスト アプリの Microsoft Store ページへのリンクを提供する既定のランディング ページの作成をサポートできます。 詳細については、Build 2016 アプリ拡張機能のコード サンプル を参照してください。 具体的には、InvertImageExtension プロジェクトと、InvokeLoad()
プロジェクトのExtensionManager.csの を参照してください。
この例では、アプリ サービスを使用して拡張機能を実装します。 アプリ サービスには、次の利点があります。
- 拡張機能がクラッシュした場合、ホスト アプリは独自のプロセスで実行されるため、ホスト アプリはダウンしません。
- 選択した言語を使用して、サービスを実装できます。 ホスト アプリの実装に使用される言語と一致する必要はありません。
- アプリ サービスは独自のアプリ コンテナーにアクセスできます。これは、ホストとは異なる機能を持つ場合があります。
- サービス内のデータとホスト アプリは分離されています。
アプリ サービス コードをホストする
拡張機能のアプリ サービスを呼び出すホスト コードを次に示します。
MathExtensionHost プロジェクト での
public async Task<double> Invoke(ValueSet message)
{
if (Loaded)
{
try
{
// make the app service call
using (var connection = new AppServiceConnection())
{
// service name is defined in appxmanifest properties
connection.AppServiceName = _serviceName;
// package Family Name is provided by the extension
connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;
// open the app service connection
AppServiceConnectionStatus status = await connection.OpenAsync();
if (status != AppServiceConnectionStatus.Success)
{
Debug.WriteLine("Failed App Service Connection");
}
else
{
// Call the app service
AppServiceResponse response = await connection.SendMessageAsync(message);
if (response.Status == AppServiceResponseStatus.Success)
{
ValueSet answer = response.Message as ValueSet;
if (answer.ContainsKey("Result")) // When our app service returns "Result", it means it succeeded
{
return (double)answer["Result"];
}
}
}
}
}
catch (Exception)
{
Debug.WriteLine("Calling the App Service failed");
}
}
return double.NaN; // indicates an error from the app service
}
これは、アプリ サービスを呼び出すための一般的なコードです。 App Service を実装して呼び出す方法の詳細については、「App Serviceを作成して使用する方法」を参照してください。
注意すべき点の 1 つは、呼び出すアプリ サービスの名前がどのように決定されるかです。 ホストには拡張機能の実装に関する情報がないため、拡張機能はアプリ サービスの名前を指定する必要があります。 コード サンプルでは、拡張機能は、<uap3:Properties>
要素内のファイル内の App Service の名前を宣言します。
MathExtension プロジェクト で Package.appxmanifest を
...
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension ...>
<uap3:Properties>
<Service>com.microsoft.powservice</Service>
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
<uap3:Properties>
要素で独自の XML を定義できます。 この場合、ホストが拡張機能を呼び出す際に利用できるように、アプリ サービスの名前を定義します。
ホストが拡張機能を読み込むとき、次のようなコードは、拡張機能の Package.appxmanifest で定義されているプロパティからサービスの名前を抽出します。
MathExtensionHost プロジェクトの ExtensionManager.cs 内で Update()
...
var properties = await ext.GetExtensionPropertiesAsync() as PropertySet;
...
#region Update Properties
// update app service information
_serviceName = null;
if (_properties != null)
{
if (_properties.ContainsKey("Service"))
{
PropertySet serviceProperty = _properties["Service"] as PropertySet;
this._serviceName = serviceProperty["#text"].ToString();
}
}
#endregion
_serviceName
に格納されているアプリ サービスの名前を使用すると、ホストはそれを使用してアプリ サービスを呼び出すことができます。
アプリ サービスを呼び出す場合は、アプリ サービスを含むパッケージのファミリ名も必要です。 幸いなことに、アプリ拡張機能 API は、次の行で取得されるこの情報を提供します:connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;
ホストと拡張機能の通信方法を定義する
アプリ サービスでは、ValueSet を使用して情報を交換します。 ホストの作成者は、柔軟な拡張機能と通信するためのプロトコルを思い付く必要があります。 コード サンプルでは、将来 1 つ、2 つ以上の引数を受け取る可能性がある拡張機能を考慮することを意味します。
この例では、引数のプロトコルは ValueSet で、"Arg" という名前のキー値ペアと引数番号 (例: Arg1
と Arg2
) を含みます。 ホストは、ValueSet内のすべての引数を渡し、拡張機能は必要なものを使用します。 拡張機能が結果を計算できた場合、ホストは拡張機能から返される ValueSet に、計算の値を含んだ Result
という名前のキーを持っていることを期待します。 そのキーが存在しない場合、ホストは拡張機能が計算を完了できなかったと想定します。
拡張機能のアプリ サービス コード
コード サンプルでは、拡張機能のアプリ サービスはバックグラウンド タスクとして実装されていません。 代わりに、アプリ サービスをホストする拡張機能アプリと同じプロセスで実行されるシングル プロセス アプリ サービス モデルが使用されます。 これは引き続きホスト アプリとは異なるプロセスであり、プロセス分離の利点を提供しながら、拡張機能プロセスとアプリ サービスを実装するバックグラウンド プロセス間のクロスプロセス通信を回避することでパフォーマンス上の利点を得ることができます。 バックグラウンド タスクとして実行されるアプリ サービスと同じプロセスでの違いについては、「アプリ サービスをホスト アプリ と同じプロセスで実行するように変換する」を参照してください。
システムは、アプリサービスがアクティブ化されたときに OnBackgroundActivate()
を実行します。 このコードでは、実際の App Service 呼び出し (OnAppServiceRequestReceived()
) を処理するイベント ハンドラーを設定し、キャンセルイベントやクローズ イベントを処理する遅延オブジェクトの取得などのハウスキーピング イベントを処理します。
MathExtension プロジェクトの App.xaml.cs ファイル。
protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
base.OnBackgroundActivated(args);
if ( _appServiceInitialized == false ) // Only need to setup the handlers once
{
_appServiceInitialized = true;
IBackgroundTaskInstance taskInstance = args.TaskInstance;
taskInstance.Canceled += OnAppServicesCanceled;
AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
_appServiceDeferral = taskInstance.GetDeferral();
_appServiceConnection = appService.AppServiceConnection;
_appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
_appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
}
}
拡張機能の動作を行うコードは、OnAppServiceRequestReceived()
にあります。 この関数は、計算を実行するためにアプリ サービスが呼び出されたときに呼び出されます。
ValueSetから必要な値が抽出されます。 計算が可能な場合は、結果 結果という名前のキーの下に、ホストに返される ValueSet に配置されます。 このホストとその拡張機能の通信方法に定義されているプロトコルに従って、Result キーが存在すると成功を示していることを思い出してください。それ以外の場合は失敗します。
MathExtension プロジェクトの App.xaml.cs ファイル。
private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
// Get a deferral because we use an awaitable API below (SendResponseAsync()) to respond to the message
// and we don't want this call to get cancelled while we are waiting.
AppServiceDeferral messageDeferral = args.GetDeferral();
ValueSet message = args.Request.Message;
ValueSet returnMessage = new ValueSet();
double? arg1 = Convert.ToDouble(message["arg1"]);
double? arg2 = Convert.ToDouble(message["arg2"]);
if (arg1.HasValue && arg2.HasValue)
{
returnMessage.Add("Result", Math.Pow(arg1.Value, arg2.Value)); // For this sample, the presence of a "Result" key will mean the call succeeded
}
await args.Request.SendResponseAsync(returnMessage);
messageDeferral.Complete();
}
拡張機能の管理
ホストとその拡張機能の間の関係を実装する方法を見てきたので、ホストがシステムにインストールされている拡張機能を見つけ、拡張機能を含むパッケージの追加と削除にどのように対応するかを見てみましょう。
Microsoft Store は、拡張機能をパッケージとして提供します。 AppExtensionCatalog は、ホストの拡張機能コントラクト名に一致する拡張機能を含むインストール済みパッケージを検索し、ホストに関連するアプリ拡張機能パッケージがインストールまたは削除されたときに発生するイベントを提供します。
コード サンプルでは、ExtensionManager
クラス (MathExtensionHost プロジェクトの ExtensionManager.cs で定義) は、拡張機能を読み込み、拡張機能パッケージのインストールとアンインストールに応答するためのロジックをラップします。
ExtensionManager
コンストラクターは、AppExtensionCatalog
を使用して、ホストと同じ拡張コントラクト名を持つシステム上のアプリ拡張機能を検索します。
MathExtensionHost プロジェクトの ExtensionManager.cs です。
public ExtensionManager(string extensionContractName)
{
// catalog & contract
ExtensionContractName = extensionContractName;
_catalog = AppExtensionCatalog.Open(ExtensionContractName);
...
}
拡張機能パッケージがインストールされると、ExtensionManager
は、ホストと同じ拡張コントラクト名を持つパッケージ内の拡張機能に関する情報を収集します。 インストールは、影響を受ける拡張機能の情報が更新される更新プログラムを表している可能性があります。 拡張機能パッケージがアンインストールされると、ExtensionManager
は影響を受ける拡張機能に関する情報を削除し、使用できなくなった拡張機能をユーザーが認識できるようにします。
Extension
クラス (MathExtensionHost プロジェクトの ExtensionManager.cs で定義) は、拡張機能の ID、説明、ロゴ、アプリ固有の情報 (ユーザーが拡張機能を有効にしたかどうかなど) にアクセスするためにコード サンプル用に作成されました。
拡張機能が読み込まれていると言うには (Load()
の を参照)、パッケージの状態が問題なく、ID、ロゴ、説明、パブリック フォルダーが取得されたことを意味します (このサンプルでは使用しません。取得方法を示すためだけに使用します)。 拡張機能パッケージ自体が読み込まれていません。
アンロードの概念は、ユーザーに表示されなくなった拡張機能を追跡するために使用されます。
ExtensionManager
は、拡張機能、名前、説明、ロゴを UI にデータバインドできるように、インスタンス Extension
コレクションを提供します。
ExtensionsTab ページはこのコレクションにバインドされ、拡張機能を有効または無効にしたり、拡張機能を削除したりするための UI を提供します。
の例
拡張機能が削除されると、拡張機能を含むパッケージ (および場合によっては他の拡張機能が含まれている可能性があります) をアンインストールすることを確認するようにユーザーに求められます。 ユーザーが同意すると、パッケージがアンインストールされ、ExtensionManager
は、ホスト アプリで使用できる拡張機能の一覧からアンインストールされたパッケージ内の拡張機能を削除します。
アプリ拡張機能とホストのデバッグ
多くの場合、拡張機能のホストと拡張機能は同じソリューションの一部ではありません。 その場合は、ホストと拡張機能をデバッグします。
- Visual Studio の 1 つのインスタンスにホスト プロジェクトを読み込みます。
- Visual Studio の別のインスタンスに拡張機能を読み込みます。
- デバッガーでホスト アプリを起動します。
- デバッガーで拡張機能アプリを起動します。 (拡張機能をデバッグするのではなく、展開してホストのパッケージインストールイベントをテストしたい場合は、代わりに >デプロイソリューション、 を行います)。
これで、ホストと拡張機能のブレークポイントにヒットできるようになります。
拡張機能アプリ自体のデバッグを開始すると、アプリの空のウィンドウが表示されます。 空白のウィンドウを表示しない場合は、拡張機能プロジェクトのデバッグ設定を変更して、アプリを起動せずにデバッグすることができます (拡張機能プロジェクトを右クリックし、[プロパティ]
コード サンプル をデバッグする
コード サンプルでは、ホストと拡張機能は同じソリューションにあります。 デバッグするには、次の操作を行います。
- MathExtensionHost
がスタートアップ プロジェクトであることを確認します (MathExtensionHost プロジェクト を右クリックし、[スタートアップ プロジェクトとして設定 ] をクリックします)。 -
Invoke
プロジェクトで、ExtensionManager.csの にブレークポイントを配置します。 - F5 をして MathExtensionHost プロジェクトを実行します。
-
OnAppServiceRequestReceived
プロジェクトのApp.xaml.csの にブレークポイントを配置します。 MathExtension プロジェクトのデバッグを開始します (MathExtension プロジェクトを右クリックし、[デバッグ][新しいインスタンスの開始] を します)。 MathExtensionHost アプリで、計算 ページに移動し、x^yクリックして拡張機能をアクティブにします。 Invoke()
ブレークポイントが最初にヒットし、拡張機能の App Service 呼び出しが行われていることを確認できます。 その後、拡張機能のOnAppServiceRequestReceived()
メソッドがヒットし、App Service が結果を計算して返すのを確認できます。
App Service として実装されている拡張機能のトラブルシューティング
拡張機能ホストが拡張機能の App Service への接続に問題がある場合は、<uap:AppService Name="...">
属性が、<Service>
要素に入力したものと一致していることを確認します。 それらが一致しない場合、拡張機能が提供するサービス名は、実装したアプリ サービス名と一致せず、ホストは拡張機能をアクティブ化できません。
MathExtension プロジェクトで Package.appxmanifest を操作する:
<Extensions>
<uap:Extension Category="windows.appService">
<uap:AppService Name="com.microsoft.sqrtservice" /> <!-- This must match the contents of <Service>...</Service> -->
</uap:Extension>
<uap3:Extension Category="windows.appExtension">
<uap3:AppExtension Name="com.microsoft.mathext" Id="sqrt" DisplayName="Sqrt(x)" Description="Square root" PublicFolder="Public">
<uap3:Properties>
<Service>com.microsoft.powservice</Service> <!-- this must match <uap:AppService Name=...> -->
</uap3:Properties>
</uap3:AppExtension>
</uap3:Extension>
</Extensions>
テストする基本的なシナリオのチェックリスト
拡張機能ホストを構築し、拡張機能がどの程度適切にサポートされているかをテストする準備ができたら、次の基本的なシナリオを試してみてください。
- ホストを実行し、拡張機能アプリをデプロイする
- ホストは、実行中に提供される新しい拡張機能を選択しますか?
- 拡張機能アプリをデプロイし、ホストをデプロイして実行します。
- ホストは既存の拡張機能を取得しますか?
- ホストを実行し、拡張機能アプリを削除します。
- ホストは削除を正しく検出しますか?
- ホストを実行し、拡張機能アプリを新しいバージョンに更新します。
- ホストは変更を受け取り、拡張機能の古いバージョンを正しくアンロードしますか?
高度なシナリオをテストするための :
- ホストを実行し、拡張アプリをリムーバブル メディアに移動し、メディアを削除する
- ホストはパッケージの状態の変更を検出し、拡張機能を無効にしますか?
- ホストを実行し、拡張機能アプリを破損させる (無効にする、別の方法で署名するなど)
- ホストは改ざんされた拡張機能を検出し、正しく処理しますか?
- ホストを実行し、無効なコンテンツまたはプロパティを持つ拡張機能アプリをデプロイします
- ホストは無効なコンテンツを検出し、正しく処理しますか?
設計に関する考慮事項
- 使用可能な拡張機能をユーザーに示す UI を提供し、ユーザーが拡張機能を有効または無効にできるようにします。 パッケージがオフラインになったために使用できなくなった拡張機能のグリフを追加することも検討してください。
- 拡張機能を取得できる場所にユーザーを誘導します。 拡張機能ページでは、アプリで使用できる拡張機能の一覧を表示する Microsoft Store 検索クエリを提供できる場合があります。
- 拡張機能の追加と削除をユーザーに通知する方法を検討します。 新しい拡張機能がインストールされたときの通知を作成し、有効にするようにユーザーを招待できます。 ユーザーが制御できるように、拡張機能は既定で無効にする必要があります。
アプリ拡張機能とオプション パッケージの違い
オプションパッケージ とアプリ拡張機能の主な違いは、オープン エコシステムとクローズド エコシステム、依存パッケージと独立パッケージです。
アプリ拡張機能は、オープン エコシステムに参加します。 アプリでアプリ拡張機能をホストできる場合は、拡張機能から情報を受け取る方法に準拠している限り、誰でもホストの拡張機能を記述できます。 これは、アプリで使用できるオプション パッケージを作成できるユーザーをパブリッシャーが決定する、クローズド エコシステムに参加するオプション パッケージとは異なります。
アプリ拡張機能は独立したパッケージであり、スタンドアロン アプリにすることができます。 別のアプリにデプロイの依存関係を持つことはできません。 オプション パッケージにはプライマリ パッケージが必要であり、それなしでは実行できません。
ゲームの拡張パックは、ゲームに緊密にバインドされ、ゲームとは独立して実行できないので、オプション パッケージの候補として適しています。また、エコシステム内の開発者だけが拡張パックを作成したくない場合があります。
同じゲームにカスタマイズ可能な UI アドオンやテーマがある場合は、拡張機能を提供するアプリが単独で実行でき、サード パーティが実行できるため、アプリ拡張機能が適切な選択肢になる可能性があります。
注釈
このトピックでは、アプリ拡張機能の概要について説明します。 注意すべき重要な点は、ホストの作成と Package.appxmanifest ファイルへのマーキング、拡張機能の作成、Package.appxmanifest ファイルへのマーク付け、拡張機能の実装方法 (App Service、バックグラウンド タスクなど) の決定、ホストが拡張機能と通信する方法の定義です。 AppExtensions API を使用して拡張機能にアクセスして管理します。
関連トピック
- アプリ拡張機能の概要
- アプリ拡張機能に関するビルド 2016 セッション
- Build 2016 アプリ拡張機能のコード サンプル
- バックグラウンド タスクによるアプリのサポート
- App Serviceを作成して使用する方法について説明します。
- AppExtensions 名前空間
- サービス、拡張機能、パッケージを使用してアプリを拡張