ConfigurationManager.OpenExeConfiguration - загружает не тот файл?
Я добавил несколько файлов app.config (каждый с другим именем) в проект и настроил их копирование в выходной каталог для каждой сборки.
Я пытаюсь получить доступ к содержимому каждого файла, используя это:
System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1.config");
Код выполняется, но o.HasFile заканчивается False, а o.FilePath заканчивается "app1.config.config". Если я перейду на код:
System.Configuration.Configuration o = ConfigurationManager.OpenExeConfiguration(@"app1");
Затем код бомбит: "Произошла ошибка при загрузке файла конфигурации: параметр exePath недействителен. Имя параметра: exePath".
Если я копирую / вставляю файл конфигурации (таким образом, я получаю app1.config и app1.config.config), тогда код работает нормально, однако я полагаю, что это не очень хорошее решение. У меня такой вопрос: как я могу использовать ConfigurationManager.OpenExeConfiguration, чтобы правильно загрузить файл конфигурации?
4 ответа
Согласно http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 параметр является местоположением exe, а затем метод ищет конфигурацию соответствующий этому exe (я думаю, имя параметра exePath имеет смысл сейчас!).
Я не могу вспомнить, где я нашел это решение, но вот как мне удалось загрузить конкретный файл конфигурации exe:
ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Чтобы вообще избежать этой проблемы, вы можете прочитать в файле конфигурации как файл XML, например:
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;
}
По крайней мере, этот метод я использую при шифровании и дешифровании раздела connectionStrings для моих приложений консоли / графического интерфейса. exeConfigName
имя исполняемого файла, включая.exe.