Come faccio a selezionare un file di configurazione dell'applicazione .Net da un parametro della riga di comando?
-
03-07-2019 - |
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.
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:
- Mantieni più file di configurazione in formato XML simili a app.config
- 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 .
- 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