Comment créer un programme d'installation pour un service Windows créé à l'aide de Visual Studio?
Dans le projet de service, procédez comme suit:
Vous devez maintenant créer un projet d’installation. La meilleure chose à faire est d'utiliser l'assistant d'installation.
Cliquez avec le bouton droit sur votre solution et ajoutez un nouveau projet: Ajouter> Nouveau projet> Projets de configuration et de déploiement> Assistant de configuration
une. Cela peut varier légèrement selon les versions de Visual Studio. b. Visual Studio 2010 il se trouve dans: Modèles d’installation> Autres types de projets> Configuration et déploiement> Programme d’installation de Visual Studio
À la deuxième étape, sélectionnez "Créer une configuration pour une application Windows".
Ensuite, éditez votre programme d’installation pour vous assurer que le bon résultat est inclus.
Vous pouvez modifier le nom de sortie du programme d'installation en cliquant avec le bouton droit de la souris sur le projet d'installation dans votre solution et en sélectionnant Propriétés. Changez le 'Nom du fichier de sortie:' comme vous voulez. En sélectionnant également le projet d'installation et en regardant les fenêtres de propriétés, vous pouvez éditer le Product Name
, Title
, Manufacturer
, etc ...
Ensuite, construisez votre programme d’installation et il produira un fichier MSI et un fichier setup.exe. Choisissez celui que vous souhaitez utiliser pour déployer votre service.
Je suis les premières étapes de Kelsey pour ajouter les classes du programme d’installation à mon projet de service, mais au lieu de créer un programme d’installation MSI ou setup.exe, je m’autorise à installer/désinstaller le service. Voici un exemple de code d'un de mes services que vous pouvez utiliser comme point de départ.
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;
}
Ni Kelsey, ni les solutions Brendan ne fonctionnent pas pour moi dans Visual Studio 2015 Community.
Voici mes brèves étapes pour créer un service avec un installateur:
->
New->
ProjectDouble-cliquez sur serviceInstaller1. Visual Studio crée un événement _serviceInstaller1_AfterInstall
_. Écrire le code:
_private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (System.ServiceProcess.ServiceController sc = new
System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
sc.Start();
}
}
_
Construire la solution. Faites un clic droit sur le projet et sélectionnez "Ouvrir le dossier dans l'explorateur de fichiers". Allez à bin\Debug.
Créez install.bat avec le script ci-dessous:
_:::::::::::::::::::::::::::::::::::::::::
:: 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
_
/i
_ en _/u
_)Pour VS2017, vous devrez ajouter l'extension VS "Projets d'installation de Microsoft Visual Studio 2017". Cela vous donnera des modèles de projet Visual Studio Installer supplémentaires. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Pour installer le service Windows, vous pouvez ajouter un nouveau projet de type d’assistant d’installation et suivre les étapes de la réponse de Kelsey https://stackoverflow.com/a/9021107/104004
Les classes InstallUtil (ServiceInstaller) sont considérées comme des anti-modèles par la communauté Windows Installer. C'est un processus fragile, hors processus, qui réinvente la roue sans tenir compte du fait que Windows Installer prend en charge les services de manière intégrée.
Les projets de déploiement de Visual Studio (qui ne sont pas non plus hautement considérés et déconseillés dans la prochaine version de Visual Studio) ne prennent pas en charge les services en natif. Mais ils peuvent consommer des modules de fusion. Je voudrais donc jeter un coup d'œil à cet article de blog pour comprendre comment créer un module de fusion à l'aide de XML Windows Installer pouvant exprimer le service, puis utiliser ce module de fusion dans votre solution VDPROJ.
Augmenter InstallShield en utilisant Windows Installer XML - Services Windows
Je sais que c'est un vieux fil, mais je voulais juste ajouter mes 2 centimes. J'ai toujours détesté la façon dont vous gérez un projet de service dans VS. C'est pourquoi j'ai utilisé Topshelf pendant de nombreuses années maintenant. Prenez du recul, ne créez pas de projet de service mais un projet de console, puis ajoutez-lui Topshelf. C'est effrayant facile.