Как получить все разделы по названию в разделе Group Application Settings в .Net 2.0

Вот идея, которая у меня возникла:

Я хочу, чтобы у небольшого исполняемого файла был файл app.config с несколькими разделами, расположенными в разделе sectionGroup «applicationSettings» (не «appSettings», мне не нужно писать в файл). У каждого раздела будет имя, соответствующее модулю, который должен быть загружен, если он установлен.

Вот пример:

   <configuration>
     <configSections>
       <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
         <section name="Executable" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
         <section name="FirstModule" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
       </sectionGroup>
     </configSections>
     <applicationSettings>
       <Executable>
         <setting name="MyFirstSetting" serializeAs="String">
           <value>My awesome feature setting</value>
         </setting>
       </Executable>
       <FirstModule path="path to the modules assembly">
         <setting name="ImportantSettingToTheModule" serializeAs="String">
           <value>Some important string</value>
         </setting>
       </FirstModule>
     </applicationSettings>
   </configuration>

Теперь, если я определю раздел FirstModule, я хочу, чтобы мое приложение загрузило свою сборку. Если раздел не определен, модуль не должен загружаться. Это должно быть верно не только для одного модуля, но и для еще не определенного их количества.

Поэтому мне в основном нужно узнать об определенных разделах во время выполнения. Как бы я это сделал?

Вдобавок я хочу, чтобы это стало переносимым исполняемым файлом (= он также должен работать на Mono), обратно совместимым с .NET 2.0.

Было бы интересно взглянуть на проект на GitHub (в настоящее время это этот коммит).


person HaMster    schedule 19.02.2013    source источник


Ответы (1)


Взгляните на _ 1_ для загрузки в файл конфигурации.

Затем на _ 2_, который вы вернетесь из ConfigurationManager.OpenExeConfiguration, вы захотите посмотреть на свойство SectionGroups. Это вернет ConfigurationSectionGroupCollection, в котором вы ' найду раздел applicationSettings.

В ConfigurationSectionGroupCollection будет свойство Sections, которое содержит Executable и FirstModule ConfigurationSection объектов.

var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable);
var applicationSettingSectionGroup = config.SectionGroups["applicationSettings"];
var executableSection = applicationSettingSectionGroup.Sections["Executable"];
var firstModuleSection = applicationSettingSectionGroup.Sections["FirstModule"];

Вы захотите проверить null после получения объекта ConfigurationSectionGroupCollection или ConfigurationSection. Если они равны нулю, они не существуют в файле конфигурации.

Вы также можете получить разделы, используя _16 _

var executableSection = (ClientSettingsSection)ConfigurationManager
    .GetSection("applicationSettings/Executable");
var firstModuleSection = (ClientSettingsSection)ConfigurationManager
    .GetSection("applicationSettings/FirstModule");

Опять же, если объекты null, они не существуют в файле конфигурации.

Чтобы получить список всех названий разделов и групп, вы можете:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// use the line below instead if you want to load an app.config for a
//   different application other than the one the code is running in
// var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable);

var names = new List<string>();
foreach (ConfigurationSectionGroup csg in config.SectionGroups)
    names.AddRange(GetNames(csg));

foreach (ConfigurationSection cs in config.Sections)
    names.Add(cs.SectionInformation.SectionName);

private static List<string> GetNames(ConfigurationSectionGroup configSectionGroup)
{
    var names = new List<string>();

    foreach (ConfigurationSectionGroup csg in configSectionGroup.SectionGroups)
        names.AddRange(GetNames(csg));

    foreach(ConfigurationSection cs in configSectionGroup.Sections)
        names.Add(configSectionGroup.SectionGroupName + "/" + cs.SectionInformation.SectionName);

    return names;
}
person JG in SD    schedule 19.02.2013
comment
Это очень помогло, большое вам спасибо. Я бы дал два голоса за прямую ссылку на мой пример, но я не могу ... :( - person HaMster; 19.02.2013
comment
Нет проблем, рад помочь, возможно, вы захотите увидеть мою последнюю правку. Я включил некоторую информацию о ConfigurationManager.GetSection. Что, если вам не нужно выполнять какие-либо другие действия с файлом конфигурации, обычно является предпочтительным способом доступа к файлу конфигурации. - person JG in SD; 20.02.2013
comment
Конфигурация config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None); - откроется конфигурация текущего приложения. не нужно знать путь к exe. - person timothy; 12.09.2014
comment
Спасибо @timothy! Отличный совет ... избавил меня от многих поисков. - person Phil Nicholas; 22.09.2016