マルチインスタンスのユニバーサル Windows アプリの作成Create a multi-instance Universal Windows App

このトピックでは、マルチインスタンスのユニバーサル Windows プラットフォーム (UWP) アプリを作成する方法について説明します。This topic describes how to create multi-instance Universal Windows Platform (UWP) apps.

Windows 10、バージョン 1803 (10.0; から17134 をビルドする)、UWP アプリは複数のインスタンスをサポートするためにオプトイン以降、します。From Windows 10, version 1803 (10.0; Build 17134) onward, your UWP app can opt in to support multiple instances. マルチインスタンス UWP アプリのインスタンスが実行されていて、後続のライセンス認証要求が行われた場合、既存のインスタンスはアクティブ化されません。If an instance of an multi-instance UWP app is running, and a subsequent activation request comes through, the platform will not activate the existing instance. 代わりに、別のプロセスで実行される、新しいインスタンスが作成されます。Instead, it will create a new instance, running in a separate process.

重要

JavaScript アプリケーションでは、複数インスタンスがサポートされていますが、リダイレクトの複数インスタンスがないです。Multi-instancing is supported for JavaScript applications, but multi-instancing redirection is not. JavaScript アプリケーションでは、複数インスタンスのリダイレクトがサポートされていないため、 AppInstance クラスはこのようなアプリケーションに適していません。Since multi-instancing redirection is not supported for JavaScript applications, the AppInstance class is not useful for such applications.

マルチ インスタンスの動作を選択します。Opt in to multi-instance behavior

