Это действительно ошибка в ConfigurationManager.OpenExeConfiguration?

Документация для ConfigurationManager.OpenExeConfiguration(string exePath) состояния:

Открывает указанный файл конфигурации клиента как объект конфигурации.

Также говорится, что exePath это "Путь к исполняемому (exe) файлу"

Метод должен открыть *.exe.config файл для исполняемого файла по пути, указанному exePathи что ConfigurationErrorsException будет выброшено, если "Файл конфигурации не может быть загружен.".

В следующем коде используется путь к неисполняемому файлу, а каталог этого пути не содержит файлов *.exe.config. Тем не менее код выполняется без каких-либо исключений и других признаков недопустимого аргумента.

var configs = Directory.GetFiles("C:\\NoConfig", "*.config");
Debug.Assert(configs.Length == 0);
File.WriteAllText("C:\\NoConfig\\notes.txt", "This is not an executable, and there is no .config file in its folder.");
var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt");
Debug.Assert(config != null);

Тем не менее, теперь он постепенно станет устаревшим для новой конфигурации на основе.NET Core JSON и не будет ни пересматриваться, ни исправляться.

Итак, это из-за ошибки в этой перегрузке OpenExeConfiguration метод?

Я просто хотел 2-го и n- го мнения, прежде чем я поднял его на MS Connect. И Connect не работает в данный момент.

ДОБАВЛЕНО: если я позвоню OpenExeConfiguration с действительным exePath, к реальному исполняемому (проверенному), с действительным .config файл, то он читает, но не анализирует файл. Я должен запросить XML для appSettings раздел и разобрать его сам, используя обходной путь из этого ответа к AppSettings из пользовательских файлов. Это добавляет к моему подозрению, что этот код обычно не используется в этом режиме, был принят как работающий и не проверен, и поэтому может содержать ошибки.

Я уверен, что он получит ограниченное внимание благодаря новому API конфигурации.NET Core, заменившему старый XML только одним.

2 ответа

Решение

Итак, у вас есть две проблемы, как я понимаю:

  1. OpenExeConfiguration не завершается ошибкой для файлов с расширениями, отличными от "exe".

  2. OpenExeConfiguration не завершится ошибкой, если файл конфигурации еще не существует.

Я понимаю оба момента, но я бы сказал, что оба они спорны.

  1. Исполняемый файл не обязательно означает файл с расширением.exe. Да, для Windows это обычно так, но давайте возьмем, например, Linux (и мы можем сделать это, потому что.NET не ограничивается только Windows). Я могу иметь исполняемый файл.NET с любым расширением (даже notes.txt) или вообще без расширения, это не имеет значения. Я могу с радостью выполнить этот файл с помощью "mono notes.txt", и он будет работать как обычно.

  2. Несуществующий файл конфигурации не является исключительным условием для Configuration объект. У него даже есть свойство с именем HasFile который указывает, существует ли этот файл или нет. Я могу сделать следующее с вашим кодом:

    var config = ConfigurationManager.OpenExeConfiguration("c:\\notes.txt"); 
    // config.HasFile == false here
    config.AppSettings.Settings.Add("test", "test");
    config.Save(ConfigurationSaveMode.Full, true);
    // config.HasFile == true here, and file is written to disk
    

Не уверен, можно ли это назвать ошибкой или нет, но

Согласно этой ссылке

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

Это также дает обходной путь -

ExeConfigurationFileMap map = new ExeConfigurationFileMap { ExeConfigFilename = "EXECONFIG_PATH" };
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
Другие вопросы по тегам