Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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) |