Par ailleurs le service. StartType = ServiceStartMode.Automatic mon service ne démarre pas après l’installation
Solution
Insérer ce code sur mon ProjectInstaller
Merci à ScottTx et de la Francis B.
Par ailleurs le service. StartType = ServiceStartMode.Automatic mon service ne démarre pas après l’installation
Solution
Insérer ce code sur mon ProjectInstaller
Merci à ScottTx et de la Francis B.
J'ai posté une étape par étape la procédure pour la création d'un service Windows en C# ici. On dirait que vous vous êtes au moins sur ce point, et maintenant vous vous demandez comment faire pour démarrer le service une fois qu'il est installé. Le réglage de la propriété Démarrertype Automatique va entraîner le service démarre automatiquement après le redémarrage de votre système, mais il ne sera pas (comme vous l'avez découvert) démarrer automatiquement votre service après l'installation.
Je ne me souviens pas où je l'ai trouvé à l'origine (peut-être Marc Gravel?), mais j'ai trouvé une solution en ligne qui vous permet d'installer et démarrer le service en cours d'exécution de votre service lui-même. Voici, étape par étape:
La Structure de l' Main()
fonction de votre service comme ceci:
static void Main(string[] args)
{
if (args.Length == 0) {
// Run your service normally.
ServiceBase[] ServicesToRun = new ServiceBase[] {new YourService()};
ServiceBase.Run(ServicesToRun);
} else if (args.Length == 1) {
switch (args[0]) {
case "-install":
InstallService();
StartService();
break;
case "-uninstall":
StopService();
UninstallService();
break;
default:
throw new NotImplementedException();
}
}
}
Voici le code de prise en charge:
using System.Collections;
using System.Configuration.Install;
using System.ServiceProcess;
private static bool IsInstalled()
{
using (ServiceController controller =
new ServiceController("YourServiceName")) {
try {
ServiceControllerStatus status = controller.Status;
} catch {
return false;
}
return true;
}
}
private static bool IsRunning()
{
using (ServiceController controller =
new ServiceController("YourServiceName")) {
if (!IsInstalled()) return false;
return (controller.Status == ServiceControllerStatus.Running);
}
}
private static AssemblyInstaller GetInstaller()
{
AssemblyInstaller installer = new AssemblyInstaller(
typeof(YourServiceType).Assembly, null);
installer.UseNewContext = true;
return installer;
}
En continuant avec le code de prise en charge...
private static void InstallService()
{
if (IsInstalled()) return;
try {
using (AssemblyInstaller installer = GetInstaller()) {
IDictionary state = new Hashtable();
try {
installer.Install(state);
installer.Commit(state);
} catch {
try {
installer.Rollback(state);
} catch { }
throw;
}
}
} catch {
throw;
}
}
private static void UninstallService()
{
if ( !IsInstalled() ) return;
try {
using ( AssemblyInstaller installer = GetInstaller() ) {
IDictionary state = new Hashtable();
try {
installer.Uninstall( state );
} catch {
throw;
}
}
} catch {
throw;
}
}
private static void StartService()
{
if ( !IsInstalled() ) return;
using (ServiceController controller =
new ServiceController("YourServiceName")) {
try {
if ( controller.Status != ServiceControllerStatus.Running ) {
controller.Start();
controller.WaitForStatus( ServiceControllerStatus.Running,
TimeSpan.FromSeconds( 10 ) );
}
} catch {
throw;
}
}
}
private static void StopService()
{
if ( !IsInstalled() ) return;
using ( ServiceController controller =
new ServiceController("YourServiceName")) {
try {
if ( controller.Status != ServiceControllerStatus.Stopped ) {
controller.Stop();
controller.WaitForStatus( ServiceControllerStatus.Stopped,
TimeSpan.FromSeconds( 10 ) );
}
} catch {
throw;
}
}
}
À ce point, après l'installation de votre service sur la machine cible, il suffit d'exécuter à votre service à partir de la ligne de commande (comme toute application ordinaire) avec l' -install
argument de ligne de commande pour installer et démarrer le service.
Je pense que j'ai couvert tout, mais si vous trouvez cela ne fonctionne pas, s'il vous plaît laissez-moi savoir afin que je puisse mettre à jour la réponse.
Vous pouvez faire tout cela de dans votre exécutable en réponse aux événements déclenchés à partir du processus InstallUtil du service. Substituer l’événement OnAfterInstall pour utiliser une classe ServiceController pour démarrer le service.
http://msdn.Microsoft.com/en-US/Library/System.ServiceProcess.ServiceInstaller.aspx
Visual Studio
Si vous créez un projet d'installation avec VS, vous pouvez créer une action personnalisée qui appelle une .NET méthode pour démarrer le service. Mais, il n'est pas vraiment recommandé d'utiliser géré action personnalisée dans une MSI. Voir cette page.
ServiceController controller = new ServiceController();
controller.MachineName = "";//The machine where the service is installed;
controller.ServiceName = "";//The name of your service installed in Windows Services;
controller.Start();
InstallShield ou Sage
Si vous utilisez InstallShield ou Sages, ces applications offrent la possibilité de démarrer le service. Par exemple avec Sage, vous devez ajouter un service de contrôle de l'action. Dans cette action, vous devez spécifier si vous souhaitez démarrer ou arrêter le service.
Wix
À l'aide de Wix, vous devez ajouter le code xml suivant sous le composant de votre service. Pour plus d'informations à ce sujet, vous pouvez consulter cette page.
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name=""
DisplayName=""
Description=""
Start="auto"
Account="LocalSystem"
ErrorControl="ignore"
Interactive="no">
<ServiceDependency Id="????"/> ///Add any dependancy to your service
</ServiceInstall>
Vous devez ajouter une Action personnalisée à la fin de la séquence de « ExecuteImmediate » dans le fichier MSI, utilisez le nom de l’EXE ou d’un lot (début sc) composant comme source. Je ne pense pas que cela peut être fait avec Visual Studio, vous devrez peut-être utiliser un MSI véritable outil de création pour cela.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.