Reubicación del archivo app.config en una ruta personalizada

¿Es posible reubicar todo el archivo App.Config en una ruta personalizada?

Parece un poco extraño que el archivo de configuración resida en la misma carpeta que el archivo ejecutable, con el nuevo enfoque de Windows de guardar todas las configuraciones del progtwig en c: \ ProgramData y todo.

Un requisito adicional que tenemos es especificar programáticamente dónde encontrar el archivo app.config. La razón de esto es que generamos diferentes instancias de servicio de las mismas, y nos gustaría almacenar la aplicación de cada servicio. Configúrela en la carpeta de configuración de ese servicio en c: \ ProgramData \\.

Cada AppDomain tiene / puede tener su propio archivo de configuración. El AppDomain predeterminado creado por el host CLR usa programname.exe.config; si desea proporcionar su propio archivo de configuración, cree un Dominio de aplicación por separado. Ejemplo:

// get the name of the assembly string exeAssembly = Assembly.GetEntryAssembly().FullName; // setup - there you put the path to the config file AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = System.Environment.CurrentDirectory; setup.ConfigurationFile = ""; // create the app domain AppDomain appDomain = AppDomain.CreateDomain("My AppDomain", null, setup); // create proxy used to call the startup method YourStartupClass proxy = (YourStartupClass)appDomain.CreateInstanceAndUnwrap( exeAssembly, typeof(YourStartupClass).FullName); // call the startup method - something like alternative main() proxy.StartupMethod(); // in the end, unload the domain AppDomain.Unload(appDomain); 

Espero que ayude.

Si aún es relevante, hemos utilizado lo siguiente que encontré en otra respuesta sugerida a otra pregunta aquí en Stack Overflow …

 AppDomain.CurrentDomain.SetData ("APP_CONFIG_FILE", "path to config file") 

Funcionó muy bien para nosotros cuando tuvimos problemas al cargar app.config solo desde DLL …

Esto funcionó para mí … (tomado de http://msdn.microsoft.com/en-us/library/system.configuration.appsettingssection.aspx )

 // open config System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // update appconfig file path config.AppSettings.File = "C:\\dev\\App.config"; // Save the configuration file. config.Save(ConfigurationSaveMode.Modified); // Force a reload in memory of the changed section. ConfigurationManager.RefreshSection("appSettings"); 

Entonces cuando llamas

 NameValueCollection settings = System.Configuration.ConfigurationManager.AppSettings; 

o cualquier operación para recuperar la configuración de la aplicación, se usa la nueva ruta.

Espero que esto pueda ayudar a alguien más que tenga el mismo problema.

Sé que esta es una vieja pregunta, pero para aquellos que solo quieren tener su aplicación. Configurar en una ubicación diferente a la ubicación de comstackción de salida binaria, lo siguiente funciona como microsoft (y por lo tanto no es necesario volver a leer y volver a escribir el archivo en el disco)

  • Define un app.config como siempre lo haces.
  • Defina otro archivo de configuración donde desee tener el archivo de configuración real
  • Cambie app.config para que haga referencia al archivo de configuración

En el tiempo de ejecución, la configuración del archivo de configuración anulará la configuración en el app.config (si está presente). Y has terminado.

Ejemplo app.config

          

Tenga en cuenta el archivo = “.. \ Config \ settings.config” . Usted es completamente libre de definir la ruta a la ubicación donde desea que sus usuarios cambien la configuración.

Ejemplo del archivo de configuración real

     

En tiempo de ejecución, el port configuración tendrá el valor 1234.

Más información ver msdn

Esta es una pregunta antigua, pero me encontré con este mismo problema y se me ocurrió una solución hacky de unos minutos en el reflector:

 static public class ConfigHack { static public void OverrideAppConfig(string path) { ((AppDomainSetup) typeof(AppDomain) .GetField("_FusionStore", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(AppDomain.CurrentDomain)) .ConfigurationFile = path; } static public void ResetConfigManager() { typeof(ConfigurationManager) .GetField("s_initState", BindingFlags.Static | BindingFlags.NonPublic) .SetValue(null, 0); } } 

Solo lo he usado en .NET2, pero tiene el mismo aspecto en 4 en reflector. Por supuesto, no recomendaría enviar esto: PI solo lo usa para cosas internas rápidas.

Lo siento si malinterpreto tu solicitud, pero no puedes usarla

ConfigurationManager.OpenExeConfiguration Method (String)

Basado en el cambio, ¿es posible que pueda usar

Propiedad AppDomainSetup.ConfigurationFile

Podría usar el enfoque de OpenExeConfiguration llamar a OpenExeConfiguration . Si literalmente desea reubicar su archivo de configuración, deberá crear su propio dominio de aplicación. En el proceso de configuración del dominio de su aplicación, tiene la oportunidad de especificar dónde se encuentra el archivo de configuración.

Por cierto, los archivos de configuración de .NET no son geniales para la configuración, al menos no del tipo que los usuarios pueden modificar: no son como los archivos INI o el registro. Si desea flexibilidad sobre el origen de su configuración, es mejor que la almacene por separado.

MSDN probablemente ayudaría …

El elemento simplifica el servicio para ensambles de componentes. Si una o más aplicaciones usan un ensamblado que tiene un archivo de configuración que reside en una ubicación conocida, los archivos de configuración de las aplicaciones que usan el ensamblaje pueden usar el elemento para incluir el archivo de configuración de ensamblaje, en lugar de incluir información de configuración directamente. Cuando se repara el conjunto de componentes, la actualización del archivo de configuración común proporciona información de configuración actualizada para todas las aplicaciones que usan el ensamblaje