2009-09-28 6 views
3

J'ai développé un service Windows avec un projet d'installation utilisant Visual Studio 2008. Lorsque j'effectue une mise à niveau, j'obtiens l'avertissement suivant:Comment arrêter un service Windows pour effectuer une installation de mise à niveau?

Les applications suivantes utilisent des fichiers que le programme d'installation doit mettre à jour. Vous pouvez fermer les applications et cliquer sur "Réessayer" ou cliquer sur "Continuer" pour que le programme d'installation poursuive l'installation et remplace ces fichiers lorsque votre système redémarre. Je voudrais arrêter le service Windows pendant l'installation de la mise à niveau.

J'ai essayé de créer une action personnalisée et de surcharger le methoc OnBeforeInstall, cependant cela est appelé trop tard après que le message contextuel d'avertissement s'est déjà produit.

Y a-t-il un moyen d'accomplir cela dans le cadre du programme d'installation de msi? Je préférerais ne pas avoir à faire cela comme une tâche distincte avant d'exécuter l'installateur msi.

Mise à jour:
Sur la base d'autres recherches que j'ai trouvé que la base de données MSI ne supporte cela, mais le programme d'installation intégré Visual Studio projets (configuration) ne fournissent pas un moyen de le faire. Il faut soit modifier la base de données MSI, soit aller avec WiX ou un installateur commercial.

+0

Pouvez-vous exécuter une commande shell de l'installateur? Si c'est le cas, vous pouvez exécuter net stop _service name_ comme l'une de vos premières tâches pour le tuer. –

+0

Ug, ne fais pas ça. Windows Installer prend en charge nativement les services d'arrêt/démarrage. Utilisez simplement la table ServiceControl. –

Répondre

2

Son déjà été construit pour MSI/Windows Installer ... le seul problème est que les classes d'installation de .NET ne pas utiliser la "Installation du service" MSI fonctionnalités. Ce qui se passe réellement, c'est que le MSI essaie d'installer des fichiers et d'exécuter une commande personnalisée en utilisant les fichiers qui viennent d'être copiés (c'est tout ce que Visual Studio met dans le MSI).

Pour le résoudre, vous pouvez modifier le MSI avec ORCA et ajoutez la ligne suivante à la ServiceControl table:

1 ServiceName 170  1 C__489628C5CC1144CB47F43E8BE7F3F31D 

L'ID Component vous pouvez rechercher à partir de la table FILES ... Je viens choisi le ID de composant du fichier EXE principal. Le 170 est un bitmap qui indique à Windows Installer d'arrêter et de supprimer le service lors de l'installation et de la désinstallation.

Cela permettra aux installateurs .NET d'ajouter du service et vous pourrez utiliser le ServiceController pour démarrer le service après son installation via une commande personnalisée.

3

Si vous voulez aller dans le sens de la modification du tableau MSI ServiceControl, ce script VBS suivant a fonctionné pour moi:

Dim installer, database, view, result 
Set installer = CreateObject("WindowsInstaller.Installer") 
Set database = installer.OpenDatabase ("Installer.msi", 1) 
Set view = database.OpenView("INSERT INTO ServiceControl (ServiceControl,Name,Event,Arguments,Wait,Component_) VALUES ('ServiceName','ServiceName',170,null,null,'C__751A71A3822A287367770DB29839A759')") 
view.Execute 
database.Commit 
Set database = nothing 
Questions connexes