12
votes

Comment mettre à jour un assemblage pour un processus C # en cours d'exécution (alias Hot Dploy)?

J'ai une assemblée .exe et un ensemble d'assemblages référencés que je souhaiterais pouvoir déployer un code mis à jour. Je n'ai pas besoin de changer le code de course, mais la prochaine fois que je lance l'exécutable, je voudrais qu'il prenne le code mis à jour. Actuellement, lorsque j'essaie de copier sur le fichier en cours d'exécution, je reçois une erreur sur le fichier .exe utilisé par un autre processus.

résumer; Comment puis-je mettre à jour le code pendant que le fichier .exe est utilisé?


1 commentaires

Il semble y avoir un projet sur CodePlex visant à déployer à chaud pour .NET. Je ne l'ai pas essayé cependant: hotdeploy.codeplex.com


9 Réponses :


3
votes

Je ne pense pas que cela soit possible. Par exemple, lors du déploiement des applications ASP.NET avec des temps d'arrêt de zéro, la meilleure pratique consiste à avoir un équilibreur de charge afin que vous puissiez enlever une instance, mettez-le à la mettre à jour, puis supprimez l'autre à la mise à jour.


0 commentaires

2
votes

Vous ne pouvez pas mettre à jour l'assemblage lorsqu'il est utilisé. La meilleure option pour ce type de situation est de créer une petite exécutable qui effectue une copie d'ombre de vos assemblées et les lance à partir d'un nouvel emplacement.

De cette façon, lorsque l'utilisateur lance le programme, vous pouvez copier Shadow (localement) à partir du site de déploiement, qui peut toujours être écrasé.


0 commentaires

2
votes

ClickOnce vous donne quelques options. Il y a un Stratégie de mise à jour de "mise à jour après Démarrage d'applications. "

Pour des scénarios plus complexes, il y a le System.Deploiement Espace de noms . Par exemple, vous pouvez sonder périodiquement pour les mises à jour de votre application.


0 commentaires

1
votes

Juste une idée: essayez mef et ["Importer [" http: // someremoteresource "]]


0 commentaires

1
votes

Qu'en est-il des éléments suivants:

  1. Déployez l'EXE vers un dossier de mise à jour.
  2. Chaque fois que l'application démarre, il serait Cochez le dossier de mise à jour.
  3. Si ce n'est pas vide, exécutez une copie Programme
  4. Le programme de copie remplacerait alors l'exe existant avec celui de la Mettre à jour le dossier
  5. Supprimer n'importe quoi dans le dossier de mise à jour
  6. Puis relancez l'EXE

0 commentaires

1
votes

La meilleure idée serait l'une des autres réponses déjà suggérées ... comme en utilisant recomposition avec Mef et ou ClickOnce. Cependant, ces solutions ne vous aideront pas à "ce déploiement". Ils ont besoin que vous apportez des modifications à l'EXE et de créer une courrière de démarrage exécutable, ce qui vous aidera uniquement au prochain déploiement.

pour ce déploiement vous pouvez essayer de le faire (je n'ai jamais fait cela avant, mais théoriquement, cela pourrait fonctionner):

  1. Copiez votre nouvelle DLL à un sous-dossier quelque part
  2. Ajouter une commande de ligne de commande XCOPY à la Runonce Registry Key pour copier la nouvelle DLL du sous-dossier au dossier Final Exe où vous le souhaitez.
  3. Redémarrez.

    La touche RUNONCE contient des commandes de ligne de commande exécutées une fois sur redémarrage, puis supprimées du registre afin de ne plus courir. Voici comment InstallShield vous permet d'écraser certaines DLL pendant leur utilisation par d'autres applications.


0 commentaires

21
votes

Il est facile de faire. Vous pouvez renommer le fichier, Windows a une serrure sur la poignée et non la saisie de répertoire du fichier. Maintenant, vous pouvez simplement copier la mise à jour sans problèmes. Tout ce qui reste à faire est de se débarrasser du fichier renommé après la démarrage de votre application. Si nécessaire.


7 commentaires

En plus de votre réponse, vous voudrez peut-être noter que l'utilisateur peut avoir besoin de détacher d'abord à partir du processus de débogage avant de renommer le fichier, sinon l'IDE (I.e Visual Studio) ne permettra pas de modifier la source.


C'est une mauvaise solution parce que vous deviendrez des raccourcis endommagés après le renommage. Vous devriez utiliser une application assistante à la place.


Hmm, non. Veuillez évoquer la réponse "Je ne pense pas que cela soit possible", tout le monde comprend celui-là.


J'ai suscité ici Stackoverflow.com/a/18079191/2954142 J'ai passé plusieurs heures à déboguer le problème causé par la mise à jour en renommant. Le raccourci Windows 10 épinglé continue de se référer à l'ancienne application renommée alors que la nouvelle version de l'application existait déjà.


Vous avez complètement manqué le point, il n'est pas renommé. Le but ici est d'obtenir un fichier avec le même nom dans le même répertoire, alors les raccourcis ne casse pas, même s'il est utilisé. Vous le faites en renommant l'ancien pour que vous puissiez obtenir une copie la nouvelle, avec le même nom .


Je vois. Mais le problème est que Windows peut mettre à jour automatiquement les raccourcis après avoir renommé leur cible. Les raccourcis sont endommagés une fois que vous «se débarrasser du fichier renommé» ou de leur cible liée à l'ancienne version si vous conservez un fichier renommé. J'ai vu cela dans la production et je ne pouvais pas enquêter plus profondément comment cela pourrait arriver.


L'événement de raccourci automatique à jour automatique se produit lors de l'ouverture du fichier * .lnk. Si le nom de fichier d'origine n'existe plus, Windows essaiera de déterminer ce qui lui est arrivé et mettra à jour le * .LNK pour créer un lien vers le nouvel emplacement. Cependant, si vous faites la renommée assez rapidement, le nouveau * .exe sera en place avant que quiconque essaie d'ouvrir le * .lnk et il n'y aura pas de problème. Il suffit de ne faire aucun traitement entre le renommage de l'ancien fichier hors de la route et le renommage du nouveau fichier en place.



2
votes

Cette classe renommera l'exécutable exécutable actuellement en cours d'exécution, si elle complète sans exception, vous pouvez simplement écrire le nouvel exécutable, puis relancer, par exemple: xxx

assez facile? < Pré> xxx


0 commentaires

0
votes

Il est possible que vous souhaitiez remplacer un ensemble vous avez mis à jour avant. J'ai une application dans laquelle l'utilisateur est capable de télécharger un nouveau htcore.dll . Après le téléchargement, je le renommerai à htcore.dll_new . Au début de l'application, les bibliothèques sont remplacées, voir ci-dessous:

Modifiez le constructeur de votre app.cs xxx


0 commentaires