142 votes

Installer le service Windows créé dans Visual Studio

Lorsque je crée un nouveau service Windows dans Visual Studio 2010, je reçois le message indiquant qu'il faut utiliser InstallUtil et net start pour exécuter le service.

J'ai essayé les étapes suivantes :

  1. Créer un nouveau projet Fichier -> Nouveau -> Projet -> Service Windows
  2. Nom du projet : TestService
  3. Construire le projet tel quel (constructeur Service1, OnStart, OnStop)
  4. Ouvrez l'invite de commande, exécutez " C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe " TestService.exe
  5. Exécuter net start TestService .

Sortie de l'étape 4

Exécution d'une installation transactionnelle.

Début de la phase d'installation de l'installation.

Voir le contenu du fichier journal pour le C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\TestService\obj\x86\Debug\TestService.exe la progression de l'assemblée.

Le fichier est situé à l'adresse suivante C:\Users\myusername\Documents\Visual Studio 2010 \Projects\Tes tService \TestService\obj\x86\Debug\TestService.InstallLog.

Installation de l'ensemble ' C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestS ervice \TestService\obj\x86\Debug\TestService.exe '.

Les paramètres affectés sont :

logtoconsole =

logfile = C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\T estService \obj\x86\Debug\TestService.InstallLog

chemin d'assemblage = C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestServ glace \TestService\obj\x86\Debug\TestService.exe

Aucun installateur public avec l'attribut RunInstallerAttribute.Yes n'a pu être trouvé dans la base de données C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\TestSe rvice \obj\x86\Debug\TestService.exe montage.

La phase d'installation s'est terminée avec succès, et la phase d'engagement est commence.

Voir le contenu du fichier journal pour le C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\TestService\obj\x86\Debug\TestService.exe la progression de l'assemblée.

Le fichier est situé à l'adresse suivante C:\Users\myusername\Documents\Visual Studio 2010 \Projects\Tes tService \TestService\obj\x86\Debug\TestService.InstallLog.

Commettre l'assemblage ' C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestS ervice \TestService\obj\x86\Debug\TestService.exe '.

Les paramètres affectés sont :

logtoconsole =

logfile = C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\T estService \obj\x86\Debug\TestService.InstallLog

chemin d'assemblage = C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestServ glace \TestService\obj\x86\Debug\TestService.exe

Aucun installateur public avec l'attribut RunInstallerAttribute.Yes n'a pu être trouvé dans la base de données C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\TestSe rvice \obj\x86\Debug\TestService.exe montage.

Supprimez le fichier InstallState car il n'y a pas d'installateurs.

La phase d'engagement s'est terminée avec succès.

La transaction d'installation est terminée.

Sortie de l'étape 5

Le nom du service n'est pas valide.

Une aide supplémentaire est disponible en tapant NET HELPMSG 2185.

250voto

Miguel Angelo Points 12471

Vous devez ouvrir le fichier Service.cs dans le concepteur, faire un clic droit dessus et choisir l'option de menu "Ajouter un installateur".

Il ne s'installe pas directement... vous devez d'abord créer la classe d'installation.

Quelques références sur les installateurs de services :

Comment : Ajouter des installateurs à votre application de service

Assez vieux... mais c'est ce dont je parle :

Services Windows en C# : Ajout de l'installateur (partie 3)

En faisant cela, un ProjectInstaller.cs sera automatiquement créé. Vous pouvez ensuite double-cliquer dessus, entrer dans le designer et configurer les composants :

  • serviceInstaller1 a les propriétés du service lui-même : Description , DisplayName , ServiceName y StartType sont les plus importantes.

  • serviceProcessInstaller1 a cette propriété importante : Account qui est le compte dans lequel le service sera exécuté.

Par exemple :

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3 votes

En ajoutant le programme d'installation et en définissant le compte comme LocalSystem, cela a fonctionné. Merci !

1 votes

J'obtiens la même erreur dans VS2013. J'ai vérifié les liens que vous avez fournis, j'ai vérifié que j'ai ProjectInstaller, y compris les composants service[Process]Installer1, correctement configurés. J'exécute installutil.exe en tant qu'administrateur. Il signale toujours "Aucun installateur public avec l'attribut RunInstallerAttribute.Yes n'a pu être trouvé". Avez-vous des idées ?

