Come faccio a selezionare un file di configurazione dell'applicazione .Net da un parametro della riga di comando?

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

Domanda

Vorrei sovrascrivere l'uso dello standard app.config passando un parametro della riga di comando. Come posso modificare il file di configurazione dell'applicazione predefinito in modo che quando accedo a ConfigurationManager.AppSettings accedo al file di configurazione specificato nella riga di comando?

Modifica:

Si scopre che il modo corretto di caricare un file di configurazione diverso dal nome di EXE plus .config è usare OpenMappedExeConfiguration. Per esempio.

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

Funziona parzialmente. Posso vedere tutte le chiavi nella sezione appSettings ma tutti i valori sono nulli.

È stato utile?

Soluzione

Quindi ecco il codice che in realtà mi consente di accedere effettivamente alla sezione appSettings in un file di configurazione diverso da quello predefinito.

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;

Altri suggerimenti

Un file batch che copia il file di configurazione desiderato in appname.exe.config e quindi esegue appname.exe.

Avevo bisogno di farlo anche per una mia app, e gestire gli oggetti di configurazione standard trasformati in una seccatura così strana per un concetto così semplice che ho seguito questa strada:

  1. Mantieni più file di configurazione in formato XML simili a app.config
  2. Carica il file di configurazione specificato in un DataSet (tramite .ReadXML) e usa la DataTable con le informazioni di configurazione in esso come il mio oggetto di configurazione .
  3. Quindi tutto il mio codice si occupa solo della Tabella dati di configurazione per recuperare i valori e non quell'oggetto di configurazione app offuscato di botto.

quindi posso passare qualsiasi nome di file di configurazione che mi serve sulla riga di comando e se non ce n'è uno, basta caricare app.config nel DataSet .

Jeezus è stato molto più semplice dopo. : -)

Ron

Questa è la parte rilevante del sorgente per l'app che utilizza la configurazione predefinita e accetta l'override dalla riga di comando:

Ottieni la configurazione corrente o dell'utente nell'oggetto 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 l'oggetto config

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

Non è esattamente ciò che si desidera ... reindirizzare l'attuale ConfigurationManager oggetto statico per puntare a un percorso diverso. Ma penso che sia la soluzione giusta al tuo problema. Dai un'occhiata al metodo OpenExeConfiguration sul ConfigurationManager .

Se il metodo sopra riportato non è quello che stai cercando, penso che varrebbe la pena dare un'occhiata all'utilizzo di Funzionalità di configurazione del framework Enterprise Library (sviluppato e gestito dal team Microsoft Patterns & amp; Practices).

Dai un'occhiata in particolare a FileConfigurationSource classe.

Ecco un codice che evidenzia l'uso del FileConfigurationSource da

scroll top