Это действительно ошибка в 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 ответа
Итак, у вас есть две проблемы, как я понимаю:
OpenExeConfiguration не завершается ошибкой для файлов с расширениями, отличными от "exe".
OpenExeConfiguration не завершится ошибкой, если файл конфигурации еще не существует.
Я понимаю оба момента, но я бы сказал, что оба они спорны.
Исполняемый файл не обязательно означает файл с расширением.exe. Да, для Windows это обычно так, но давайте возьмем, например, Linux (и мы можем сделать это, потому что.NET не ограничивается только Windows). Я могу иметь исполняемый файл.NET с любым расширением (даже notes.txt) или вообще без расширения, это не имеет значения. Я могу с радостью выполнить этот файл с помощью "mono notes.txt", и он будет работать как обычно.
Несуществующий файл конфигурации не является исключительным условием для
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);