web-dev-qa-db-fra.com

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 d'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.

Résultat de l'étape 4

Exécuter une installation transactionnelle.

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

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

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

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

Les paramètres concernés sont:

logtoconsole =

fichier journal = C:\Utilisateurs\mon nom d'utilisateur\Documents\Visual Studio 2010\Projets\TestService\TesterService\obj\x86\Debug\TestService.InstallLog

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

Aucun programme d'installation public doté de l'attribut RunInstallerAttribute.Yes n'a pu être trouvé dans l'assembly C:\Utilisateurs\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe\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'assemblage C:\Utilisateurs\myusername\Documents\Visual Studio 2010\Projects\TestService\TestService\obj\x86\Debug\TestService.exe.

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

Assemblée validée 'C:\Utilisateurs\nomutilisateur\Documents\Visual Studio 2010\Projets\TestService\TestService\obj\x86\Debug\TestService.exe'.

Les paramètres concernés sont:

logtoconsole =

logfile = C:\Utilisateurs\myusername\Documents\Visual Studio 2010\Projects\TestService\TesterService\obj\x86\Debug\TestService.InstallLog

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

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

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

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

L'installation effectuée est terminée.

Résultat de l'étape 5

Le nom du service n'est pas valide.

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

132
jkh

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

Il ne sera pas installé immédiatement. Vous devez d'abord créer la classe de l'installateur.

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

Comment: ajouter des installateurs à 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.cs sera automatiquement créé. Ensuite, vous pouvez double-cliquer dessus, entrer dans le concepteur et configurer les composants:

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

  • serviceProcessInstaller1 possède cette propriété importante: Account c'est-à-dire le compte dans lequel le service sera exécuté.

Par exemple:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
232
Miguel Angelo

Regarder:

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

Il semble que vous n’ayez peut-être pas de classe d’installateur dans votre code. Il s'agit d'une classe qui hérite de Installer qui indiquera à installutil comment installer votre exécutable en tant que service.

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

11
James Michael Hare

Voici un autre moyen de créer le programme d’installation et de supprimer ce message d’erreur. En outre, il semble que VS2015 express ne dispose pas de l'élément de menu "Ajouter un programme d'installation".

Vous devez simplement créer une classe, ajouter le code ci-dessous et 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);
        }
    }
}
8
Carol

Deux problèmes typiques:

  1. Absence de la classe ProjectInstaller (comme l'a souligné @MiguelAngelo)
  2. Le invite de commande doit "Exécuter en tant que administrateur"
5
fabriciorissetto

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

Assurez-vous que la classe ProjectInstaller 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 qu'au cours du processus automatique de création de la fonction de gestionnaire dans ProjectInstaller.cs, la définition de la classe a été modifiée.

public class ProjectInstaller : System.Configuration.Install.Installer

à

partial class ProjectInstaller : System.Configuration.Install.Installer

remplace le public mot-clé avec partial. Donc, pour le réparer, il doit être

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

J'utilise Visual Studio 2013 Community Edition.

3
John Archer

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

Aucun programme d'installation public doté de l'attribut RunInstallerAttribute.Yes n'a pu être trouvé

Un changement d'alias ou un nettoyage du compilateur dans .NET peut révéler ce petit Tweak 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 la couverture lors de la compilation ou de l'exécution et vous obtiendrez ce comportement d'erreur. La modification explicite ci-dessus en 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 service ou du projet, recherchez "l'ancien" RunInstaller (true) et remplacez-le par le nouveau RunInstallerAttribute (true).

2
Sql Surfer

Une autre difficulté que j’ai rencontrée: ma classe dérivée du programme d’installation (généralement ProjectInstaller) se trouve en haut de la hiérarchie des espaces de noms, j’ai essayé d’utiliser une classe publique dans une autre classe publique, mais le même problème persiste:

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

1
Phlash