Natalia, parte de este gran equipo de trabajo, nos ha hecho el favor de escribir esta reseña porque conoce a la perfección dicho tema.
Solución:
En el proyecto de servicio, haga lo siguiente:
- En el explorador de soluciones, haga doble clic en el archivo .cs de sus servicios. Debería mostrar una pantalla que es completamente gris y habla de arrastrar cosas desde la caja de herramientas.
- Luego haga clic derecho en el área gris y seleccione agregar instalador. Esto agregará un archivo de proyecto de instalación a su proyecto.
- Luego, tendrá 2 componentes en la vista de diseño de ProjectInstaller.cs (serviceProcessInstaller1 y serviceInstaller1). A continuación, debe configurar las propiedades que necesite, como el nombre del servicio y el usuario con el que debe ejecutarse.
Ahora necesitas hacer un proyecto de instalación. Lo mejor que puede hacer es utilizar el asistente de configuración.
-
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
una. Esto podría variar ligeramente para diferentes versiones de Visual Studio. B. Visual Studio 2010 se encuentra en: Plantillas de instalación> Otros tipos de proyectos> Configuración e implementación> Instalador de Visual Studio
-
En el segundo paso, seleccione “Crear una instalación para una aplicación de Windows”.
-
En el tercer paso, seleccione “Salida primaria de …”
-
Haga clic para finalizar.
A continuación, edite su instalador para asegurarse de que se incluya la salida correcta.
- Haga clic derecho en el proyecto de instalación en su Explorador de soluciones.
- Seleccione Ver> Acciones personalizadas. (En VS2008 podría ser Ver> Editor> Acciones personalizadas)
- Haga clic con el botón derecho en la acción Instalar en el árbol de Acciones personalizadas y seleccione ‘Agregar acción personalizada …’
- En el cuadro de diálogo “Seleccionar elemento en el proyecto”, seleccione Carpeta de la aplicación y haga clic en Aceptar.
- Haga clic en Aceptar para seleccionar la opción “Salida principal de …”. Debería crearse un nuevo nodo.
- Repita los pasos 4 a 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 seleccione Propiedades. Cambie el ‘Nombre del archivo de salida:’ a lo que desee. Al seleccionar también el proyecto del instalador y mirar las ventanas de propiedades, puede editar el Product Name
, Title
, Manufacturer
, etc …
A continuación, compile su instalador y generará un MSI y un setup.exe. Elija el que desee utilizar para implementar su servicio.
Sigo el primer conjunto de pasos de Kelsey para agregar las clases del instalador a mi proyecto de servicio, pero en lugar de crear un instalador MSI o setup.exe, hago que el servicio se instale / desinstale automáticamente. Aquí hay un 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(0x0: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(0x0:X): Service not installed!", wex.ErrorCode);
return wex.ErrorCode;
else
Console.WriteLine(ex.ToString());
return -1;
return 0;
Ni Kelsey, ni las soluciones de Brendan no me funcionan en Visual Studio 2015 Community.
Aquí están mis breves pasos sobre cómo crear un servicio con el instalador:
- Ejecute Visual Studio, vaya a Expediente
->
Nuevo->
Proyecto - Seleccione .NET Framework 4, en el tipo ‘Buscar plantillas instaladas’ ‘Servicio’
- Seleccione ‘Servicio de Windows’. Escriba el nombre y la ubicación. prensa OK.
- Haga doble clic en Service1.cs, haga clic con el botón derecho en el diseñador y seleccione ‘Agregar instalador’
- Haga doble clic en ProjectInstaller.cs. Para serviceProcessInstaller1, abra la pestaña Propiedades y cambie el valor de la propiedad ‘Cuenta’ a ‘LocalService’. Para serviceInstaller1, cambie ‘ServiceName’ y establezca ‘StartType’ en ‘Automático’.
-
Haga doble clic en serviceInstaller1. Visual Studio crea
serviceInstaller1_AfterInstall
evento. Escribir código:private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) using (System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName)) sc.Start();
-
Construir solución. Haga clic derecho en el proyecto y seleccione ‘Abrir carpeta en el Explorador de archivos’. Ir a bin Debug.
-
Cree install.bat con el siguiente script:
::::::::::::::::::::::::::::::::::::::::: :: 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.NETFrameworkv4.0.30319InstallUtil /i "WindowsService1.exe" pause
- Cree el archivo uninstall.bat (cambie en la línea pen-ult
/i
para/u
) - Para instalar e iniciar el servicio, ejecute install.bat, para detener y desinstalar, ejecute uninstall.bat
Comentarios y valoraciones del tutorial
Si haces scroll puedes encontrar los comentarios de otros programadores, tú aún eres capaz dejar el tuyo si dominas el tema.