Подтвердить что ты не робот

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 для правильной загрузки конфигурационного файла?

4b9b3361

Ответ 2

Я не могу вспомнить, где я нашел это решение, но вот как мне удалось загрузить конкретный файл конфигурации exe:

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

Ответ 3

Чтобы избежать этой проблемы в целом, вы можете прочитать в файле конфигурации в виде 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;

Ответ 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;
}

По крайней мере, это метод, который я использую при шифровании и расшифровке раздела connectionStrings для моих консольных/графических приложений. exeConfigName - это имя исполняемого файла, включая .exe.