新しいマルチインスタンス アプリケーションを作成する場合は、Visual Studio Marketplace から入手可能な Multi-Instance App Project Templates.VSIX をインストールします。If you are creating a new multi-instance application, you can install the Multi-Instance App Project Templates.VSIX, available from the Visual Studio Marketplace. テンプレートをインストールすると、[Visual C#] > [Windows ユニバーサル][新しいプロジェクト] ダイアログ (または [他の言語] > [Visual C++] > [Windows ユニバーサル]) で使用可能になります。Once you install the templates, they will be available in the New Project dialog under Visual C# > Windows Universal (or Other Languages > Visual C++ > Windows Universal).

2 つのテンプレートがインストールされます。UWP アプリのマルチ インスタンス、マルチ インスタンスのアプリを作成するため、テンプレートを提供してマルチ インスタンスのリダイレクトの UWP アプリを起動する新しいインスタンスを作成できる追加のロジックを提供する、または選択的には既に起動しているインスタンスをアクティブにします。Two templates are installed: Multi-Instance UWP app, which provides the template for creating a multi-instance app, and Multi-Instance Redirection UWP app, which provides additional logic that you can build on to either launch a new instance or selectively activate an instance that has already been launched. 例: おそらく、同じドキュメントの編集時に 1 つのインスタンスのみする、新しいインスタンスを起動するのではなく、フォア グラウンドがそのファイルをあるインスタンスを開くようにします。For example, perhaps you only want one instance at a time editing the same document, so you bring the instance that has that file open to the foreground rather than launching a new instance.

両方のテンプレートの追加SupportsMultipleInstancespackage.appxmanifestファイル。Both templates add SupportsMultipleInstances to the package.appxmanifest file. 名前空間プレフィックスに注意してくださいdesktop4iot2: デスクトップを対象とする唯一のプロジェクトやモ ノのインターネット (IoT) プロジェクトでは、複数インスタンスをサポートします。Note the namespace prefix desktop4 and iot2: only projects that target the desktop, or Internet of Things (IoT) projects, support multi-instancing.

<Package
  ...
  xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
  xmlns:iot2="http://schemas.microsoft.com/appx/manifest/iot/windows10/2"  
  IgnorableNamespaces="uap mp desktop4 iot2">
  ...
  <Applications>
    <Application Id="App"
      ...
      desktop4:SupportsMultipleInstances="true"
      iot2:SupportsMultipleInstances="true">
      ...
    </Application>
  </Applications>
   ...
</Package>

マルチインスタンスアクティブ化のリダイレクトMulti-instance activation redirection

UWP アプリのマルチインスタンス化のサポートは、単に複数のアプリ インスタンスを起動することを可能にするだけではありません。Multi-instancing support for UWP apps goes beyond simply making it possible to launch multiple instances of the app. アプリの新しいインスタンスを起動するか、すでに実行しているインスタンスをアクティブにするかを選択する場合に、カスタマイズできます。It allows for customization in cases where you want to select whether a new instance of your app is launched or an instance that is already running is activated. たとえば、既に別のインスタンスで編集中のファイルを編集するためにアプリが起動されている場合、そのファイルを編集している別のインスタンスを開くのではなく、そのインスタンスにアクティブ化をリダイレクトすることができます。For example, if the app is launched to edit a file that is already being edited in another instance, you may want to redirect the activation to that instance instead of opening up another instance that that is already editing the file.

動作の確認、UWP アプリのマルチ インスタンスの作成に関するこのビデオをご覧ください。To see it in action, watch this video about Creating multi-instance UWP apps.

Multi-Instance Redirection UWP app テンプレートは、上記のように SupportsMultipleInstances を package.appxmanifest ファイルに追加し、さらに Main() 関数を含むプロジェクトに Program.cs (または、テンプレートの C++ バージョンを使用している場合は Program.cpp) を追加します。The Multi-Instance Redirection UWP app template adds SupportsMultipleInstances to the package.appxmanifest file as shown above, and also adds a Program.cs (or Program.cpp, if you are using the C++ version of the template) to your project that contains a Main() function. アクティブ化をリダイレクトするためのロジックは Main 関数にあります。The logic for redirecting activation goes in the Main function. テンプレートをProgram.csを次に示します。The template for Program.cs is shown below.

AppInstance.RecommendedInstance プロパティは、1 つを使用する必要がある場合、このアクティブ化要求のシェルで提供される優先インスタンスを表します (またはnullかどうかではありません)。The AppInstance.RecommendedInstance property represents the shell-provided preferred instance for this activation request, if there is one (or null if there isn't one). シェルでは、基本設定を提供する場合、このインスタンスのライセンス認証をリダイレクトできます。 または選択した場合は無視できます。If the shell provides a preference, then you can redirect activation to that instance, or you can ignore it if you choose.

public static class Program
{
    // This example code shows how you could implement the required Main method to
    // support multi-instance redirection. The minimum requirement is to call
    // Application.Start with a new App object. Beyond that, you may delete the
    // rest of the example code and replace it with your custom code if you wish.

    static void Main(string[] args)
    {
        // First, we'll get our activation event args, which are typically richer
        // than the incoming command-line args. We can use these in our app-defined
        // logic for generating the key for this instance.
        IActivatedEventArgs activatedArgs = AppInstance.GetActivatedEventArgs();

        // If the Windows shell indicates a recommended instance, then
        // the app can choose to redirect this activation to that instance instead.
        if (AppInstance.RecommendedInstance != null)
        {
            AppInstance.RecommendedInstance.RedirectActivationTo();
        }
        else
        {
            // Define a key for this instance, based on some app-specific logic.
            // If the key is always unique, then the app will never redirect.
            // If the key is always non-unique, then the app will always redirect
            // to the first instance. In practice, the app should produce a key
            // that is sometimes unique and sometimes not, depending on its own needs.
            string key = Guid.NewGuid().ToString(); // always unique.
                                                    //string key = "Some-App-Defined-Key"; // never unique.
            var instance = AppInstance.FindOrRegisterInstanceForKey(key);
            if (instance.IsCurrentInstance)
            {
                // If we successfully registered this instance, we can now just
                // go ahead and do normal XAML initialization.
                global::Windows.UI.Xaml.Application.Start((p) => new App());
            }
            else
            {
                // Some other instance has registered for this key, so we'll 
                // redirect this activation to that instance instead.
                instance.RedirectActivationTo();
            }
        }
    }
}

Main() 実行する最初のものです。Main() is the first thing that runs. 実行する前に OnLaunched OnActivatedします。It runs before OnLaunched and OnActivated. これにより、アプリの他の初期化コードが実行される前に、これをアクティブ化するか別のインスタンスをアクティブ化するかを決定できます。This allows you to determine whether to activate this, or another instance, before any other initialization code in your app runs.

上記のコードは、アプリケーションの既存のインスタンスまたは新しいインスタンスがアクティブになっているかどうかを判断します。The code above determines whether an existing, or new, instance of your application is activated. キーを使用して、アクティブ化する既存のインスタンスがあるかどうかを判断します。A key is used to determine whether there is an existing instance that you want to activate. たとえば、アプリを起動して ファイルのアクティブ化の処理 ができる場合は、ファイル名をキーとして使用できます。For example, if your app can be launched to Handle file activation, you might use the file name as a key. 次に、アプリのインスタンスがすでにそのキーに登録されているかどうかを確認し、新しいインスタンスを開く代わりにそれをアクティブにすることができます。Then you can check whether an instance of your app is already registered with that key and activate it instead of opening a new instance. これは、コードの考え方です。 var instance = AppInstance.FindOrRegisterInstanceForKey(key);This is the idea behind the code: var instance = AppInstance.FindOrRegisterInstanceForKey(key);

キーに登録されているインスタンスが見つかった場合は、そのインスタンスがアクティブになります。If an instance registered with the key is found, then that instance is activated. キーが見つからない場合は、現在のインスタンス (現在 Main を実行しているインスタンス) がそのアプリケーション オブジェクトを作成し、実行を開始します。If the key is not found, then the current instance (the instance that is currently running Main) creates its application object and starts running.

バックグラウンド タスクとマルチインスタンスBackground tasks and multi-instancing

  • アウトプロセスのバックグラウンド タスクは、マルチインスタンスをサポートします。Out-of-proc background tasks support multi-instancing. 通常、新しいトリガーはバックグラウンド タスクの新しいインスタンスを生成します (ただし、技術的には複数のバックグラウンド タスクが同じホスト プロセスで実行される可能性があります)。Typically, each new trigger results in a new instance of the background task (although technically speaking multiple background tasks may run in same host process). それでも、バックグラウンド タスクの別のインスタンスが作成されます。Nevertheless, a different instance of the background task is created.
  • インプロセスのバックグラウンド タスクは、マルチインスタンスをサポートしません。In-proc background tasks do not support multi-instancing.
  • バックグラウンドのオーディオ タスクは、マルチインスタンスをサポートしません。Background audio tasks do not support multi-instancing.
  • アプリがバックグラウンド タスクを登録すると、通常、タスクがすでに登録されているかどうかを確認し、削除または再登録するか、既存の登録を維持するために何もしません。When an app registers a background task, it usually first checks to see if the task is already registered and then either deletes and re-registers it, or does nothing in order to keep the existing registration. これは、マルチインスタンス アプリの典型的な動作です。This is still the typical behavior with multi-instance apps. しかし、マルチインスタンス アプリでは、インスタンスごとに異なるバックグラウンド タスク名を登録することを選択する場合があります。However, a multi-instancing app may choose to register a different background task name on a per-instance basis. これにより、同じトリガーに対して複数の登録が行われ、トリガーが起動すると複数のバックグラウンド タスクのインスタンスがアクティブになります。This will result in multiple registrations for the same trigger, and multiple background task instances will be activated when the trigger fires.
  • アプリ サービスは、すべての接続に対してアプリ サービス バックグラウンド タスクの別のインスタンスを起動します。App-services launch a separate instance of the app-service background task for every connection. マルチインスタンス アプリの場合、これは変更されません。つまり、マルチインスタンス アプリの各インスタンスは、独自のアプリ サービス バックグラウンド タスクのインスタンスを取得します。This remains unchanged for multi-instance apps, that is each instance of a multi-instance app will get its own instance of the app-service background task.

その他の考慮事項Additional considerations

  • マルチ インスタンスは、デスクトップやモノのインターネット (IoT) プロジェクトをターゲットとする UWP アプリでサポートされています。Multi-instancing is supported by UWP apps that target desktop and Internet of Things (IoT) projects.
  • 競合状態や競合の問題を避けるため、マルチインスタンス アプリは、設定、アプリ ローカル ストレージ、その他のリソース (ユーザー ファイル、データストアなど) へのアクセスをパーティション化/同期化するための手順を実行する必要があります。これらのリソースは、複数のインスタンス間で共有できます。To avoid race-conditions and contention issues, multi-instance apps need to take steps to partition/synchronize access to settings, app-local storage, and any other resource (such as user files, a data store, and so on) that can be shared among multiple instances. ミュー テックス、セマフォ、イベント、およびなどの標準的な同期機構を利用できます。Standard synchronization mechanisms such as mutexes, semaphores, events, and so on, are available.
  • アプリで、Package.appxmanifest ファイルに SupportsMultipleInstances がある場合、その拡張機能は SupportsMultipleInstances を宣言する必要はありません。If the app has SupportsMultipleInstances in its Package.appxmanifest file, then its extensions do not need to declare SupportsMultipleInstances.
  • SupportsMultipleInstances をバックグラウンド タスクやアプリ サービス以外の拡張機能に追加し、その拡張機能をホストするアプリが Package.appxmanifest ファイルで SupportsMultipleInstances を宣言しない場合は、スキーマ エラーが生成されます。If you add SupportsMultipleInstances to any other extension, apart from background tasks or app-services, and the app that hosts the extension doesn't also declare SupportsMultipleInstances in its Package.appxmanifest file, then a schema error is generated.
  • アプリが使用できる、 ResourceGroup 同じホストに複数のバック グラウンド タスクをグループ化、マニフェストで宣言します。Apps can use the ResourceGroup declaration in their manifest to group multiple background tasks into the same host. これはマルチインスタンスと競合し、それぞれのアクティブ化は別々のホストに入ります。This conflicts with multi-instancing, where each activation goes into a separate host. したがって、アプリはマニフェストで SupportsMultipleInstancesResourceGroup の両方を宣言することはできません。Therefore an app cannot declare both SupportsMultipleInstances and ResourceGroup in their manifest.

サンプルSample

参照してくださいマルチ インスタンス サンプルマルチ インスタンスのライセンス認証のリダイレクトの例についてはします。See Multi-Instance sample for an example of multi-instance activation redirection.

関連項目See also

AppInstance.FindOrRegisterInstanceForKey AppInstance.GetActivatedEventArgs AppInstance.RedirectActivationTo アプリのアクティブ化の処理AppInstance.FindOrRegisterInstanceForKey AppInstance.GetActivatedEventArgs AppInstance.RedirectActivationTo Handle app activation