ConfigurationManager.OpenExeConfiguration - loads the wrong file?

女生的网名这么多〃 提交于 2019-11-26 14:11:46

问题


I have added multiple app.config (each with a differet name) files to a project, and set them to copy to the output directory on each build.

I try and access the contents of each file using this:

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

The code runs, but o.HasFile ends up False, and o.FilePath ends up "app1.config.config". If I change to code:

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

Then the code bombs with "An error occurred loading a configuration file: The parameter 'exePath' is invalid. Parameter name: exePath".

If I copy/paste the config file (so I end up with app1.config and app1.config.config) then the code runs fine, however, I posit this is not a good solution. My question is thus: how can I use ConfigurationManager.OpenExeConfiguration to load a config file corretly?


回答1:


I can't remember where I found this solution but here is how I managed to load a specific exe configuration file:

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



回答2:


According to http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 the parameter is the location of an exe, and the method then looks for the config corresponding to that exe (I guess the parameter name of exePath makes sense now!).




回答3:


To avoid this problem altogether, you can read in the config file as an XML file, for example:

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;



回答4:


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

At least, this is the method I use when encrypting and decrypting the connectionStrings section for my console/GUI apps. exeConfigName is the name of the executable including the .exe.



来源:https://stackoverflow.com/questions/1083927/configurationmanager-openexeconfiguration-loads-the-wrong-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!