ConfigurationSection外部のapp.configファイルの構成からコピーを作成しようとしていますが、その最終目標は、実行中のアプリケーションの現在ロードされている構成にマージすることです。
目的は、個々のAppDomainにロードされた多数のライブラリが、実行中のアプリケーションから構成を受け取り、独自のapp.config設定をマージして、設定の読み取りがConfigurationManager.AppSettingsまたはへの単純な呼び出しになるようにすることConfigurationManager.GetSection()です。
私が遭遇している問題は、のクローンを作成することですConfigurationSection。
私が試したこと:
ConfigurationSectionClonerエンタープライズライブラリ内。Configuration externalConfig = ConfigurationManager.OpenExeConfiguration(externalLibPath); var section = externalConfig.GetSection("some.section"); ConfigurationSectionCloner sectionCloner = new ConfigurationSectionCloner(); section = sectionCloner.Clone(section); Configuration localConfig = ConfigurationManager.OpenExecConfiguration(ConfigurationUserLevel.None); localConfig.Sections.Add("some.section", section);- これは正常に実行されますが、両方とも
localConfig.GetSection("some.section")空ConfigurationManager.GetSection("some.section")です。 - (パラメーターの任意の組み合わせで)呼び出し
localConfig.Save()ても、セクションにはデータが入力されません。
- これは正常に実行されますが、両方とも
CompositeConfigurationSourceHandlerエンタープライズライブラリSystemConfigurationSource localConfig = new SystemConfigurationSource(); FileConfigurationSource externalConfig = new FileConfigurationSource(externalLibPath + ".config"); CompositeConfigurationSourceHandler ccsh = new CompositeConfigurationSourceHandler(externalConfig); ConfigurationSection section = externalConfig.GetSection("some.section"); if (!ccsh.CheckAddSection("some.section", section)) { try { localConfig.Add("some.section", section); } catch (Exception) { } }localConfig.add()これにより、という行に例外がスローされCannot add a ConfigurationSection that already belongs to the Configuration.ます。問題は、そのセクションlocalConfigがないことです。追加localConfig.Remove("some.section");しても解決しません。- また、オブジェクトのいくつかの組み合わせを試して
*ConfigurationSource、違いが生じるかどうかを確認しましたが、違いはありません。
ブロックから実際のApplicationSettingsをコピーすることappSettings、またはブロックからConnectionStringsをコピーすることはconnectionStrings、のような呼び出しでは非常にConfigurationManager.AppSettings.Set("some key", "some value");簡単ですが、ConfigurationSectionsではそれほど簡単ではないようです。
ConfigurationSectionある構成から別の構成にコピー、クローン作成、および/または単純にマージする方法はありますか?
ノート:
- 物理ファイルをマージしたくありません。すべては実行時に発生し、メモリ内にのみ残る必要があります。
- 各ConfigurationSectionを表すカスタムクラスを作成したくありません。セクションは一般的であり、実行中のアプリケーションには不明です。