2009-06-21 19 views
6

Estamos cargando un ensamblado (un archivo DLL) que lee un archivo de configuración. Necesitamos cambiar el archivo de configuración y luego volver a cargar el conjunto. Vemos que después de cargar el conjunto la segunda vez, no hay cambios en la configuración. ¿Alguien ve qué está mal aquí? Olvidamos los detalles de lectura en el archivo de configuración.¿Cómo volver a cargar un ensamblaje para un dominio de aplicación .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

¿por qué usted nee d para volver a cargar el ensamblaje después de actualizar el archivo de configuración? ¿Contiene definiciones de tipos que no se crean dinámicamente? –

+0

Mitch - sí lo hacen –

Respuesta

3

Creo que la única manera de hacerlo es comenzar un nuevo dominio de aplicación y descargar la original. Así es como ASP.NET siempre ha manejado los cambios en web.config.

11

No puede descargar un conjunto una vez que se haya cargado. Sin embargo, puede descargar un Dominio de aplicación, por lo que su mejor opción sería cargar la lógica en un Dominio de aplicación separado y luego, cuando desee volver a cargar el ensamblaje, deberá descargar el Dominio de aplicación y luego volver a cargarlo.

3

Si solo está cambiando algunas secciones, puede usar ConfigurationManager.Refresh ("sectionName") para forzar una nueva lectura desde el 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(); 
    } 

(Tenga en cuenta que usted tiene que cambiar el archivo application.vshost.exe.config si está utilizando el proceso de alojamiento VS, al probar esto.)

Cuestiones relacionadas