我试图从外部app.config文件与合并成执行应用程序的当前加载配置的最终目标配置做出ConfigurationSection
的副本。克隆一个通用的ConfigurationSection没有自定义类
的目的是为了让众多的图书馆,装入个人的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
对象的组合,看看他们是否有所作为,但没有。
- 这将引发对
复制从appSettings
块实际的applicationSettings,甚至的ConnectionStrings从connectionStrings
块是超级简单的用一个调用,如ConfigurationManager.AppSettings.Set("some key", "some value");
但它似乎并没有与ConfigurationSections容易。
有没有办法复制,克隆和/或只是简单地将ConfigurationSection
从一个配置合并到另一个配置?
注:
- 我不想合并物理文件。一切都应该在运行时发生,并且只保留在内存中。
- 我不想编写自定义类来表示每个ConfigurationSection。这些部分将是通用的,对于正在执行的应用程序是未知的
在重新审视之后,上述所有(EnterpriseLibrary)都相当过度膨胀,可以用简单的XML合并工具完成(然后使用'SetRawXml()'方法) – newfurniturey 2013-12-16 21:27:09
我使用Entlib 6和那里不需要明确地检索和设置sectionInformation,只需调用Clone()。 – Legends 2015-05-03 16:43:57