leer getsection example crear configuracion archivo app c# configuration internals

getsection - crear un archivo app.config en c#



Redirigir ConfigurationManager a otro archivo (1)

Estoy buscando redirigir la clase .Net ConfigurationManager estándar a otro archivo; por completo La ruta se determina en tiempo de ejecución, por lo que no puedo usar configSource o tal (esta no es una pregunta duplicada, he visto a los demás).

En esencia, intento 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 Reflector abierto y he empezado a ver cómo ASP.Net lo hace: 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) sino simplemente documentación .


Finalmente lo resolví. Existe un medio público documentado para hacer esto, pero está escondido en las profundidades del marco .Net. 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 función de Microsoft Connect que 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