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:
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.
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;
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
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);
}
}
}
Deux problèmes typiques:
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.
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).
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é