2009-06-21 5 views
6

Nous chargeons un assembly (une DLL) qui lit un fichier de configuration. Nous devons changer le fichier de configuration, puis recharger l'assembly. Nous voyons qu'après chargement de l'ensemble la 2ème fois, il n'y a pas de changement dans la configuration. Quelqu'un voit ce qui ne va pas ici? Nous avons omis les détails de la lecture dans le fichier de configuration.Comment recharger un assembly pour un domaine d'application .NET?

AppDomain subDomain; 
string assemblyName = "mycli"; 
string DomainName = "subdomain"; 
Type myType; 
Object myObject; 

// Load Application domain + Assembly 
subDomain = AppDomain.CreateDomain(DomainName, 
            null, 
            AppDomain.CurrentDomain.BaseDirectory, 
            "", 
            false); 

myType = myAssembly.GetType(assemblyName + ".mycli"); 
myObject = myAssembly.CreateInstance(assemblyName + ".mycli", false, BindingFlags.CreateInstance, null, Params, null, null); 

// Invoke Assembly 
object[] Params = new object[1]; 
Params[0] = value; 
myType.InvokeMember("myMethod", BindingFlags.InvokeMethod, null, myObject, Params); 

// unload Application Domain 
AppDomain.Unload(subDomain); 

// Modify configuration file: when the assembly loads, this configuration file is read in 

// ReLoad Application domain + Assembly 
// we should now see the changes made in the configuration file mentioned above 

+1

pourquoi vous nee d recharger l'assemby après la mise à jour du fichier de configuration? Contient-il des définitions de type que celles créées dynamiquement? –

+0

Mitch - oui ils le font –

Répondre

3

Je crois que la seule façon de le faire est de commencer un nouveau AppDomain et décharger l'original. C'est ainsi que ASP.NET a toujours géré les modifications de web.config.

11

Vous ne pouvez pas décharger un assemblage une fois qu'il a été chargé. Cependant, vous pouvez décharger un AppDomain, donc votre meilleur pari serait de charger la logique dans un AppDomain séparé, puis lorsque vous voudrez recharger l'assembly, vous devrez décharger le AppDomain, puis le recharger.

3

Si vous modifiez simplement certaines sections, vous pouvez utiliser ConfigurationManager.Refresh ("sectionName") pour forcer une relecture à partir du disque.

static void Main(string[] args) 
    { 
     var data = new Data(); 
     var list = new List<Parent>(); 
     list.Add(new Parent().Set(data)); 

     var configValue = ConfigurationManager.AppSettings["TestKey"]; 
     Console.WriteLine(configValue); 

     Console.WriteLine("Update the config file ..."); 
     Console.ReadKey(); 

     configValue = ConfigurationManager.AppSettings["TestKey"]; 
     Console.WriteLine("Before refresh: {0}", configValue); 

     ConfigurationManager.RefreshSection("appSettings"); 

     configValue = ConfigurationManager.AppSettings["TestKey"]; 
     Console.WriteLine("After refresh: {0}", configValue); 

     Console.ReadKey(); 
    } 

(Notez que vous devez modifier le fichier application.vshost.exe.config si vous utilisez le processus d'hébergement VS, lors du test de ce sujet.)

Questions connexes