visual studio servicio instalador ejecutable crear c# .net visual-studio windows-services windows-installer

c# - ejecutable - Cómo crear un instalador para un servicio.net de Windows usando Visual Studio



crear servicio windows c# 2015 (5)

¿Cómo creo un instalador para un servicio de Windows que he creado usando Visual Studio?


En el proyecto de servicio, haga lo siguiente:

  1. En el explorador de soluciones, haga doble clic en su archivo .cs de servicios. Debería mostrar una pantalla que es todo gris y habla sobre cómo arrastrar cosas desde la caja de herramientas.
  2. A continuación, haga clic derecho en el área gris y seleccione agregar instalador. Esto agregará un archivo de proyecto de instalador a su proyecto.
  3. Luego tendrá 2 componentes en la vista de diseño de ProjectInstaller.cs (serviceProcessInstaller1 y serviceInstaller1). Luego debe configurar las propiedades que necesita, como el nombre del servicio y el usuario con el que debe ejecutarse.

Ahora necesita hacer un proyecto de instalación. Lo mejor que puedes hacer es usar el asistente de configuración.

  1. Haga clic con el botón derecho en su solución y agregue un nuevo proyecto: Agregar> Nuevo proyecto> Proyectos de configuración e implementación> Asistente de configuración

    a. Esto podría variar ligeramente para las diferentes versiones de Visual Studio. segundo. Visual Studio 2010 se encuentra en: Instalar plantillas> Otros tipos de proyectos> Configuración e implementación> Visual Studio Installer

  2. En el segundo paso, seleccione "Crear una configuración para una aplicación de Windows".

  3. En el 3er paso, selecciona "Salida primaria desde ..."
  4. Haga clic para terminar.

Luego edite su instalador para asegurarse de que se incluye la salida correcta.

  1. Haga clic derecho en el proyecto de instalación en su Solution Explorer.
  2. Seleccione Ver> Acciones personalizadas. (En VS2008 podría ser Ver> Editor> Acciones personalizadas)
  3. Haga clic con el botón derecho en la acción Instalar en el árbol de Acciones personalizadas y seleccione ''Agregar acción personalizada ...''
  4. En el cuadro de diálogo "Seleccionar elemento en el proyecto", seleccione Carpeta de la aplicación y haga clic en Aceptar.
  5. Haga clic en Aceptar para seleccionar la opción "Salida principal desde ...". Se debe crear un nuevo nodo.
  6. Repita los pasos 4 - 5 para las acciones de confirmación, reversión y desinstalación.

Puede editar el nombre de salida del instalador haciendo clic con el botón derecho en el proyecto del Instalador en su solución y seleccionando Propiedades. Cambia el ''Nombre del archivo de salida:'' a lo que quieras. Al seleccionar también el proyecto de instalación y mirar las ventanas de propiedades, puede editar el Product Name del Product Name , el Title , el Manufacturer , etc.

Luego crea tu instalador y generará un MSI y un setup.exe. Elija lo que quiera usar para implementar su servicio.


Las clases InstallUtil (ServiceInstaller) se consideran antipatrón por la comunidad de Windows Installer. Es un proceso frágil, fuera de proceso, reinvención de la rueda que ignora el hecho de que Windows Installer tiene soporte integrado para los Servicios.

Los proyectos de implementación de Visual Studio (que tampoco son muy respetados ni obsoletos en la próxima versión de Visual Studio) no cuentan con soporte nativo para los servicios. Pero pueden consumir módulos de fusión. Por lo tanto, eche un vistazo a este artículo de blog para comprender cómo crear un módulo de fusión utilizando Windows Installer XML que puede expresar el servicio y luego consumir ese módulo de fusión en su solución VDPROJ.

Aumento de InstallShield con Windows Installer XML - Servicios de Windows

Tutorial del Servicio IsWiX de Windows

Video de servicio de IsWiX Windows


