Installer le service Windows créé dans Visual Studio

136

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

J'ai essayé les étapes suivantes:

  1. Créer un nouveau fichier de projet -> 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écutez TestService net start .

Sortie de l'étape 4

Exécution d'une installation traitée.

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

Consultez le contenu du fichier journal pour connaître la progression de l'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Le fichier se trouve dans C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

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

Les paramètres concernés sont:

logtoconsole =

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

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

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

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

Consultez le contenu du fichier journal pour connaître la progression de l'assembly C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Le fichier se trouve dans C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

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

Les paramètres concernés sont:

logtoconsole =

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

assemblypath = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

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

Supprimez le fichier InstallState car il n'y a aucun programme d'installation.

La phase de validation s'est terminée avec succès.

L'installation traitée 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.

jkh
la source

Réponses:

243

Vous devez ouvrir le fichier Service.cs dans le concepteur, cliquez dessus avec le bouton droit de la souris et choisissez l'option de menu "Ajouter un programme d'installation".

Il ne s'installe pas dès la sortie de la boîte ... vous devez d'abord créer la classe d'installation.

Quelques références sur l'installateur de service:

Comment: ajouter des programmes d'installation à votre application de service

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

Services Windows en C #: ajout du programme d'installation (partie 3)

En faisant cela, un ProjectInstaller.cssera automatiquement créé. Ensuite, vous pouvez double-cliquer dessus, entrer dans le concepteur et configurer les composants:

  • serviceInstaller1a les propriétés du service lui - même: Description, DisplayName, ServiceNameet StartTypesont les plus importants.

  • serviceProcessInstaller1a cette propriété importante: Accountc'est le compte dans lequel le service sera exécuté.

Par exemple:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
Miguel Angelo
la source
3
L'ajout du programme d'installation et la configuration du compte sur LocalSystem l'ont fait. Merci!
Luc
1
J'obtiens la même erreur dans VS2013. J'ai vérifié les liens que vous avez fournis, vérifié que j'ai ProjectInstaller, y compris le service de composants [Process] Installer1, correctement configuré. 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é". Des idées?
Barry Dysert le
4
Lol. J'adore le fait que le lien "Assez vieux" soit vers un site appelé Arcane Code. Plus cette page vieillit, plus le nom devient vrai :-)
HotN
Qu'est-ce que «le designer»? Les applications qui n'ont pas d'interface utilisateur n'impliquent généralement rien qui s'appellerait un concepteur.
Maxx
Les services ont également un concepteur, tout comme les formulaires
Grungondola
11

Regarder:

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

Il semble que vous n'ayez pas de classe d'installation dans votre code. C'est une classe qui en hérite vous Installerdira installutilcomment installer votre exécutable en tant que service.

Ps J'ai mon propre petit modèle de service Windows auto-installable / déboguable ici que vous pouvez copier du code ou utiliser: Service Windows déboguable et auto-installable

James Michael Hare
la source
Lorsque je clique avec le bouton droit sur le projet TestService dans Visual Studio -> Propriétés -> Services, la page est désactivée ... faisiez-vous référence à un emplacement différent? Sous Application, le nom de l'assembly est TestService.
jkh
@John: Ignorez la première partie sur la console des services, regardez la deuxième partie en commençant par En fait . Il semble que le service n'ait jamais été installé car il n'a pas trouvé de programme d'installation.
James Michael Hare
8

Voici une autre façon de créer le programme d'installation et de supprimer ce message d'erreur. Il semble également que VS2015 express ne dispose pas de l'élément de menu "Ajouter un programme d'installation".

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);
        }
    }
}
Carol
la source
L'exécution de VS2015 également et cette solution m'a permis de dépasser le message d'erreur «Aucun installateur public avec le RunInstallerAttribute.Yes» que je recevais précédemment. Je vous remercie!
PHBeagle
6

Deux problèmes typiques:

  1. Manque la classe ProjectInstaller (comme @MiguelAngelo l'a souligné)
  2. L' invite de commande doit «Exécuter en tant qu'administrateur »
fabriciorissetto
la source
4

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

Assurez-vous que la ProjectInstallerclasse est public. Pour être honnête, je ne sais pas exactement comment je l'ai fait, mais j'ai ajouté des gestionnaires d'événements 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, ProjectInstaller.csil a changé la définition de classe de

public class ProjectInstaller : System.Configuration.Install.Installer

à

partial class ProjectInstaller : System.Configuration.Install.Installer

en remplaçant le publicmot - clé par partial. Donc, pour le réparer, il doit être

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

J'utilise l'édition communautaire de Visual Studio 2013.

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

Changement furtif dans VS 2010 et .NET 4.0 et versions ultérieures

Aucun programme d'installation public avec l'attribut RunInstallerAttribute.Yes n'a été trouvé

Il y a un changement d'alias ou un nettoyage du compilateur dans .NET qui peut révéler ce petit ajustement pour votre cas spécifique.

Si vous avez le code suivant…

RunInstaller(true)   // old alias  

Vous devrez peut-être le mettre à jour pour

RunInstallerAttribute(true)  // new property spelling

C'est comme un alias changé sous les couvertures au moment de la compilation ou à l'exécution et vous obtiendrez ce comportement d'erreur. La modification explicite ci-dessus de RunInstallerAttribute (true) l'a corrigé dans tous nos scénarios d'installation sur toutes les machines.

Après avoir ajouté le programme d'installation du projet ou du service, recherchez l '«ancien» RunInstaller (true) et remplacez-le par le nouveau RunInstallerAttribute (true)

Surfer Sql
la source
Selon ma connaissance, vous pouvez omettre le suffixe "Attribute", c'est-à-dire que [RunInstaller (true)] et [RunInstallerAttribute (true)] est le même. Essayez-le avec un attribut différent, par exemple [DebuggerStepThrough ()] et [DebuggerStepThroughAttribute ()] - les deux fonctionneront lorsqu'ils sont appliqués à une classe.
Matt
1

Encore un autre problème que j'ai rencontré: assurez-vous que votre classe dérivée du programme d'installation (généralement ProjectInstaller) est en haut de la hiérarchie des espaces de noms, j'ai essayé d'utiliser une classe publique dans une autre classe publique, mais cela entraîne la même vieille erreur:

Aucun programme d'installation public avec l'attribut RunInstallerAttribute.Yes n'a été trouvé


la source