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.

Другие вопросы по тегам