Ni Kelsey, ni las soluciones Brendan no funcionan para mí en Visual Studio 2015 Community. Aquí está mi breaf pasos cómo crear un servicio con el instalador:

  1. Ejecutar VS, Archivo-> Nuevo-> Proyecto
  2. Seleccione .NET Framework 4, en "Buscar plantillas instaladas", escriba "Servicio"
  3. Seleccione ''Servicio de Windows''. Escriba el nombre y la ubicación. Presiona OK.
  4. Haga doble clic en Service1.cs, haga clic derecho en el diseñador y seleccione ''Agregar instalador''
  5. Haga doble clic en ProjectInstaller.cs. Para serviceProcessInstaller1 abra la pestaña Propiedades y cambie el valor de la propiedad ''Cuenta'' a ''Servicio local''. Para serviceInstaller1, cambie ''ServiceName'' y establezca ''StartType'' en ''Automatic''.
  6. Haga doble clic en serviceInstaller1. VS crea el evento ''serviceInstaller1_AfterInstall''. Escribir código:

    private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) { using (System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName)) { sc.Start(); } }

  7. Construir solución Haga clic derecho en proyecto y seleccione ''Abrir carpeta en el Explorador de archivos''. Ve a bin / Debug.

  8. Crear install.bat con texto:

::::::::::::::::::::::::::::::::::::::::: :: Automatically check & get admin rights ::::::::::::::::::::::::::::::::::::::::: @echo off CLS ECHO. ECHO ============================= ECHO Running Admin shell ECHO ============================= :checkPrivileges NET FILE 1>NUL 2>NUL if ''%errorlevel%'' == ''0'' ( goto gotPrivileges ) else ( goto getPrivileges ) :getPrivileges if ''%1''==''ELEV'' (shift & goto gotPrivileges) ECHO. ECHO ************************************** ECHO Invoking UAC for Privilege Escalation ECHO ************************************** setlocal DisableDelayedExpansion set "batchPath=%~0" setlocal EnableDelayedExpansion ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%/OEgetPrivileges.vbs" ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%/OEgetPrivileges.vbs" "%temp%/OEgetPrivileges.vbs" exit /B :gotPrivileges :::::::::::::::::::::::::::: :START :::::::::::::::::::::::::::: setlocal & pushd . cd /d %~dp0 %windir%/Microsoft.NET/Framework/v4.0.30319/InstallUtil /i "WindowsService1.exe" pause

  1. Crear archivo uninstall.bat (cambiar en penult line / i a / u)
  2. Para instalar e iniciar el servicio, ejecute install.bat, para detener y desinstalar ejecute uninstall.bat


Sigo el primer conjunto de pasos de Kelsey para agregar las clases de instalador a mi proyecto de servicio, pero en lugar de crear un instalador MSI o setup.exe, realizo el servicio autoinstalándose / desinstalando. Aquí hay un poco de código de muestra de uno de mis servicios que puede usar como punto de partida.

public static int Main(string[] args) { if (System.Environment.UserInteractive) { // we only care about the first two characters string arg = args[0].ToLowerInvariant().Substring(0, 2); switch (arg) { case "/i": // install return InstallService(); case "/u": // uninstall return UninstallService(); default: // unknown option Console.WriteLine("Argument not recognized: {0}", args[0]); Console.WriteLine(string.Empty); DisplayUsage(); return 1; } } else { // run as a standard service as we weren''t started by a user ServiceBase.Run(new CSMessageQueueService()); } return 0; } private static int InstallService() { var service = new MyService(); try { // perform specific install steps for our queue service. service.InstallService(); // install the service with the Windows Service Control Manager (SCM) ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location }); } catch (Exception ex) { if (ex.InnerException != null && ex.InnerException.GetType() == typeof(Win32Exception)) { Win32Exception wex = (Win32Exception)ex.InnerException; Console.WriteLine("Error(0x{0:X}): Service already installed!", wex.ErrorCode); return wex.ErrorCode; } else { Console.WriteLine(ex.ToString()); return -1; } } return 0; } private static int UninstallService() { var service = new MyQueueService(); try { // perform specific uninstall steps for our queue service service.UninstallService(); // uninstall the service from the Windows Service Control Manager (SCM) ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location }); } catch (Exception ex) { if (ex.InnerException.GetType() == typeof(Win32Exception)) { Win32Exception wex = (Win32Exception)ex.InnerException; Console.WriteLine("Error(0x{0:X}): Service not installed!", wex.ErrorCode); return wex.ErrorCode; } else { Console.WriteLine(ex.ToString()); return -1; } } return 0; }