2009-06-21 5 views
6

Wir laden eine Assembly (eine DLL), die eine Konfigurationsdatei liest. Wir müssen die Konfigurationsdatei ändern und dann die Assembly erneut laden. Wir sehen, dass nach dem zweiten Laden der Baugruppe die Konfiguration nicht geändert wird. Wer sieht hier was falsch ist? Wir haben die Details des Einlesens in der Konfigurationsdatei weggelassen.Wie wird eine Assembly für eine .NET-Anwendungsdomäne erneut geladen?

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

warum nee Sie d um die Assembly nach dem Update der Konfigurationsdatei neu zu laden? Enthält es Typdefinitionen, die dynamisch erstellt werden? –

+0

Mitch - ja, sie tun –

Antwort

3

Ich glaube, der einzige Weg, dies zu tun, ist eine neue AppDomain zu starten und das Original zu entladen. Auf diese Weise hat ASP.NET Änderungen an web.config vorgenommen.

11

Sie können eine Baugruppe nicht löschen, nachdem sie einmal geladen wurde. Sie können jedoch eine Anwendungsdomäne entladen, sodass Sie die Logik am besten in eine separate Anwendungsdomäne laden. Wenn Sie die Baugruppe dann erneut laden möchten, müssen Sie die Anwendungsdomäne entladen und dann erneut laden.

3

Wenn Sie nur einige Abschnitte ändern, können Sie ConfigurationManager.Refresh ("sectionName") verwenden, um ein erneutes Lesen von der Festplatte zu erzwingen.

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(); 
    } 

(Beachten Sie, dass Sie die application.vshost.exe.config Datei ändern, wenn Sie das VS-Hosting-Verfahren verwenden, wenn diese Prüfung.)

Verwandte Themen