Nous avons un exe "updater" minimal qui vérifie une URL distante pour les mises à jour, les télécharge et remplace les fichiers sur disque avant de lancer la demande réelle. Cependant, si nous voulons remplacer l'EXE de la mise à jour, nous avons deux options: P>
Assemblages de copie d'ombre pour que .NET créera. une copie d'ombre de l'EXE (et des assemblages référencés) et chargez ces assemblages, de sorte que les assemblages non ombres puissent être remplacés et seront utilisés lorsque l'application est lancée à côté. P> LI>
Identifiez les fichiers remplacés et renommés / déplacez-les sur le disque. Windows semble autoriser le renommage / le déménagement de fichiers verrouillés afin que nous puissions déplacer les fichiers et copier dans les nouveaux assemblys. Encore une fois, lors du lancement suivant de la demande, nous lancerons les nouveaux assemblages. Cette approche est mentionnée ici < / a> p> li>
ol>
est cette deuxième méthode une méthode recommandée? Y a-t-il des pièges à cette approche? P>
6 Réponses :
Une autre option: lorsque la principale application veut se mettre à jour, elle espionne un nouveau processus de mise à jour, puis se ferme. Le processus de génie entre-temps attend que l'application principale de fermer (le processus de disparition) puis met à jour tous les fichiers nécessaires (y compris le .exe). Après cela, il redémarre simplement l'application principale et quitte le processus de mise à jour. P>
@jpierson et ça marche :). J'utilise cette approche depuis 2 ans pour ma propre demande.
im en utilisant la deuxième méthode sans aucun problème. Assurez-vous simplement que l'assemblage téléchargé a été correctement téléchargé. ;) p>
exécuter update.exe et laissez ceci: p>
Je fais cela sans problèmes de tout ce qui est testé et courez dans un environnement direct dans environ 400 clients au fur et à mesure que nous parlons. p>
Comment puis-je redémarrer le programme en cours d'exécution? Y a-t-il un moyen facile?
@chilitom: processus.start (Application.StartuTutuPPath & "\ myProgram.exe"): finir
Quoi de ClickOnce Déploiement? P>
Ceci est probablement la meilleure option car il devrait aider à normaliser la mise à niveau de niveau de sécurité / rétrogradation requise dans Windows Vista et les futures versions de Windows.
Nous n'utilisons pas ClickOnce pour l'instant, car il était plus facile d'utiliser la méthode de copie de fichier que j'ai décrite et nous avons également un processus de mise à jour supervisé pour une base de données SQL qui est installée à côté de l'application. Cependant, ClickOnce est la solution de Microsoft officielle et nous examinerons davantage avec un œil pour une utilisation future, donc je choisis cela comme la réponse acceptée. Merci.
ClickOnce est un cauchemar car il est inflexible, trop complexe, ne semble pas avoir de soutien Microsoft fort et est très spécifique aux scénarios de déploiement utilisateur.
La façon dont nous le faisons avec notre application interne: p>
Le raccourci d'application pointe sur la mise à jour. P>
EDIT: OOPS - Étape 5 manquée 5. P>
Vous avez lu la question juste? Comment mettez-vous à jour la mise à jour elle-même de votre scénario?
Dans un projet, j'ai travaillé, là où 2 exécutables. Appelons-les a et b. P>
La seule raison d'exister était de commencer B. Donc, lorsque B (la «vraie» application) a téléchargé une mise à jour, elle a été capable de remplacer un si nécessaire. P>
Si l'application a été redémarré (via a), un coché si b téléchargé certains fichiers et les remplacés avant son démarrage b. P>
Récemment, j'ai trébuché sur le fait qu'un exécutable en cours ne peut pas être écrasé, mais elle peut être renommée. J'ai essayé cela dans une application de test et j'utiliserai cette technique pour développer ma propre composante de mise à jour automatique de l'application.
Regardez dans la copie d'ombre ( MSDN.MicRosoft.com/en-us/Library /ms404279.aspx ). Nous l'utilisons pour permettre aux clients d'un serveur Terminal Server de mettre à jour le logiciel client pendant que d'autres utilisateurs exécutaient l'application sur la même machine en même temps.
Je suis surtout d'accord avec Réponse de Stefan Sauf pour cela que cela ne fonctionne pas si vous souhaitez vraiment traiter avec UAC sur Windows Vista ou Windows 7 et votre application sont correctement installées dans le dossier de fichiers de programme ou nécessitent l'installation d'autres dépendances qui nécessitent des autorisations élevées. p>
Dans ce cas, vous effectuez une installation / patch MSI basée sur MSI ou l'installation d'un service Windows qui fonctionne avec la sécurité nécessaire pour écraser les fichiers dans le dossier des fichiers de programme. p>
L'autre option Si votre application est interactive est de faire comme Igor BREJC suggère et d'augmenter un nouveau processus qui fait la mise à jour qui donne à votre application une chance de demander à élever les autorisations pendant la mise à jour. Utilisation de l'option de service patch ou Windows comme mentionné ci-dessus, ce qui donnerait une meilleure expérience utilisateur quel que soit le scénario (interactif / non interactif). P>