2009-12-03 37 views
19

¿Es posible reubicar todo el archivo App.Config en una ruta personalizada?Reubicación del 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 programa 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 \\.

+0

la behavious predeterminado es el programa tiene una configuración por defecto 1 archivo en su propio director y cada usuario tiene su propio archivo de configuración almacenado en su área de usuario, pero por defecto cualquier configuración establecida para el usuario se extraerá de la configuración del usuario a menos que no esté presente, entonces utilizará los programas config – MikeT

Respuesta

14

Cada dominio de aplicación 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 = "<path to your config file>"; 

// 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.

+0

Intenté esto para una aplicación que usaba WCF, pero no funcionó (corríjame si estoy equivocado). ¿Alguna idea sobre cómo reubicar app.config para una aplicación que usa WCF? – Contango

+0

@ Gravitas: Si todavía es relevante para usted: Encontré una solución: http://stackoverflow.com/questions/6150644/change-default-app-config-at-runtime/6151688#6151688 –

+0

Útil para conocer ese programName .exe.config es donde termina app.config. Gracias por la información. –

1

Lo siento si me entienden mal su solicitud, pero no puede utilizar

ConfigurationManager.OpenExeConfiguration Method (String)

basado en el cambio, es posible que usted puede utilizar

AppDomainSetup.ConfigurationFile Property

+2

Esto ayudaría en los casos en que leo manualmente la configuración desde la configuración, pero no para las secciones que se lee .NET, como la configuración de WCF y ConnectionStrings, etc. – Ries

+0

AppDomainSetup.ConfigurationFile Property se ve prometedor; Investigaré ... – Ries

+1

Solo puede modificar AppDomainSetup.ConfigurationFile durante el proceso de creación de un nuevo dominio de aplicación. No puede modificarlo una vez que se ejecuta su dominio de aplicación. –

1

Usted podría utilizar El enfoque de Astander de llamar al 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.

BTW, 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.

-1

MSDN probablemente ayudaría ...

El elemento simplifica el servicio para los componentes asambleas. Si uno o más aplicaciones utilizan un ensamblado que tiene un archivo de configuración que residen en un lugar bien conocido, la configuración archivos de las aplicaciones que utilizan el conjunto de puede utilizar el elemento a incluyen el archivo de configuración de montaje , en lugar de incluir información de configuración directamente. Cuando el montaje de componentes es servicio, actualizar el archivo de configuración proporciona común actualizado información de configuración a todos los aplicaciones que utilizan el conjunto de

+0

Solo funciona para AssemblyBinding –

2

Esta es una antigua pregunta, pero me encontré con este mismo problema y se le ocurrió una solución hacky desde unos pocos 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); 
    } 
} 

he utilizado solamente en .NET2, pero se ve igual en 4 en reflector. Por supuesto que no recomendaría enviar esto: P Solo lo uso para cosas internas rápidas.

+1

Si usa .NET 4.5, puede reemplazar este código con "AppDomain.CurrentDomain.SetData (" APP_CONFIG_FILE "," ruta de acceso al archivo de configuración ")" (vea la respuesta a continuación). Lo he verificado y funciona perfectamente (carga una nueva aplicación.config en el dominio de la aplicación actual). – Contango

+0

Sí, APP_CONFIG_FILE funciona para mí. Todavía tiene que usar el hack ResetConfigManager() y RefreshSection ("appSettings"). ¡Todo este proceso de configuración de .NET requiere una reescritura completa! – Rbjz

32

Si sigue siendo relevante, se ha utilizado el siguiente me encontré en otra respuesta sugerida a otra pregunta aquí en desbordamiento de pila ...

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

funcionó muy bien para nosotros cuando tuvimos problemas al cargar DLL de app.config Sólo ...

+0

Si usa esa técnica, ciertas secciones de configuración no se aplicarán. Por ejemplo [''] (https://msdn.microsoft.com/en-us/library/6bs4szyc (v = vs.110) .aspx). –

4

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"); 

Luego, cuando se llama a

NameValueCollection settings = System.Configuration.ConfigurationManager.AppSettings; 

o cualquier operación para buscar la configuración de la aplicación, se utiliza la nueva ruta.

Espero que esto pueda ayudar a alguien más que tiene el mismo problema!

5

Sé que esto es una cuestión de edad, pero para aquellos que simplemente quieren tener su app.config en una ubicación diferente a su ubicación binaria acumulación de salida, las siguientes obras como Microsoft pretendía (y por lo tanto no hay necesidad de re -read y vuelve a escribir el archivo en el disco)

  • Defina un app.config como siempre lo hace.
  • definir otro archivo de configuración donde se desea tener el archivo de configuración real
  • Cambiar el app.config para que haga referencia al archivo de configuración

En tiempo de ejecución la configuración del archivo de configuración anulará los ajustes en la aplicación.config (si está presente). Y has terminado.

Ejemplo App.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
    <appSettings file="..\Config\settings.config"> 
    <add key="port" value="1001"/> 
    </appSettings> 
</configuration> 

Nota 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

<?xml version="1.0" encoding="utf-8"?> 
<appSettings> 
    <add key="port" value="1234"/> 
</appSettings> 

En tiempo de ejecución del port ajuste no tendrá el valor 1234.

Más información ver msdn

+3

Nota: Esto solo para cargar la sección 'appSettings' de un archivo separado. No está cargando toda la aplicación.config desde otra ubicación –

Cuestiones relacionadas