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

Remplacer une DLL (.net) au runtime par une nouvelle version - C#/.NET managed - Programmation

Marsh Posté le 28-08-2008 à 18:38:26    

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
Reply

Marsh Posté le 28-08-2008 à 18:38:26   

Reply

Marsh Posté le 29-08-2008 à 08:54:55    

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)
Reply

Marsh Posté le 29-08-2008 à 10:21:49    

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 !

Reply

Marsh Posté le 01-09-2008 à 08:55:57    

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.

Reply

Marsh Posté le 01-09-2008 à 13:41:17    

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.

Reply

Marsh Posté le 01-09-2008 à 13:56:58    

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).
 
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed