Aplicaciones de instancias múltiples con SDK de Aplicaciones para Windows

De forma predeterminada, una aplicación de escritorio de SDK de Aplicaciones para Windows puede ejecutar varias instancias simultáneamente. Cada instancia se ejecuta como un proceso independiente. Puede controlar este comportamiento mediante la clase Microsoft.Windows.AppLifecycle.AppInstance para registrar instancias, detectar las instancias existentes y redirigir las activaciones.

Escenarios para la administración de instancias múltiples

  • Aplicación de instancia única : redirija las nuevas activaciones a la instancia ya en ejecución.
  • Enrutamiento basado en claves: enrute archivos o URI diferentes a instancias específicas (por ejemplo, una instancia por documento).
  • Detección de instancias: enumera todas las instancias en ejecución para coordinar el trabajo.

Registro de una instancia con una clave

Usa AppInstance.FindOrRegisterForKey en el método Main de tu aplicación para reclamar una clave. Si la clave ya está registrada por otra instancia, puede redirigir la activación. El siguiente método personalizado Main entra en Program.cs, antes de cualquier inicialización XAML:

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

Para usar un método personalizado Main , deshabilite el punto de entrada generado automáticamente. En su .csproj, establezca <DefineConstants>$(DefineConstants);DISABLE_XAML_GENERATED_MAIN</DefineConstants> para agregar el símbolo sin sobrescribir las definiciones existentes.

Aplicación del comportamiento de instancia única

Para que la aplicación sea de instancia única, use siempre la misma clave:

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

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

Enumerar instancias en ejecución

Use AppInstance.GetInstances() para detectar todas las instancias registradas:

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

Anulación del registro de una instancia

Cuando la instancia se cierra, el registro se quita automáticamente. También puede anular el registro explícitamente:

AppInstance.GetCurrent().UnregisterKey();

Diferencias con respecto a la funcionalidad multiinstancia de UWP

Feature UWP SDK para aplicaciones de Windows
Namespace Windows.ApplicationModel.AppInstance Microsoft.Windows.AppLifecycle.AppInstance
Requisito de manifiesto atributo SupportsMultipleInstances No es necesario para las aplicaciones de escritorio
Detección de instancias AppInstance.GetInstances() AppInstance.GetInstances() (mismo patrón)
Redirección de activación AppInstance.RedirectActivationTo() AppInstance.RedirectActivationToAsync() (asincrónico)
Punto de entrada principal personalizado Obligatorio Obligatorio (mismo enfoque)