Réponses:
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 de configuration.
Faites un clic 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 pour différentes versions de Visual Studio. b. Visual Studio 2010, il se trouve dans: Modèles d'installation> Autres types de projets> Installation et déploiement> Programme d'installation de Visual Studio
À la deuxième étape, sélectionnez «Créer une installation pour une application Windows».
À la 3ème étape, sélectionnez "Sortie principale de ..."
Cliquez sur pour terminer.
Modifiez ensuite votre programme d'installation pour vous assurer que la sortie correcte est incluse.
Vous pouvez modifier le nom de sortie du programme d'installation en cliquant avec le bouton droit sur le projet Installer dans votre solution et en sélectionnant Propriétés. Changez le 'Nom du fichier de sortie:' en celui que vous voulez. En sélectionnant le projet d'installation ainsi et en regardant les propriétés de fenêtres, vous pouvez modifier le Product Name
, Title
, Manufacturer
, etc ...
Ensuite, construisez votre programme d'installation et il produira un MSI et un setup.exe. Choisissez celui que vous souhaitez utiliser pour déployer votre service.
Service name contains invalid characters, is empty, or is too long (max length = 80)
erreur lors de l'ajout du programme d'installation, cliquez à nouveau avec le bouton droit de la souris dans la zone grise, accédez à Propriétés et assurez-vous que la valeur du nom du service est définie.
Je suis le premier ensemble d'é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 fais auto-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;
}
Windows Application
et objet de démarrage: (none)
. J'ai dû changer le type de sortie Console Application
et définir mon objet de démarrage, par exemple myservice.Program
. S'il peut y avoir des ramifications dont je ne suis pas au courant, veuillez en informer.
Ni Kelsey, ni les solutions Brendan ne fonctionnent pour moi dans Visual Studio 2015 Community.
Voici mes brèves étapes pour créer un service avec l'installateur:
->
New->
ProjectDouble-cliquez sur serviceInstaller1. Visual Studio crée un serviceInstaller1_AfterInstall
événement. Ecrire le code:
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (System.ServiceProcess.ServiceController sc = new
System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
sc.Start();
}
}
Créer une solution. Faites un clic droit sur le projet et sélectionnez «Ouvrir le dossier dans l'explorateur de fichiers». Accédez à 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
par /u
)Pour VS2017, vous devrez ajouter l'extension VS «Projets d'installation 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 assistant d'installation et suivre les étapes de la réponse de Kelsey https://stackoverflow.com/a/9021107/1040040
Les classes InstallUtil (ServiceInstaller) sont considérées comme un anti-modèle par la communauté Windows Installer. C'est une réinvention fragile, hors processus, de la roue qui ignore le fait que Windows Installer a un support intégré pour les services.
Les projets de déploiement Visual Studio (également peu appréciés et obsolètes dans la prochaine version de Visual Studio) ne disposent pas de la prise en charge native des services. Mais ils peuvent consommer des modules de fusion. Je voudrais donc jeter un œil à cet article de blog pour comprendre comment créer un module de fusion à l'aide de Windows Installer XML qui peut exprimer le service, puis consommer ce module de fusion dans votre solution VDPROJ.
Augmenter InstallShield à l'aide de Windows Installer XML - Services Windows