¿Cómo selecciono un archivo de configuración de la aplicación .Net desde un parámetro de línea de comandos?

StackOverflow https://stackoverflow.com/questions/163803

Pregunta

Me gustaría anular el uso del app.config estándar al pasar un parámetro de línea de comando. ¿Cómo cambio el archivo de configuración de la aplicación predeterminada para que cuando acceda a ConfigurationManager.AppSettings acceda al archivo de configuración especificado en la línea de comandos?

Editar:

Resulta que la forma correcta de cargar un archivo de configuración que es diferente al nombre del EXE más .config es usar OpenMappedExeConfiguration. P.ej.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Shell2.exe.config");
currentConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

Esto funciona parcialmente. Puedo ver todas las claves en la sección de ajustes de aplicaciones, pero todos los valores son nulos.

¿Fue útil?

Solución

Aquí está el código que realmente me permite acceder a la sección de configuración de aplicaciones en un archivo de configuración distinto al predeterminado.

ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = Path.Combine(Environment.CurrentDirectory, "Alternate.config");
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile,ConfigurationUserLevel.None);

AppSettingsSection section = (AppSettingsSection)config.GetSection("appSettings");
string MySetting = section.Settings["MySetting"].Value;

Otros consejos

Un archivo por lotes que copia el archivo de configuración deseado a appname.exe.config y luego ejecuta el appname.exe.

También necesitaba hacer esto para una aplicación mía, y lidiar con los objetos de configuración estándar convertidos en un problema tan extraño por un concepto tan simple que tomé esta ruta:

  1. Mantenga varios archivos de configuración en formato XML similar a app.config
  2. Cargue el archivo de configuración especificado en un DataSet (a través de .ReadXML), y use DataTable con la información de configuración como mi objeto de configuración .
  3. Por lo tanto, todo mi código solo trata con la Tabla de datos de configuración para recuperar valores y no con el objeto de configuración de la aplicación ofuscado.

luego puedo pasar el nombre de archivo de configuración que necesito en la línea de comandos y, si no hay uno, simplemente cargue app.config en DataSet .

Jeezus fue mucho más simple después de eso. :-)

Ron

Esta es la parte relevante de la fuente de la aplicación que utiliza la configuración predeterminada y acepta la anulación a través de la línea de comandos:

Obtenga la configuración actual o del usuario en el objeto de configuración

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string defCfgName = Environment.GetCommandLineArgs()[0] + ".config";

if (arg.Length != 0)
{
    string ConfigFileName = arg[0];
    if (!File.Exists(ConfigFileName))
        Fatal("File doesn't exist: " + ConfigFileName, -1);                
    config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = ConfigFileName }, ConfigurationUserLevel.None);
}
else if (!File.Exists(defCfgName)) Fatal("Default configuration file doesn't exist and no override is set." , -1);

Usar el objeto de configuración

AppSettingsSection s = (AppSettingsSection)config.GetSection("appSettings");
KeyValueConfigurationCollection a = s.Settings;
ConnectionString = a["ConnectionString"].Value;

Esto no es exactamente lo que desea ... para redireccionar el ConfigurationManager objeto estático para apuntar a una ruta diferente. Pero creo que es la solución correcta para su problema. Consulte el método OpenExeConfiguration en el ConfigurationManager .

Si el método anterior no es lo que está buscando, creo que también valdría la pena echarle un vistazo utilizando Capacidades de configuración del marco de Enterprise Library (desarrollado y mantenido por el equipo de Microsoft Patterns & amp; Practices).

Específicamente, eche un vistazo a FileConfigurationSource class.

Aquí hay un código que resalta el uso de FileConfigurationSource de

scroll top