web-dev-qa-db-fra.com

ConfigurationManager.OpenExeConfiguration - charge le mauvais fichier?

J'ai ajouté plusieurs fichiers app.config (chacun avec un nom différent) à un projet, et je les ai configurés pour copier dans le répertoire de sortie de chaque build.

J'essaie d'accéder au contenu de chaque fichier en utilisant ceci:

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

Le code s'exécute, mais o.HasFile finit par False et o.FilePath finit par "app1.config.config". Si je change de code:

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

Puis le code bombarde avec "Une erreur s'est produite lors du chargement d'un fichier de configuration: Le paramètre 'exePath' n'est pas valide. Nom du paramètre: exePath".

Si je copie/colle le fichier de configuration (donc je me retrouve avec app1.config et app1.config.config), le code fonctionne bien, cependant, je suppose que ce n'est pas une bonne solution. Ma question est donc la suivante: comment utiliser ConfigurationManager.OpenExeConfiguration pour charger correctement un fichier de configuration?

34
user9659

Selon http://social.msdn.Microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 le paramètre est l'emplacement d'un exe, et la méthode recherche ensuite la configuration correspondant à cet exe (je suppose que le nom du paramètre d'exePath a du sens maintenant!).

22
user9659

Je ne me souviens pas où j'ai trouvé cette solution mais voici comment j'ai réussi à charger un fichier de configuration exe spécifique:

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

Pour éviter complètement ce problème, vous pouvez lire le fichier de configuration en tant que fichier XML, par exemple:

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;
8
Francis Huang
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;
}

Au moins, c'est la méthode que j'utilise lors du cryptage et du décryptage de la section connectionStrings pour mes applications console/GUI. exeConfigName est le nom de l'exécutable, y compris le .exe.

2
Ron Hagerman