Tengo un servicio estándar de Windows .NET escrito en C #.
¿Se puede instalar sin usar InstallUtil? ¿Debo usar la clase de instalador de servicio? ¿Cómo debo usarlo?
Quiero poder llamar a lo siguiente:
MyService.exe -install
Y tendrá el mismo efecto que llamar:
InstallUtil MyService.exe
c#
.net
deployment
windows-services
installutil
Yuval pelado
fuente
fuente
Respuestas:
Sí, eso es totalmente posible (es decir, hago exactamente esto); solo necesita hacer referencia al dll correcto (System.ServiceProcess.dll) y agregar una clase de instalador ...
Aquí hay un ejemplo:
fuente
static void Install(bool undo, string[] args)
definición fuera de una clase (etc.). ¿Puedes aclarar cómo implementaste esto?Eche un vistazo al método InstallHelper de la clase ManagedInstaller . Puede instalar un servicio usando:
Esto es exactamente lo que hace InstallUtil. Los argumentos son los mismos que para InstallUtil.
Los beneficios de este método son que no implica desorden en el registro y utiliza el mismo mecanismo que InstallUtil.
fuente
InstallUtil
hace 3. no necesita cambiar el instalador cuando está en x86 / x64 4. no ha cambiado en varias versiones de .Net, si lo hace , será recogido en las pruebas y lo arreglaré luego.Siempre puede recurrir a las viejas y buenas llamadas de WinAPI, aunque la cantidad de trabajo involucrado no es trivial. No es necesario que los servicios .NET se instalen a través de un mecanismo compatible con .NET.
Instalar:
OpenSCManager
.CreateService
para registrar el servicio.ChangeServiceConfig2
para establecer una descripción.CloseServiceHandle
.Para desinstalar:
OpenSCManager
.OpenService
.DeleteService
al identificador devuelto porOpenService
.CloseServiceHandle
.La razón principal por la que prefiero esto sobre el uso de
ServiceInstaller
/ServiceProcessInstaller
es que puede registrar el servicio con sus propios argumentos de línea de comandos personalizados. Por ejemplo, puede registrarlo como"MyApp.exe -service"
, luego, si el usuario ejecuta su aplicación sin ningún argumento, puede ofrecerle una interfaz de usuario para instalar / eliminar el servicio.Ejecutar Reflector en
ServiceInstaller
puede completar los detalles que faltan en esta breve explicación.PD Claramente, esto no tendrá "el mismo efecto que llamar: InstallUtil MyService.exe", en particular, no podrá desinstalar usando InstallUtil. Pero parece que quizás este no era un requisito estricto para usted.
fuente
Aquí hay una clase que uso cuando escribo servicios. Normalmente tengo una pantalla interactiva que aparece cuando no se llama al servicio. A partir de ahí, uso la clase según sea necesario. Permite múltiples instancias con nombre en la misma máquina, de ahí el campo InstanceID
Llamada de muestra
La clase misma
fuente
GetCurrentProcess
parte con un parámetro y lo usé con éxito. ¡Funciona genial!Los ejemplos anteriores realmente no funcionaron para mí, y el enlace al foro como una solución n. ° 1 es horrible de analizar. Aquí hay una clase que escribí (en parte), y la otra parte se fusionó de este enlace que encontré enterrado en alguna parte
Para instalar un servicio, ejecute el comando InstallAndStart de la siguiente manera:
Asegúrese de que la cuenta que ejecuta el programa tenga permiso para instalar servicios. Siempre puede 'Ejecutar como administrador' en el programa.
También he incluido varios comandos para el acceso sin API que no instalan ni eliminan servicios, pero puede enumerarlos y controlar varios (iniciar, detener, reiniciar). Realmente solo necesita elevar los permisos para instalar o eliminar servicios.
También hay un par de comandos para obtener y establecer variables de entorno, como
OPENSSL_CONF
oTEMP
. En su mayor parte, los parámetros y los nombres de los métodos deberían explicarse por sí mismos.fuente
Unknown = -1, NotFound = 0, Stopped = 1, StartPending = 2, StopPending = 3, Running = 4
En el caso de intentar instalar una aplicación de línea de comandos como un servicio de Windows, intente el ' utilidad NSSM '. Detalles relacionados de ServerFault encontrados aquí .
fuente
fuente