Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1583 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Remplacer une DLL (.net) au runtime par une nouvelle version

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Remplacer une DLL (.net) au runtime par une nouvelle version

n°1779382
An0nymer
Posté le 28-08-2008 à 18:38:26  profilanswer
 

Bonjour,
 
Dans le cadre du debug d'une application particulièrement lourde et longue à charger, je souhaiterais pouvoir remplacer en "live" une DLL déjà chargée par l'appli par une autre DLL, histoire de voir le nouveau comportement sans avoir à killer l'ensemble.
 
J'ai déjà une partie de l'appli qui fonctionne ainsi, car l'appli fonctionne un peu sous forme de "plugin" et charge dynamiquement certaine DLL : j'ai donc modifié la partie load de DLL qui était du genre "assembly.LoadFile" par un bout de code qui d'abord charge en mémoire la DLL dans un tableau de byte puis je fais charger cette DLL virtuelle via "assembly.Load(bytes() raw)". De cette manière la vraie DLL n'est jamais lockée et je peux la remplacer autant que je veux, l'application change de comportement au runtime à chaque appel des fonctions c'est parfait.  :D  
 
MAIS le problème qu'il me reste, c'est quand l'appli charge elle-même une DLL, genre un plugin qui hérite d'un autre et bien le plugin source, celui qui est hérité, est chargé par le framework et l'assembly sur le disque est bien lockée, normal... mais j'aimerais faire la même chose qu'expliqué au dessus... pour faire des tests en live au runtime, ce serait génial !  :cry:  
 
 
 
J'ai peu d'espoir, mais je sais qu'il est possible d'injecter du code, de modifier l'IAT (Import Address Table) d'une assembly, peut-être même de déplacer le curseur qui va à l'entry point d'une DLL chargée en mémoire pour le déplacer sur l'entry point d'une autre ? A ce moment il "suffirait" de charger mes DLL dynamique comme je l'ai expliqué plus haut et de mettre le curseur de la vraie DLL dessus (sur son entry point).
 
Enfin bref, je n'y connais pas grand chose, sinon je ne viendrais pas demander, mais je pense qu'il y a de sérieuse piste, mais je ne sais pas par où commencer. J'ai trouver beaucoup de sujet sur codeproject concernant l'injection, le hook d'iat etc mais pour le moment je surnage.
Un peu d'aide pour ce projet intéressant serait la bienvenue.  :hello:  
 
Merci


Message édité par An0nymer le 28-08-2008 à 18:39:08
mood
Publicité
Posté le 28-08-2008 à 18:38:26  profilanswer
 

n°1779566
moi23372
Posté le 29-08-2008 à 08:54:55  profilanswer
 

je ne sais pas comment tu pourrais faire, mais sache une chose, le fait de renommer une dll en cours d'exécution est autorisé. De ce fait, rien ne t'empêche de la renommer autrement, et de recopier ta nouvelle DLL ensuite. Ce qui est sure c'est que ça marche. J'utilise cette technique dans mon module d'auto-update des mes applications.


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°1779635
An0nymer
Posté le 29-08-2008 à 10:21:49  profilanswer
 

Bonjour,
 
Je confirme qu'on peut effectivement renommer une DLL lorsqu'elle est lockée. En revanche je viens de tester cette proposition mais ça ne fonctionne pas, l'appli garde le lock sur la première DLL renommée et ne tient pas compte de la seconde DLL. Il faut killer l'ensemble.
 
Une autre proposition ?
 
Merci !

n°1780818
An0nymer
Posté le 01-09-2008 à 08:55:57  profilanswer
 

Le problème n'a pas l'air très motivant. Au moins personne ne le rembarre, c'est déjà bon signe.
 
Bon ça fait déjà beaucoup de lettre pour un petit "up" : à votre bon coeur m'sieur dame.

n°1780975
Tarabiscot​e
Posté le 01-09-2008 à 13:41:17  profilanswer
 

Actuellement, il n'est pas possible de ne décharger qu'une Dll d'un domaine.
Il faut décharger tout le domaine, une petite explication du pourquoi ici :
http://blogs.msdn.com/jasonz/archi [...] 45105.aspx
 
Sinon pour décharger ta dll il faut d'abord créer un nouveau domaine et la charger uniquement dans ce domaine,
ensuite il ne reste plus qu'a décharger ce domaine.
J'ai pas encore testé mais j'ai vu quelques exemples ici :
http://forums.msdn.microsoft.com/e [...] e0a855e56/
 
Voilà j'espère que ca t'aidera.

n°1780986
An0nymer
Posté le 01-09-2008 à 13:56:58  profilanswer
 

Merci Tarabiscote.
 
Ce signifie que si je charge mes DLL dans un domains particulier, toutes les DLL auquel elle-même ferait appel serait également loadé dans ce domain particulier et l'ensemble serait unloadable.
 
Intéressant. Je vais voir ce que je peux en faire.
Merci, j'avais vu cette notion mais je n'avais pas réalisé que l'ensemble se logerait dans le domain, y compris les DLL mères (dont on hérite).
 
@+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Remplacer une DLL (.net) au runtime par une nouvelle version

 

Sujets relatifs
[C] accéder à une zone de mémoire allouée en dehors d'une DLLObtenir la version du navigateur client avec une jsp/servlet
Exporter DLL dépendantes d'un EXE (?)[PDA/PPC] transcrire sur Windows Mobile la version PC d'un dico aéro
remplacer des caracterescopier un texte sur excelet le remplacer dans word
VBA : remplacer tous les 0 d'une feuille excelCherche version évaluation Dreamweaver CS3 Mac FR
Mapper 2 blocs de memoires a une nouvelle adresseComment ouvrir un lien sur un nouvel onglet et non une nouvelle page ?
Plus de sujets relatifs à : Remplacer une DLL (.net) au runtime par une nouvelle version


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR