2009-06-21 3 views
6

Stiamo caricando un assembly (una DLL) che legge un file di configurazione. Abbiamo bisogno di cambiare il file di configurazione e quindi ricaricare l'assembly. Vediamo che dopo aver caricato l'assemblaggio la seconda volta, non ci sono cambiamenti nella configurazione. Qualcuno vede cosa c'è di sbagliato qui? Abbiamo omesso i dettagli della lettura nel file di configurazione.Come ricaricare un assieme per un dominio di applicazione .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

perché ti nee d per ricaricare l'assemblaggio dopo aver aggiornato il file di configurazione? Contiene definizioni di tipo rispetto a quelle create dinamicamente? –

+0

Mitch - sì lo fanno –

risposta

3

Credo che l'unico modo per farlo è quello di iniziare un nuovo dominio di applicazione e scaricare quello originale. In questo modo ASP.NET ha sempre gestito le modifiche a web.config.

11

Non è possibile scaricare un assieme una volta che è stato caricato. Tuttavia, è possibile scaricare un AppDomain, quindi la soluzione migliore è caricare la logica in un AppDomain separato, quindi, quando si desidera ricaricare l'assembly, è necessario scaricare AppDomain e ricaricarlo.

3

Se si stanno modificando alcune sezioni, è possibile utilizzare ConfigurationManager.Refresh ("sectionName") per forzare una rilettura dal disco.

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

(Si noti che è necessario modificare il file di application.vshost.exe.config se si utilizza il processo di hosting VS, quando si verifica questo.)