.Net / Mono Singleton (¿Servicio / Servidor?) En C #: detectar si mi aplicación .net ya se está ejecutando y pasarle argumentos de línea de comandos

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

Pregunta

Me gustaría crear una aplicación simple de línea de comandos singleton (¿un servicio?) en C # que cuando se ejecutó, verificó si ya se estaba ejecutando, y de ser así, pasó los argumentos de la línea de comandos al Ya se está ejecutando instancia y se cerró. Ahora, en la instancia ya en ejecución, recibiría los argumentos de la línea de comandos a través de un evento como " delegate void Command (string [] args); " o algo así, para poder administrar la línea de comandos a través de una aplicación a través de eventos.

Por ejemplo, en Photoshop, cuando abre una imagen por primera vez, carga una nueva instancia de Photoshop, pero cuando abre una segunda imagen, comprueba si ya se está ejecutando una instancia de Photoshop, y si está , pasa la imagen a la instancia de Photoshop ya cargada para que pueda evitar el costoso tiempo de carga de Photoshop de nuevo ...

O en el navegador web, puede configurarlo para que si abre un nuevo archivo .html, lo abre en una nueva pestaña, no en una nueva instancia de ventana.

o muchos editores de texto tienen configuraciones para permitir que solo se abra una instancia del editor de texto y cuando se abre un nuevo archivo, se carga en una nueva pestaña, no en una nueva ventana ...

muchos reproductores de música como winamp también hacen esto ...

Eventualmente voy a configurar esto como un servicio, por lo que debería escuchar constantemente los argumentos de la línea de comandos más tarde, pero por ahora es principalmente para que pueda administrar la apertura de archivos de un tipo específico juntos en uno aplicación singleton, o que otras aplicaciones pasen argumentos de la línea de comandos de los archivos que desean abrir ...

Además, si conoce una mejor manera o una api en .Net para redirigir todos los argumentos de línea de comandos pasados, a un evento de un servicio que siempre se está ejecutando, puedo trabajar con eso ... pero ' También me gustaría mantener esta plataforma cruzada para que pueda ejecutarse en Linux / Mac en Mono si es posible, sin tener que administrar dos o más bases de código ...

¿Fue útil?

Solución

Este es el artículo que utilicé para implementar la funcionalidad exacta que está buscando, también le permite transferir argumentos de línea de comandos.

Aplicación C # de instancia única - para .NET 2.0

Otros consejos

Hicimos algo similar usando aunque para un propósito muy diferente usando .net remoting en el marco 1.0 / 1.1. Básicamente, usaríamos un semáforo para asegurarnos de que éramos la única instancia en ejecución. Querrá apuntar al espacio de nombres global, si desea tener solo una instancia por máquina o local si desea una por sesión de usuario (en servicio de terminal y escenarios de cambio rápido de usuario).

Si puede bloquear el semphore, configurará la comunicación remota y comenzará a escuchar eventos, y luego continuará con su código.

si no puede bloquear, puede suponer que tiene otra instancia en ejecución, en cuyo caso abrirá un canal remoto para que la otra instancia pase los argumentos y se apague.

Puede intentar usar un mutex con nombre (nombrarlo lo hará en todo el sistema y será fácilmente identificable). Con el mutex, puede ejecutar la instancia (si no existe un mutex con el nombre), o puede abrir la instancia existente y pasar sus parámetros. Disculpas por no tener código de muestra, escribir esto desde mi teléfono.

Editar: nvrmnd. Simplemente vuelva a leer la publicación, y no creo que esto funcione para que vaya multiplataforma.

Visual basic tiene esto incorporado. Echa un vistazo a:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - Public Event StartupNextInstance

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top