web-dev-qa-db-ja.com

.Net2.0のsectionGroupapplicationSettingsですべてのセクションを名前で取得する方法

これが私が持っていたアイデアです:

小さな実行可能ファイルに、sectionGroup「applicationSettings」の下にある複数のセクションを持つapp.configファイルが必要です(「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セクションを定義する場合、アプリケーションにそのアセンブリをロードさせます。セクションが定義されていない場合は、モジュールをロードしないでください。これは、1つのモジュールだけでなく、まだ定義されていない数のモジュールにも当てはまります。

したがって、基本的に、実行時に定義されたセクションについて調べる必要があります。どうすればいいですか?

さらに、これを.NET 2.0との下位互換性のあるポータブル実行可能ファイル(= Monoでも実行する必要があります)にしたいと思います。

GitHubでプロジェクトを見るのは興味深いかもしれません(現在は このコミット )。

13
HaMster

ConfigurationManager.OpenExeConfiguration 関数を見て、構成ファイルにロードします。

次に、System.Configuration.Configurationから取得する ConfigurationManager.OpenExeConfiguration クラスで、SectionGroupsプロパティを確認します。 ConfigurationSectionGroupCollection が返され、そこにapplicationSettingsセクションがあります。

ConfigurationSectionGroupCollectionには、SectionsおよびExecutableFirstModule オブジェクトを含むConfigurationSectionプロパティがあります。

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

nullオブジェクトまたはConfigurationSectionGroupCollectionオブジェクトを取得した後、ConfigurationSectionを確認する必要があります。 nullの場合、構成ファイルには存在しません。

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;
}
23
JG in SD