OpenMappedExeConfiguration против OpenExeConfiguration

OpenExeConfiguration имеет 2 перегрузки:

OpenMappedExeConfiguration имеет только 1 прототип:

Кажется, что оба (2) и (3) могут использоваться для открытия определенного файла конфигурации, а не файла app.config по умолчанию.

Так какая разница между ними? Когда использовать какой?

Почему мы разделяем расположение UserLevel и Config File Location в (1) и (2), но объединяем их в (3)?

Спасибо за любые ответы.

Update

Я знаю, что Microsoft всегда любит делать что-то более чем одним способом. Но он должен сделать это не просто так. Любое тело знает причину в моем вопросе? Нужна ли нам щедрость?)?

Ответ 1

Разница объясняется в конечном .NET-ресурсе .NET - Cracking the Mysteries of.NET 2.0 Configuration:

OpenExeConfiguration (String)

добавит ".config" к имени файла вы предоставляете и загружаете Файл конфигурации. Это важно для обратите внимание, что OpenExeConfiguration (строка exePath) - очень вводящий в заблуждение метод, поскольку имя файла не обязательно должно быть имя файла .exe, которое является Бег [...] Предоставляя имя файла, отличное от EXE, альтернативный *.config файл можно открыть.

OpenExeConfiguration (ConfigurationUserLevel)

Второй метод, OpenExeConfiguration (ConfigurationUserLevel уровень) загрузит соответствующий файл конфигурации для указанного уровень конфигурации. конфигурация уровни, доступные в контексте Exe, вы можете указать, хотите ли вы exe, перемещающийся пользователь или локальный пользователь configuration [...] Помните, что конфигурация иерархическая и объединена. При запросе настроек роуминга или локального пользователя этот уровень вверх через machine.config объединяется, что приводит к полной конфигурации, доступной вашему приложению для данного уровня пользователя.

OpenMappedExeConfiguration(), OpenMappedMachineConfiguration()

В отличие от OpenExeConfiguration() методов, которые делают несколько предположения о том, где файлы конфигурации находятся, OpenMappedExeConfiguration() и OpenMappedMachineConfiguration() разрешает вы явно укажете, где *.config файлы находятся на диске. Используя эти методы, вы можете загрузить альтернативный machine.config, load Файлы User.config из местоположений по собственному выбору (в .NET Framework принимает решение о некоторых свернутый путь) и т.д. При доступе к machine.config, пользовательская версия не требуется, OpenMachineConfiguration() должен быть вместо этого используется.

Ответ 2

Разница между OpenExeConfiguration (String) и OpenMappedExeConfiguration (ExeConfigurationFileMap, ConfigurationUserLevel)) заключается в том, что сопоставленная версия позволит вам выбрать файл конфигурации, который вы хотите открыть, с помощью ExeConfigurationFileMap.

Если вы используете перегрузку OpenExeConfiguration(string), тогда она откроет конфигурацию, используя расположение конфигурации Machine and Exe, тогда как сопоставленная версия позволит вам выбрать конкретный файл, который вы хотите загрузить из любого места (очевидно, все еще соблюдая разрешения и т.д.).

Если вы посмотрите на источник, оба метода на самом деле вызывают один и тот же метод реализации:

public static System.Configuration.Configuration OpenMappedExeConfiguration(ExeConfigurationFileMap fileMap, ConfigurationUserLevel userLevel)
{
    return OpenExeConfigurationImpl(fileMap, false, userLevel, null);
}

public static System.Configuration.Configuration OpenExeConfiguration(string exePath)
{
    return OpenExeConfigurationImpl(null, false, ConfigurationUserLevel.None, exePath);
}

Итак, когда использовать один над другим? Используйте OpenMappedExeConfiguration, если вы не хотите открывать файл конфигурации по умолчанию. По моему опыту, единственный раз, когда я вызываю один из этих методов, - это когда я хочу прочитать конфигурацию, отличную от стандартной, поэтому я использовал только OpenMappedExeConfiguration.