net manager existe esta declarado contexto connectionstrings app actual .net configuration configurationmanager

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



system configuration vb net (5)

Me gustaría anular el uso del app.config estándar pasando 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 comando?

Editar:

Resulta que la forma correcta de cargar un archivo de configuración que es diferente al nombre de 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 configuración de la aplicación, pero todos los valores son nulos.


Esto no es exactamente lo que quiere ... redireccionar el objeto estático de ConfigurationManager para señalar una ruta diferente. Pero creo que es la solución correcta para tu problema. Consulte el método OpenExeConfiguration en la clase ConfigurationManager .

Si el método anterior no es lo que estás buscando, creo que también valdría la pena echar un vistazo al uso de las capacidades de Configuración del marco de la Biblioteca Empresarial (desarrollado y mantenido por el equipo de Microsoft Patterns & Practices).

En concreto, eche un vistazo a la clase FileConfigurationSource .

Aquí hay un código que destaca el uso de FileConfigurationSource de Enterprise Library . Creo que esto cumple plenamente sus objetivos. El único ensamblado que necesita de Ent Lib para esto es Microsoft.Practices.EnterpriseLibrary.Common.dll .

static void Main(string[] args) { //read from current app.config as default AppSettingsSection ass = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).AppSettings; //if args[0] is a valid file path assume it''s a config for this example and attempt to load if (args.Length > 0 && File.Exists(args[0])) { //using FileConfigurationSource from Enterprise Library FileConfigurationSource fcs = new FileConfigurationSource(args[0]); ass = (AppSettingsSection) fcs.GetSection("appSettings"); } //print value from configuration Console.WriteLine(ass.Settings["test"].Value); Console.ReadLine(); //pause }


Necesitaba hacer esto también para una aplicación mía, y tratar con los objetos de configuración estándar se convirtió en una molestia tan extraña para 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. Así que todo mi código solo trata con Configuration DataTable para recuperar los valores y no ese objeto de configuración de la aplicación ofuscado de manera craptastical.

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

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

Ron


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


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

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

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

Usa el objeto config

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


Así que aquí está el código que realmente me permite acceder a la sección appSettings en un archivo de configuración que no es el 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;