2010-12-01 18 views
1

J'ai un service Windows .NET 3.5 disponible en plusieurs configurations/saveurs différentes. Release, Test, Debug etc. J'ai créé un paquet d'installation pour le service qui est construit dans le cadre d'un script msbuild, mais je dois être capable de construire les programmes d'installation d'une manière qui permette à chaque saveur du service d'être installé sur la même machine. Est-ce que quelqu'un sait la meilleure façon de le faire?Installation de plusieurs versions d'un service Windows sur le même PC

Merci

Répondre

2

Peut-être this article sera utile?

Le problème

Lors de l'examen de la classe ServiceInstaller utilisant réflecteur, vous le verrez fait un appel Win32 à CreateService dans la méthode ServiceInstaller.Install. CreateService renverra le code ERROR_DUPLICATE_SERVICE_NAME retour chaque fois que la méthode est appelée avec un paramètre serviceName ou displayName qui correspond à celle d'un service déjà installé. C'est ce qui provoque Win32Exception être levé dans la fenêtre ci-dessus et provoque finalement l'échec de la deuxième installation . Vous pouvez afficher la documentation complète sur la fonction CreateService here.

Pour contourner ce problème, tout ce qui doit faire est de définir dynamiquement le nom du service lors de l'installation et démarrage du service à une valeur connue et pour vous assurer que la valeur est différente pour chaque instance du service vous installer.

La solution

Tout ce qui doit être fait est de faire vous que le nom de chaque service instance d'installation est unique. Puis vous devez avoir des copies des répertoires d'installation pour chaque instance de service que vous souhaitez avoir. Enfin, vous devez pouvoir définir le nom du service dynamiquement lors de l'installation et du démarrage de . Ce sera facilité en utilisant le fichier app.config.

L'article continue en fournissant des instructions pas à pas sur la façon d'installer plusieurs instances d'un service Windows .NET sur la même machine.

Bien sûr, je ne peux pas m'empêcher de me demander pourquoi exactement vous auriez besoin d'exécuter une version Debug et Release en même temps sur la même machine.

+0

Merci, cela aide. Pour ce qui est des raisons pour lesquelles j'ai besoin de ça ... pas vraiment mon idée, franchement, je ne pense pas que ce soit nécessaire. Selon notre senior dev, nous devrions le faire dans le cadre de notre construction, même si je ne suis pas tout à fait sûr pourquoi! – TabbyCool

+0

@TabbyCool: C'est une exigence vraiment bizarre. Tester la version d'une version est une bonne idée (juste pour s'assurer que les optimisations du compilateur n'introduisent pas de bogues), mais je ne vois pas pourquoi elles devraient fonctionner simultanément. Étant donné qu'aucun utilisateur final ne fonctionnera dans cette configuration, je m'attendrais à ce que cela rende le débogage beaucoup plus difficile. Si vous devez être en mesure de déboguer une version, il est préférable de générer des symboles PDB pour la version plutôt que d'essayer de les exécuter tous les deux. Quoi qu'il en soit, heureux d'aider. –

+0

Je pense que c'est au cas où nous aurions besoin d'exécuter l'environnement UAT sur le même serveur que le système live - nous avons dû déplacer notre base de données en live sur le même serveur qu'UAT récemment en raison de problèmes de serveur. Pas idéal, mais le budget a été réduit et nous n'avons pas vraiment beaucoup de serveurs en réserve! – TabbyCool

2

Je voulais juste attirer l'attention sur les commentaires dans l'article Cody références gris. Il semble que l'auteur et un commentateur ont convenu qu'il y avait une méthode plus simple utilisant sc.exe comme suit

sc \\myserver create NewService binpath= c:\nt\system32\NewServ.exe 
+0

sc create NewService binpath = "pathtoservice.exe" a fonctionné pour nous. Je vous remercie. –