Többpéldányos alkalmazások a Windows App SDK-val

Alapértelmezés szerint egy Windows App SDK asztali alkalmazás egyszerre több példányt is futtathat. Minden példány külön folyamatként fut. Ezt a viselkedést a Microsoft.Windows használatával szabályozhatja. Az AppLifecycle.AppInstance osztály a példányok regisztrálására, a meglévők észlelésére és az aktiválások átirányítására használható.

Forgatókönyvek többpéldányos felügyelethez

  • Egypéldányos kényszerítés – Új aktiválások átirányítása a már futó példányra.
  • Kulcsalapú útválasztás – Különböző fájlok vagy URI-k átirányítása adott példányokhoz (például dokumentumonként egy példány).
  • Példányfelderítés – Az összes futó példány számbavétele a munka koordinálásához.

Példány regisztrálása kulccsal

Használja a(z) AppInstance.FindOrRegisterForKey elemet az alkalmazás Main metódusában egy kulcs igényléséhez. Ha a kulcsot már regisztrálta egy másik példány, átirányíthatja az aktiválást. Az alábbi egyéni Main metódus a(z) Program.cs elembe kerül, még az XAML inicializálása előtt:

using Microsoft.Windows.AppLifecycle;

public static class Program
{

[STAThread]
static async Task Main(string[] args)
{
    // Required before calling any other Windows App SDK or WinRT API
    // from a custom entry point.
    WinRT.ComWrappersSupport.InitializeComWrappers();

    // Determine a key for this activation
    string instanceKey = "main-instance";

    var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
    if (activatedArgs.Kind == ExtendedActivationKind.File)
    {
        var fileArgs = activatedArgs.Data as
            Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
        // Use the file path as the instance key to route
        // each file to its own instance
        if (fileArgs?.Files is { Count: > 0 })
        {
            instanceKey = fileArgs.Files[0].Path;
        }
    }

    var instance = AppInstance.FindOrRegisterForKey(instanceKey);

    if (!instance.IsCurrent)
    {
        // Another instance owns this key — redirect activation to it
        await instance.RedirectActivationToAsync(activatedArgs);
        return; // Exit this process
    }

    // This instance owns the key — proceed with normal startup
    // Register for future redirected activations
    instance.Activated += OnActivated;

    Application.Start((p) =>
    {
        var context = new DispatcherQueueSynchronizationContext(
            DispatcherQueue.GetForCurrentThread());
        SynchronizationContext.SetSynchronizationContext(context);
        _ = new App();
    });
}

private static void OnActivated(object? sender, AppActivationArguments args)
{
    // Handle the redirected activation on the UI thread
    // For example, open the file or navigate to the URI
}

// App is the application type generated by the WinUI 3 project template
// (App.xaml / App.xaml.cs).
private partial class App : Microsoft.UI.Xaml.Application
{
}

}

Note

Egyéni Main metódus használatához tiltsa le az automatikusan létrehozott belépési pontot. A(z) .csproj elemben állítsa be a(z) <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> értékét úgy, hogy a szimbólumot a meglévő definíciók felülírása nélkül fűzze hozzá.

Egypéldányos viselkedés kényszerítése

Az alkalmazás egypéldányossá alakításához mindig ugyanazt a kulcsot használja:

var instance = AppInstance.FindOrRegisterForKey("single-instance");

if (!instance.IsCurrent)
{
    await instance.RedirectActivationToAsync(
        AppInstance.GetCurrent().GetActivatedEventArgs());
    return;
}

Futó példányok számbavétele

A(z) AppInstance.GetInstances() használatával felderítheti az összes regisztrált példányt:

var instances = AppInstance.GetInstances();
foreach (var inst in instances)
{
    System.Diagnostics.Debug.WriteLine(
        $"Key: {inst.Key}, ProcessId: {inst.ProcessId}");
}

Példány regisztrációjának megszüntetése

Amikor a példány leáll, a rendszer automatikusan eltávolítja a regisztrációt. A regisztrációt explicit módon is megszüntetheti:

AppInstance.GetCurrent().UnregisterKey();

Különbségek a többpéldányos UWP-től

Funkció UWP Windows App SDK
Namespace Windows.ApplicationModel.AppInstance Microsoft.Windows.AppLifecycle.AppInstance
Manifesztumkövetelmény SupportsMultipleInstances attribútum Asztali alkalmazásokhoz nem szükséges
Példányfelderítés AppInstance.GetInstances() AppInstance.GetInstances() (ugyanaz a minta)
Aktiválás átirányítása AppInstance.RedirectActivationTo() AppInstance.RedirectActivationToAsync() (async)
Egyéni fő indítási pont Required Kötelező (ugyanaz a megközelítés)