2009-09-18 7 views
1

J'ai besoin de trouver un moyen fiable de mettre à jour un service Windows en cours d'exécution (Service.exe). Le service est exécuté sous le compte LocalSystem alors que l'utilisateur connecté se trouve dans un compte d'utilisateur non administrateur.Mise à jour d'un service en cours avec une autre version? [C#]

Ma solution actuelle serait la suivante: - Les contrôles Service.exe mises à jour (fichiers) regularily - Quand une mise à jour, il a trouvé un autre service démarre (Launcher.exe) qui arrêterait la Service.exe, copie sur les fichiers, redémarrez Service.exe, puis arrêtez-vous

Après avoir fait quelques lectures en ligne et de certains de mes précédents messages sur le forum, je crois que ce serait la solution appropriée - mais avant d'aller de l'avant je voulais vérifier avec tous le gourou et voir si j'oublie quelque chose d'important ou s'il y a un meilleur moyen.

J'ai fait des lectures sur une méthode de mise à jour automatique (chargement & déchargement des assemblages, etc ...) mais cela semblait très incertain et j'ai besoin que ce soit aussi robuste que possible - si ça ne veut pas dire quelqu'un doit intervenir manuellement.

Toute aide ou suggestion serait grandement appréciée. Merci,

+0

une solution? exemple de code? – Kiquenet

Répondre

1

La procédure de téléchargement/d'arrêt/de modification/redémarrage est assez courante et robuste. Je ne voudrais pas essayer d'entrer dans les affaires de le faire sans redémarrer. C'est peut-être possible dans de nombreux cas, mais il sera plus difficile d'obtenir le bon résultat.

N'oubliez pas de vous assurer que vous pouvez mettre à jour l'updater, par la voie ...

0

Vous pouvez écrire un service bootstrapper ainsi.

Fondamentalement, c'est un service léger que vous installez, il regarde un répertoire pour DLL qui correspondent à une certaine interface.

Tout ce qui correspond, il charge et fonctionne comme un service à l'intérieur de lui-même.

Avoir charger deux dll pour démarrer. L'un est votre service, l'autre est votre service de mise à jour.

Comme il n'y a pratiquement pas de code dans le programme d'amorçage, ne doit pas devoir être mis à jour.

Mais votre programme de mise à jour sera capable de se mettre à jour automatiquement, et le service dll périodiquement.

Le fonctionnement de votre programme de mise à jour dépend de vous. Nous avons trouvé qu'avoir un emplacement de publication sur notre réseau, et juste regarder le dossier pour les mises à jour, ajouts et suppressions et synchroniser le dossier dll local était suffisant, mais vous pourriez avoir surveiller un fichier de configuration qui pointe vers dlls partout si c'est ce que est nécessaire (devait le faire pour un système de mise à jour mondial).

Il est un peu difficile de tout configurer et de fonctionner correctement. Mais une fois que c'est le cas, cela fonctionne très bien.

0

C'est une bonne solution, mais quelqu'un (généralement le service principal) a besoin de transporter du code pour mettre à jour le lanceur.

Le lanceur ne peut pas faire lui-même pour ce qui devrait être des raisons évidentes.

Je fais un double lanceur (le lanceur génère le deuxième service qui met à jour les deux) pour simplifier les vérifications de mise à jour.

BTW même dans le monde UNIX, nous appliquons les mêmes étapes de base que nous écrasons le binaire en cours pendant que le service est encore en cours d'exécution. Dans le monde Windows, vous pouvez faire la même chose en renommant tous les fichiers que vous êtes sur le point d'écraser d'abord.

Questions connexes