上下文:我正在开发一个库(让我们称之为 InternalLib )供同事使用,但从他们的角度来看,它是一个外部程序集。在 InternalLib 中,我也需要使用外部库(让我们称之为 ExternalLib ),我使用ILMerge将其合并到 InternalLib 。
InternalLib 和 ExternalLib 都需要使用app.config中的配置。我知道我的同事可以在他们的app.config中为 InternalLib 和 ExternalLib 定义configSections
并链接applicationSettings
,但是否有办法我可以从不同的配置文件读取配置吗?(例如,InternalLib.dll.config)我宁愿给他们一个dll和.config而不是要求他们添加 n 将部分配置到其配置文件中。
我可以使用Configuration
更改 InternalLib 以将配置文件读入ExeConfigurationFileMap
对象,但我无法控制 ExternalLib 获取的位置它的配置来自。我的意思是即使我将 ExternalLib 的配置转换为Configuration
对象,我也无法告诉 ExternalLib 使用该对象而不是,例如, Settings.Default.[...]
,我可以吗?
答案 0 :(得分:1)
您可以使用以下内容更改项目使用的配置文件:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", AppDomain.CurrentDomain.BaseDirectory + confFolder + "app.config");
如果需要,稍后重置
private void ResetConfigMechanism()
{
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
}
答案 1 :(得分:0)
您可以使用XmlSerializer,例如(简化,无错误处理等):
public class Config<T> where T : class
{
public static T Load()
{
using (var reader = new StreamReader("config.xml"))
{
return (T)(new XmlSerializer(typeof(T))).Deserialize(reader);
}
}
}