Nous avons donc créé 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 fonctionnant sur le même serveur et configurées pour pointer vers des bases de données distinctes.
Jusqu'à présent, je n'ai pas réussi à faire en sorte que cela se produise et j'espérais que mes collègues de stackoverflow pourraient me donner quelques indications sur la raison de ce phénomène.
Configuration actuelle :
J'ai configuré le projet qui contient le service Windows, que nous appellerons AppService à partir de maintenant, 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.
A partir de là, j'ai essayé deux manières différentes d'installer les deux services et les deux ont échoué de manière identique.
La première méthode consistait à installer simplement la première copie du service, à copier le répertoire installé et à le renommer, puis à exécuter la commande suivante après avoir modifié l'app config pour changer le nom du service souhaité :
InstallUtil.exe /i AppService.exe
Comme cela ne fonctionnait pas, j'ai essayé de créer un deuxième projet d'installation, j'ai modifié le fichier de configuration et j'ai construit le deuxième installateur. Lorsque j'ai exécuté le programme d'installation, tout a bien fonctionné mais le service n'apparaissait 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 le résultat suivant de InstallUtil (parties pertinentes seulement) :
Exécution d'une installation transactionnelle.
Début de la phase d'installation de l'installation.
Installation de Service App Service Two... Le service App Service Two a été installé avec succès. Création de la source EventLog App Service Two dans le journal Application...
Une exception s'est produite pendant la phase d'installation. System.NullReferenceException : La référence de l'objet n'est pas définie comme une instance d'un objet.
La phase de Rollback de l'installation commence.
Restauration du journal des événements à l'état précédent pour la source App Service Two. Service App Service Two est en cours de suppression du système... Service App Service Two a été supprimé avec succès du système.
La phase de Rollback s'est terminée avec succès.
L'installation transactionnelle est terminée. L'installation a échoué et le retour en arrière a été effectué.
Désolé pour ce long post, je voulais m'assurer qu'il y avait suffisamment d'informations pertinentes. L'élément qui me laisse perplexe jusqu'à présent est le fait que l'installation du service se termine avec succès et que ce n'est qu'après avoir créé la source du journal d'événements que l'exception NullReferenceException semble être levée. Si quelqu'un sait ce que je fais de travers ou a une meilleure approche, il serait très apprécié.