2013-02-19 3 views
10

Вот идея, которую я имел:Как получить все разделы по имени в sectionGroup applicationSettings в .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 (в настоящее время this commit).

ответ

21

Посмотрите на функцию ConfigurationManager.OpenExeConfiguration для загрузки в конфигурационный файл.

После этого на System.Configuration.Configuration классе, что вы вернетесь с ConfigurationManager.OpenExeConfiguration, вы захотите посмотреть на имущество SectionGroups. Это вернет ConfigurationSectionGroupCollection, в котором вы найдете раздел applicationSettings.

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

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

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

Вы также можете получить разделы с помощью ConfigurationManager.GetSection

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

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

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

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; 
} 
+0

Это помогло, спасибо очень много. Я бы дал два upvotes для прямого обращения к моему примеру, но я не могу ... :( – HaMster

+0

Без проблем, рад помочь, вы можете захотеть увидеть мое последнее редактирование. Я включил некоторую информацию о 'ConfigurationManager.GetSection'. Который, если вам не нужно выполнять какие-либо другие действия в файле конфигурации, обычно является предпочтительным способом для доступа к файлу конфигурации. –

+6

Конфигурация config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None); - это откроет конфигурацию для текущего не нужно знать путь EXE. – timothy