5 votes

Lol. J'adore que le lien "Assez vieux" renvoie à un site appelé Arcane Code. Plus cette page vieillit, plus le nom devient vrai :-)

12voto

James Michael Hare Points 19077

Je regarde :

Aucun programme d'installation public avec l'attribut RunInstallerAttribute.Yes n'a pu être trouvé dans le fichier C:\Users\myusername\Documents\Visual Studio 2010 \Projects\TestService\TestSe rvice \obj\x86\Debug\TestService.exe montage.

Il semble que vous n'ayez pas de classe d'installation dans votre code. Il s'agit d'une classe qui hérite de Installer qui dira installutil comment installer votre exécutable comme un service.

P.s. J'ai mon propre petit modèle de service Windows auto-installable/débuggable ici dont vous pouvez copier le code ou l'utiliser : Service Windows débuggable et auto-installable

0 votes

Lorsque je clique avec le bouton droit de la souris sur le projet TestService dans Visual Studio -> Propriétés -> Services, la page est désactivée... Faites-vous référence à un autre emplacement ? Sous Application, le nom de l'assemblage est TestService.

0 votes

@John : Ignorez la première partie concernant la console de services, regardez la deuxième partie commençant par En fait, . Il semble que le service ne s'est jamais installé car il n'a pas trouvé d'installateur.

8voto

Carol Points 1636

Voici une autre façon de faire l'installation et de se débarrasser de ce message d'erreur. Il semble également que VS2015 express ne dispose pas de l'élément de menu "Add Installer".

Il vous suffit de créer une classe et d'ajouter le code ci-dessous et d'ajouter la référence System.Configuration.Install.dll.

using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;

namespace SAS
{
    [RunInstaller(true)]
    public class MyProjectInstaller : Installer
    {
        private ServiceInstaller serviceInstaller1;
        private ServiceProcessInstaller processInstaller;

        public MyProjectInstaller()
        {
            // Instantiate installer for process and service.
            processInstaller = new ServiceProcessInstaller();
            serviceInstaller1 = new ServiceInstaller();

            // The service runs under the system account.
            processInstaller.Account = ServiceAccount.LocalSystem;

            // The service is started manually.
            serviceInstaller1.StartType = ServiceStartMode.Manual;

            // ServiceName must equal those on ServiceBase derived classes.
            serviceInstaller1.ServiceName = "SAS Service";

            // Add installer to collection. Order is not important if more than one service.
            Installers.Add(serviceInstaller1);
            Installers.Add(processInstaller);
        }
    }
}

0 votes

J'utilise également VS2015 et cette solution m'a permis d'éviter le message d'erreur "No public installers with the RunInstallerAttribute.Yes" que j'obtenais précédemment. Merci !

7voto

fabriciorissetto Points 100

Deux problèmes typiques :

  1. Manque la classe ProjectInstaller (comme @MiguelAngelo l'a signalé)
  2. El invite de commande doit "Exécuter en tant que Administrateur "

4voto

John Archer Points 63

Un autre problème possible (que j'ai rencontré) :

Assurez-vous que le ProjectInstaller La classe est public . Pour être honnête, je ne suis pas sûr de la façon dont j'ai procédé, mais j'ai ajouté des gestionnaires d'événements à l'adresse suivante ProjectInstaller.Designer.cs comme :

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Je suppose que pendant le processus automatique de création de la fonction de gestionnaire dans ProjectInstaller.cs il a changé la définition de la classe de

public class ProjectInstaller : System.Configuration.Install.Installer

a

partial class ProjectInstaller : System.Configuration.Install.Installer

remplacement de le site public mot-clé avec partial . Donc, afin de le réparer, il doit être

public partial class ProjectInstaller : System.Configuration.Install.Installer

J'utilise Visual Studio 2013 Community edition.

0 votes

Je sais que c'est 3 ans plus tard, mais cela a résolu mon problème. Je ne sais pas trop pourquoi ou quand le concepteur a changé la classe partielle publique précédente en classe partielle interne. Je vous remercie !

Prograide.com

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.

Powered by:

X