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


person user9659    schedule 05.07.2009    source источник
comment
.net предоставляет хорошую статью: docs.microsoft.com/en-us/dotnet/api/   -  person Jeremy Ray Brown    schedule 08.02.2019
comment
Еще лучшая статья: codeproject. .com/Статьи/19675/   -  person Mike Lowery    schedule 04.08.2020


Ответы (4)


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

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
person user1697877    schedule 25.09.2012
comment
Это работает! Сумасшествие, что было так много работы, чтобы выяснить, как просто прочитать паршивый файл конфигурации по указанному точному пути, но спасибо. - person neminem; 12.03.2013
comment
Как вы используете полученный config.AppSettings["somekey"] (или config.AppSettings.Settings[]) без ошибок прав доступа? - person Brent Faust; 12.07.2013
comment
@Rubistro, вы должны проверить, существует ли элемент (иначе config.AppSettings[somekey] возвращает null), а затем использовать .Value - person Jedidja; 25.01.2014
comment
Брент, вот как использовать полученную конфигурацию без ошибок прав доступа: var settings = config.GetSection(SectionName) as AppSettingsSection; if (настройки != ноль) Console.Write(настройки.Настройки[ConfigName].Value); - person Koshera; 16.11.2016

Согласно http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/3943ec30-8be5-4f12-9667-3b812f711fc9 параметр представляет собой расположение исполняемого файла, а затем метод ищет конфигурацию, соответствующую этому exe (я думаю, имя параметра exePath теперь имеет смысл!).

person user9659    schedule 05.07.2009
comment
Обратите внимание, что вы можете передать любой путь к сборке, а не только exe. Итак, вы даете SomeLib.dll, он открывает SomeLib.dll.config. Это полезно, когда ваш проект .NET на самом деле является просто плагином для другого приложения, для которого вы не хотите развертывать .config рядом с его исполняемым файлом. - person Ludovic Chabant; 09.04.2010
comment
Тем не менее, когда я поместил файл с именем app.config в каталог dll, используя app в качестве параметра exePath, мне пришлось изменить имя файла на app, прежде чем он заработал... - person tobbenb3; 05.03.2014

Чтобы вообще избежать этой проблемы, вы можете прочитать файл конфигурации в виде 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;
person Francis Huang    schedule 14.03.2011
comment
Спасибо за способ XPath. Я использую ConfigurationManager уже около двух дней с Configuration.AppSettings.Settings.Count = 0. Ваш метод по крайней мере устанавливает правильное значение для меня. - person TamusJRoyce; 19.09.2011

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.

person Ron Hagerman    schedule 30.01.2012