2010-01-20 15 views
3

J'ai différentes versions de DLL pour mon application .NET et la plupart du temps je veux utiliser le dernier. Cependant, il existe une méthode que je lance sur un thread séparé où je dois être en mesure de sélectionner une ancienne version de la DLL en fonction de certains critères.Comment puis-je changer l'assembly .NET pour l'exécution d'une méthode?

J'ai appris qu'il n'est pas possible de charger un assemblage et de le décharger dans le domaine d'application par défaut (je ne peux pas garder les deux versions chargées car je rencontre des définitions de type

Probablement que je dois créer un AppDomain distinct, charger l'assemblage là-bas, puis le décharger. Ce domaine d'application n'exécuterait qu'une seule méthode sur un thread distinct et fonctionnerait avec une version différente de la bibliothèque.

Pensez-vous que c'est une bonne approche/avez-vous de meilleures idées/pouvez-vous me diriger vers une source qui me permettrait de démarrer?

Merci beaucoup;)

Répondre

8

Essayez quelque chose comme ceci:

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Type activator = typeof(ApplicationProxy); 
     AppDomain domain = 
      AppDomain.CreateDomain(
       "friendly name", null, 
       new AppDomainSetup() 
       { 
        ApplicationName = "application name" 
       }); 

     ApplicationProxy proxy = 
      domain.CreateInstanceAndUnwrap(
       Assembly.GetAssembly(activator).FullName, 
       activator.ToString()) as ApplicationProxy; 

     proxy.DoSomething(); 

     AppDomain.Unload(domain); 
    } 
} 

Et créer une classe proxy (doit hériter de MarshalByRefObject)

class ApplicationProxy : MarshalByRefObject 
{ 
    public void DoSomething() 
    { 
     Assembly oldVersion = Assembly.Load(new AssemblyName() 
     { 
      CodeBase = @"c:\yourfullpath\AssemblyFile.dll" 
     }); 

     Type yourOldClass = oldVersion.GetType("namespace.class"); 
     // this is an example: your need to correctly define parameters below 
     yourOldClass.InvokeMember("OldMethod", 
            BindingFlags.Public, null, null, null); 
    } 
} 
+0

Merci pour l'exemple, cela a fonctionné pour moi et résolu mon problème de http: // stackoverflow.com/questions/2094487/how-can-i-use-workflows-with-older-versions-of-activity-libraries-in-rehosted-w/2108268#2108268 –

+0

Typo? "ApplicationProxy" devrait être "RemoteProxy", ou vice-versa? – RenniePet

+0

C'est vrai, @RenniePet; fixé –

0

Pourquoi ne pas vous réécrire nouvelle bibliothèque pour avoir la verion ancienne du code dans une autre méthode et appel en cas de besoin?

public void MyNewMethod(){} 

public void MyLegacyMethod(){} 
+0

En fait, je n'ai pas trop de contrôle sur cela. Ma méthode génère des images de flux de travail basées sur les activités de la bibliothèque et elle doit avoir la bonne version de la bibliothèque chargée pour pouvoir fonctionner .. –