visual studio servicio instalar instalador crear c# windows service windows-services installutil

c# - instalador - Instalar el servicio de Windows creado en Visual Studio



windows service visual studio 2015 (6)

Aquí hay una forma alternativa de crear el instalador y deshacerse de ese mensaje de error. También parece que VS2015 express no tiene el elemento de menú "Agregar instalador".

Simplemente necesita crear una clase y agregar el código a continuación y agregar la referencia System.Configuration.Install.dll.

using System.Configuration.Install; using System.ServiceProcess; using System.ComponentModel; namespace SAS { [RunInstaller(true)] public class MyProjectInstaller : Installer { private ServiceInstaller serviceInstaller1; private ServiceProcessInstaller processInstaller; public MyProjectInstaller() { // Instantiate installer for process and service. processInstaller = new ServiceProcessInstaller(); serviceInstaller1 = new ServiceInstaller(); // The service runs under the system account. processInstaller.Account = ServiceAccount.LocalSystem; // The service is started manually. serviceInstaller1.StartType = ServiceStartMode.Manual; // ServiceName must equal those on ServiceBase derived classes. serviceInstaller1.ServiceName = "SAS Service"; // Add installer to collection. Order is not important if more than one service. Installers.Add(serviceInstaller1); Installers.Add(processInstaller); } } }

Cuando creo un nuevo servicio de Windows en Visual Studio 2010, aparece el mensaje que indica que debo usar InstallUtil y net start para ejecutar el servicio.

He intentado los siguientes pasos:

  1. Crear nuevo proyecto Archivo -> Nuevo -> Proyecto -> Servicio de Windows
  2. Nombre del proyecto: TestService
  3. Construir el proyecto como está (constructor Service1, OnStart, OnStop)
  4. Abra el símbolo del sistema, ejecute "C: / Windows / Microsoft.NET / Framework / v4.0.30319 / InstallUtil.exe" TestService.exe
  5. Ejecute net start TestService .

Salida del paso 4

Ejecutando una instalación transaccionada.

Comenzando la fase de instalación de la instalación.

Vea el contenido del archivo de registro para el progreso del ensamblado C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestService / obj / x86 / Debug / TestService.exe.

El archivo se encuentra en C: / Users / myusername / Documents / Visual Studio 2010 / Projects / Tes tService / TestService / obj / x86 / Debug / TestService.InstallLog.

Instalación del ensamblado ''C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestService / obj / x86 / Debug / TestService.exe''.

Los parámetros afectados son:

logtoconsole =

logfile = C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / T estService / obj / x86 / Debug / TestService.InstallLog

assemblypath = C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestServ ice / TestService / obj / x86 / Debug / TestService.exe

No se pueden encontrar instaladores públicos con el atributo RunInstallerAttribute.Yes en el ensamblado C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestSe rvice / obj / x86 / Debug / TestService.exe.

La fase de instalación se completó con éxito, y la fase de compromiso está comenzando.

Vea el contenido del archivo de registro para el progreso del ensamblado C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestService / obj / x86 / Debug / TestService.exe.

El archivo se encuentra en C: / Users / myusername / Documents / Visual Studio 2010 / Projects / Tes tService / TestService / obj / x86 / Debug / TestService.InstallLog.

Compromiso de ensamblado ''C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestService / obj / x86 / Debug / TestService.exe''.

Los parámetros afectados son:

logtoconsole =

logfile = C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / T estService / obj / x86 / Debug / TestService.InstallLog

assemblypath = C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestServ ice / TestService / obj / x86 / Debug / TestService.exe

No se pueden encontrar instaladores públicos con el atributo RunInstallerAttribute.Yes en el ensamblado C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestSe rvice / obj / x86 / Debug / TestService.exe.

Quite el archivo InstallState porque no hay instaladores.

La fase de compromiso se completó con éxito.

La instalación realizada ha finalizado.

Salida del paso 5

El nombre del servicio no es válido.

Para obtener más ayuda, escriba NET HELPMSG 2185.


Debe abrir el archivo Service.cs en el diseñador, hacer clic con el botón derecho y seleccionar la opción de menú "Agregar instalador".

No se instalará de inmediato ... primero debe crear la clase de instalador.

Alguna referencia en el instalador de servicio:

Cómo agregar instaladores a su aplicación de servicio

Bastante viejo ... pero esto es de lo que estoy hablando:

Servicios de Windows en C #: Agregar el instalador (parte 3)

Al hacer esto, se ProjectInstaller.cs automáticamente un ProjectInstaller.cs . Luego puede hacer doble clic en esto, ingresar al diseñador y configurar los componentes:

  • serviceInstaller1 tiene las propiedades del servicio en sí: Description , DisplayName , ServiceName y StartType son las más importantes.

  • serviceProcessInstaller1 tiene esta importante propiedad: Account thas es la cuenta en la que se ejecutará el servicio.

Por ejemplo:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;


Dos problemas típicos:

  1. Falta la clase ProjectInstaller (como @MiguelAngelo ha apuntado)
  2. El símbolo del sistema debe "Ejecutarse como administrador "

Mirando a:

No se pueden encontrar instaladores públicos con el atributo RunInstallerAttribute.Yes en el ensamblado C: / Users / myusername / Documents / Visual Studio 2010 / Projects / TestService / TestSe rvice / obj / x86 / Debug / TestService.exe.

Parece que no tienes una clase de instalador en tu código. Esta es una clase installutil del Installer que le informará a installutil cómo instalar su ejecutable como un servicio.

PD Tengo mi propia pequeña plantilla de servicio de Windows autoinstalable / depurable de la que puede copiar código o usar: Depurable, instalación automática del servicio de Windows


Otro posible problema (con el que me encontré):

Asegúrese de que la clase ProjectInstaller sea public . Para ser sincero, no estoy seguro de cómo exactamente lo hice, pero agregué controladores de eventos a ProjectInstaller.Designer.cs , como:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Supongo que durante el proceso automático de creación de la función de controlador en ProjectInstaller.cs cambió la definición de clase de

public class ProjectInstaller : System.Configuration.Install.Installer

a

partial class ProjectInstaller : System.Configuration.Install.Installer

reemplazando la palabra clave public con partial . Entonces, para arreglarlo debe ser

public partial class ProjectInstaller : System.Configuration.Install.Installer

Uso la edición Visual Studio 2013 Community.


Cambio sigiloso en VS 2010 y .NET 4.0 y posterior

No se pueden encontrar instaladores públicos con el atributo RunInstallerAttribute.Yes

Hay un cambio de alias o limpieza del compilador en .NET que puede revelar este pequeño ajuste para su caso específico.

Si tiene el siguiente código ...

RunInstaller(true) // old alias

Es posible que deba actualizarlo a

RunInstallerAttribute(true) // new property spelling

Es como un alias cambiado bajo las cubiertas en tiempo de compilación o en tiempo de ejecución y obtendrá este comportamiento de error. El cambio explícito anterior a RunInstallerAttribute (true) lo solucionó en todos nuestros escenarios de instalación en todas las máquinas.

Después de agregar el proyecto o el instalador del servicio, busque el "viejo" RunInstaller (verdadero) y cámbielo al nuevo RunInstallerAttribute (verdadero)