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:
- Crear nuevo proyecto Archivo -> Nuevo -> Proyecto -> Servicio de Windows
- Nombre del proyecto: TestService
- Construir el proyecto como está (constructor Service1, OnStart, OnStop)
- Abra el símbolo del sistema, ejecute "C: / Windows / Microsoft.NET / Framework / v4.0.30319 / InstallUtil.exe" TestService.exe
- 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
yStartType
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:
- Falta la clase ProjectInstaller (como @MiguelAngelo ha apuntado)
- 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)