En .NET, ¿cuál es la mejor manera de evitar que se ejecuten varias instancias de una aplicación al mismo tiempo? Y si no hay una "mejor" técnica, ¿cuáles son algunas de las advertencias a considerar con cada solución?
123
Utiliza Mutex. Uno de los ejemplos anteriores que usa GetProcessByName tiene muchas advertencias. Aquí hay un buen artículo sobre el tema:
http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx
[STAThread]
static void Main()
{
using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
Application.Run(new Form1());
}
}
private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;
que obtendrá el guid del ensamblaje ejecutorfuente
Aquí está el código que necesita para asegurarse de que solo se esté ejecutando una instancia. Este es el método de usar un mutex con nombre.
fuente
Hanselman tiene una publicación sobre el uso de la clase WinFormsApplicationBase del ensamblado Microsoft.VisualBasic para hacer esto.
fuente
Parece que hay 3 técnicas fundamentales que se han sugerido hasta ahora.
¿Alguna advertencia que me haya perdido?
fuente
1 - Crear una referencia en program.cs ->
2 - Poner en
void Main()
como la primera línea de código ->Eso es.
fuente
Mutex
? ¿Hay alguna trampa?Usando Visual Studio 2005 o 2008 cuando crea un proyecto para un ejecutable, en las ventanas de propiedades dentro del panel "Aplicación" hay una casilla de verificación llamada "Crear aplicación de instancia única" que puede activar para convertir la aplicación en una aplicación de instancia única .
Aquí hay una captura de la ventana de la que estoy hablando: Este es un proyecto de aplicación de Windows de Visual Studio 2008.
fuente
Probé todas las soluciones aquí y nada funcionó en mi proyecto C # .net 4.0. Con la esperanza de ayudar a alguien aquí, la solución que funcionó para mí:
Como principales variables de clase:
Cuando necesite verificar si la aplicación ya se está ejecutando:
Necesitaba cerrar otras istances solo con algunas condiciones, esto funcionó bien para mi propósito
fuente
http://en.csharp-online.net/Application_Architecture_in_Windows_Forms_2.0 — Single-Instance_Detection_and_Management
fuente
Después de probar varias soluciones, la pregunta. Terminé usando el ejemplo para WPF aquí: http://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/
En App.xaml:
fuente
Este artículo simplemente explica cómo puede crear una aplicación de Windows con control sobre el número de instancias o ejecutar solo una instancia. Esta es una necesidad muy típica de una aplicación comercial. Ya hay muchas otras posibles soluciones para controlar esto.
http://www.openwinforms.com/single_instance_application.html
fuente
Use VB.NET! No realmente ;)
usando Microsoft.VisualBasic.ApplicationServices;
WindowsFormsApplicationBase de VB.Net le proporciona una propiedad "SingleInstace", que determina otras instancias y permite que solo se ejecute una instancia.
fuente
Este es el código para VB.Net
Este es el código para C #
fuente
http://www.codeproject.com/KB/cs/SingleInstancingWithIpc.aspx
fuente
Tienes que usar System.Diagnostics.Process.
Echa un vistazo: http://www.devx.com/tips/Tip/20044
fuente
(Nota: ¡esta es una solución divertida! Funciona pero utiliza un mal diseño GDI + para lograrlo).
Coloque una imagen con su aplicación y cárguela al inicio. Sosténgalo hasta que salga la aplicación. El usuario no podrá iniciar una segunda instancia. (Por supuesto, la solución mutex es mucho más limpia)
fuente
Main()
método que vaya en contra de cómo se supone que funciona WPF.De: Asegurar una única instancia de aplicación .NET
y: Aplicación de instancia única Mutex
Misma respuesta que @Smink y @Imjustpondering con un toque:
Preguntas frecuentes de Jon Skeet sobre C # para descubrir por qué GC.KeepAlive es importante
fuente
Simplemente usando a
StreamWriter
, ¿qué tal esto?y
fuente
Normalmente se realiza con un Mutex con nombre (use un nuevo Mutex ("nombre de su aplicación", verdadero) y verifique el valor de retorno), pero también hay algunas clases de soporte en Microsoft.VisualBasic.dll que pueden hacerlo por usted .
fuente
Esto funcionó para mí en C # puro. el intento / captura es cuando posiblemente un proceso en la lista salga durante su ciclo.
fuente
Asegúrese de tener en cuenta la seguridad al restringir una aplicación a una sola instancia:
Artículo completo: https://blogs.msdn.microsoft.com/oldnewthing/20060620-13/?p=30813
...
...
Intente configurar un DACL en su mutex, aquí está la forma .NET: https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity(v=vs.110).aspx
fuente
Ninguna de estas respuestas funcionó para mí porque necesitaba que esto funcionara bajo Linux usando monodevelop. Esto funciona muy bien para mí:
Llame a este método pasándole una identificación única
fuente