ConfigurationManager.OpenExeConfiguration – carica il file sbagliato?

Ho aggiunto più file app.config (ciascuno con un nome diverso) a un progetto e li ho impostati per copiare nella directory di output su ogni build.

Cerco di accedere al contenuto di ogni file usando questo:

System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1.config"); 

Il codice viene eseguito, ma o.HasFile finisce con False e o.FilePath finisce “app1.config.config”. Se cambio codice:

 System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1"); 

Quindi il codice bombarda con “Si è verificato un errore durante il caricamento di un file di configurazione: il parametro ‘exePath’ non è valido. Nome parametro: exePath”.

Se copio / incollo il file di configurazione (così finisco con app1.config e app1.config.config) allora il codice funziona bene, tuttavia, ritengo che questa non sia una buona soluzione. La mia domanda è quindi: come posso usare ConfigurationManager.OpenExeConfiguration per caricare correttamente un file di configurazione?

Non riesco a ricordare dove ho trovato questa soluzione, ma ecco come sono riuscito a caricare un file di configurazione exe specifico:

 ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" }; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 

Secondo http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 il parametro è il percorso di un exe e il metodo cerca la configurazione corrispondente a quel exe (suppongo che il nome del parametro di exePath abbia senso ora!).

Per evitare del tutto questo problema, puoi leggere il file di configurazione come un file XML, ad esempio:

 using System.Xml; using System.Xml.XPath; XmlDocument doc = new XmlDocument(); doc.Load(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\..\\..\\..\\MyWebProject\\web.config"); string value = doc.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key='MyKeyName']").Attributes["value"].Value; 
 using System.Reflection; try { Uri UriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)); string appPath = UriAssemblyFolder.LocalPath; //Open the configuration file and retrieve //the connectionStrings section. Configuration config = ConfigurationManager. OpenExeConfiguration(appPath + @"\" + exeConfigName); ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection; } 

Almeno, questo è il metodo che utilizzo durante la crittografia e la decrittografia della sezione connectionStrings per le mie app console / GUI. exeConfigName è il nome dell’eseguibile che include l’exe.