2009-07-28 19 views
5

Estoy buscando redirigir la estándar .Net ConfigurationManager class a otro archivo; en su totalidad. La ruta se determina en tiempo de ejecución, así que No puedo usar configSource o similar (esta no es una pregunta duplicada, he examinado las demás).Redirigir ConfigurationManager a otro archivo

Estoy esencialmente tratando de duplicar lo que ASP.Net está haciendo detrás de las coberturas. Por lo tanto, no solo mis clases deberían leer el nuevo archivo de configuración, sino también cualquier material .Net estándar (el que estoy tratando de poner en práctica específicamente es el elemento system.codeDom).

He descifrado el reflector abierto y comencé a ver cómo lo hace ASP.Net, es bastante peludo y está completamente indocumentado. Esperaba que alguien más haya realizado ingeniería inversa del proceso. No necesariamente buscando una solución completa (sería bueno) pero simplemente documentación.

Respuesta

9

Finalmente lo descubrí. Hay un medio público documentado para hacerlo, pero está escondido en las profundidades del .Net framework. Cambiar su propio archivo de configuración requiere reflexión (para no hacer más que actualizar el ConfigurationManager); pero es posible alterar el archivo de configuración de un AppDomain que usted crea a través de API públicas.

No gracias a la característica de Microsoft Connect presenté, aquí está el código:

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Setup information for the new appdomain. 
     AppDomainSetup setup = new AppDomainSetup(); 
     setup.ConfigurationFile = "C:\\my.config"; 

     // Create the new appdomain with the new config. 
     AppDomain d2 = AppDomain.CreateDomain("customDomain", AppDomain.CurrentDomain.Evidence, setup); 

     // Call the write config method in that appdomain. 
     CrossAppDomainDelegate del = new CrossAppDomainDelegate(WriteConfig); 
     d2.DoCallBack(del); 

     // Call the write config in our appdomain. 
     WriteConfig(); 

     Console.ReadLine(); 
    } 

    static void WriteConfig() 
    { 
     // Get our config file. 
     Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

     // Write it out. 
     Console.WriteLine("{0}: {1}", AppDomain.CurrentDomain.FriendlyName, c.FilePath); 
    } 
} 

Salida:

customDomain: C:\my.config 
InternalConfigTest.vshost.exe: D:\Profile\...\InternalConfigTest.vshost.exe.config 
Cuestiones relacionadas