Nous avons donc produit un service Windows pour fournir des données à notre application client et tout se passe bien. Le client a présenté une demande de configuration amusante qui nécessite deux instances de ce service s'exécutant sur le même serveur et configurées pour pointer vers des bases de données distinctes.
Jusqu'à présent, je n'ai pas été en mesure de faire en sorte que cela se produise et j'espérais que mes collègues membres de stackoverflow pourraient être en mesure de vous expliquer pourquoi.
Configuration actuelle:
J'ai configuré le projet qui contient le service Windows, nous l'appellerons désormais AppService, et le fichier ProjectInstaller.cs qui gère les étapes d'installation personnalisées pour définir le nom du service en fonction d'une clé dans App.config comme suit :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
Dans ce cas, Util est juste une classe statique qui charge le nom du service à partir du fichier de configuration.
À partir de maintenant, j'ai essayé deux façons différentes d'installer les deux services et les deux ont échoué de la même manière.
La première méthode consistait simplement à installer la première copie du service, à copier le répertoire installé et à le renommer, puis à exécuter la commande suivante après avoir modifié la configuration de l'application pour changer le nom du service souhaité:
InstallUtil.exe /i AppService.exe
Lorsque cela n'a pas fonctionné, j'ai essayé de créer un deuxième projet d'installation, modifié le fichier de configuration et construit le deuxième programme d'installation. Lorsque j'ai exécuté le programme d'installation, cela fonctionnait bien mais le service ne s'affichait pas dans services.msc, j'ai donc exécuté la commande précédente sur la deuxième base de code installée.
Les deux fois, j'ai reçu la sortie suivante d'InstallUtil (parties pertinentes uniquement):
Exécution d'une installation traitée.
Début de la phase d'installation de l'installation.
Installation du service App Service Two ... Le service App Service Two a été installé avec succès. Création de l'application EventLog source App Service Two dans l'application de journal ...
Une exception s'est produite lors de la phase d'installation. System.NullReferenceException: La référence d'objet n'est pas définie sur une instance d'un objet.
La phase de restauration de l'installation commence.
Restauration du journal des événements à l'état précédent pour App Service Two source. Service App Service Two est en cours de suppression du système ... Service App Service Two a été supprimé du système avec succès.
La phase de restauration s'est terminée avec succès.
L'installation traitée est terminée. L'installation a échoué et la restauration a été effectuée.
Désolé pour le long post, je voulais m'assurer qu'il y avait suffisamment d'informations pertinentes. L'élément qui m'a jusqu'à présent perplexe est qu'il indique que l'installation du service se termine avec succès et que ce n'est qu'après avoir créé la source EventLog que l'exception NullReferenceException semble être lancée. Donc, si quelqu'un sait ce que je fais de mal ou a une meilleure approche, ce serait très apprécié.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Vous pouvez insérer du code dans le programme d'installation pour obtenir le nom de service souhaité lorsque vous exécutez installutil.