Instale el servicio de Windows creado en Visual Studio

136

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

He intentado los siguientes pasos:

  1. Crear nuevo archivo de proyecto -> Nuevo -> Proyecto -> Servicio de Windows
  2. Nombre del proyecto: TestService
  3. Proyecto de compilación tal 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 realizada.

Comienzo de la fase de instalación de la instalación.

Consulte 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 \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Los parámetros afectados son:

logtoconsole =

archivo de registro = 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 encontraron instaladores públicos con el atributo RunInstallerAttribute.Sí en el ensamblaje 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 confirmación está comenzando.

Consulte 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.

Confirmación del ensamblado 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Los parámetros afectados son:

logtoconsole =

archivo de registro = 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 encontraron instaladores públicos con el atributo RunInstallerAttribute.Sí en el ensamblaje C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Elimine el archivo InstallState porque no hay instaladores.

La fase de confirmación se completó con éxito.

La instalación realizada se ha completado.

Salida del paso 5

El nombre del servicio no es válido.

Hay más ayuda disponible escribiendo NET HELPMSG 2185.

jkh
fuente

Respuestas:

243

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

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

Alguna referencia sobre el instalador de servicio:

Cómo: Agregar instaladores a su aplicación de servicio

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

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

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

  • serviceInstaller1tiene las propiedades del servicio en sí: Description, DisplayName, ServiceNamey StartTypeson los más importantes.

  • serviceProcessInstaller1tiene esta propiedad importante: Accountesa es la cuenta en la que se ejecutará el servicio.

Por ejemplo:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Miguel angelo
fuente
3
Agregar el instalador y configurar la cuenta en LocalSystem lo hizo. ¡Gracias!
Luc
1
Recibo el mismo error en VS2013. Verifiqué los enlaces que proporcionó, verifiqué que tengo ProjectInstaller, incluido el servicio de componentes [Proceso] Installer1, configurado correctamente. Ejecuto installutil.exe como administrador. Todavía informa "No se pudieron encontrar instaladores públicos con el atributo RunInstallerAttribute.Yes". ¿Algunas ideas?
Barry Dysert
44
Jajaja Me encanta que el enlace "Muy viejo" es a un sitio llamado Código Arcano. Cuanto más vieja es esa página, más verdadero se vuelve el nombre :-)
HotN
¿Qué es "el diseñador"? Las aplicaciones que no tienen interfaz de usuario generalmente no implican nada que se llamaría diseñador.
Maxx
Los servicios también tienen un diseñador, al igual que los formularios
Grungondola
11

Mirando a:

No se encontraron instaladores públicos con el atributo RunInstallerAttribute.Sí en el ensamblaje C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe.

Parece que es posible que no tenga una clase de instalador en su código. Esta es una clase que hereda de Installereso le dirá installutilcómo instalar su ejecutable como servicio.

Ps tengo mi propio pequeño plantilla de auto-instalación / depurable servicio de Windows aquí que se puede copiar código de o uso: depurable, con instalación automática de servicios de Windows

James Michael Hare
fuente
Cuando hago clic derecho en el proyecto TestService en Visual Studio -> Propiedades -> Servicios, la página está deshabilitada ... ¿se refería a una ubicación diferente? En Aplicación, el nombre del ensamblado es TestService.
jkh
@John: Ignora la primera parte sobre la consola de servicios, mira la segunda parte comenzando con Actually . Parece que el servicio nunca se instaló porque no encontró un instalador.
James Michael Hare
8

Aquí hay una forma alternativa de hacer 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 siguiente código 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);
        }
    }
}
Villancico
fuente
Ejecutar VS2015 también y esta solución me superó el mensaje de error "No hay instaladores públicos con RunInstallerAttribute.Yes" que estaba recibiendo anteriormente. ¡Gracias!
PHBeagle
6

Dos problemas típicos:

  1. Falta la clase ProjectInstaller (como ha señalado @MiguelAngelo)
  2. El símbolo del sistema debe "Ejecutar como administrador "
fabriciorissetto
fuente
4

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

Asegúrate de que la ProjectInstallerclase sea public. Para ser honesto, no estoy seguro de cómo lo hice exactamente, pero agregué controladores de eventos 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 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 publicpalabra clave con partial. Entonces, para arreglarlo debe ser

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

Yo uso Visual Studio 2013 Community edition.

John Archer
fuente
Sé que esto es 3 años después, pero esto resolvió mi problema. No estoy seguro de por qué o cuándo el diseñador cambió la clase parcial pública anterior a una clase parcial interna. ¡Gracias!
Trashrobber
2

Cambio de sigilo en VS 2010 y .NET 4.0 y posterior

No se encontraron instaladores públicos con el atributo RunInstallerAttribute. Sí.

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 (verdadero) lo solucionó en todos nuestros escenarios de instalación en todas las máquinas.

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

Sql Surfer
fuente
Según mi conocimiento, puede omitir el postfix "Atributo", es decir, [RunInstaller (verdadero)] y [RunInstallerAttribute (verdadero)] es el mismo. Pruébelo con un atributo diferente, por ejemplo, [DebuggerStepThrough ()] y [DebuggerStepThroughAttribute ()]; ambos funcionarán cuando se apliquen a una clase.
Matt
1

Sin embargo, me encontré con otro problema: asegúrese de que su clase derivada del instalador (normalmente ProjectInstaller) esté en la parte superior de la jerarquía del espacio de nombres, intenté usar una clase pública dentro de otra clase pública, pero esto da como resultado el mismo error anterior:

No se encontraron instaladores públicos con el atributo RunInstallerAttribute. Sí.


fuente