これが私が持っていたアイデアです:
小さな実行可能ファイルに、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でプロジェクトを見るのは興味深いかもしれません(現在は このコミット )。
ConfigurationManager.OpenExeConfiguration
関数を見て、構成ファイルにロードします。
次に、System.Configuration.Configuration
から取得する 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
を確認する必要があります。 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;
}