如何从配置文件中读取配置文件到强类型的Settings对象

时间:2013-10-29 14:12:33

标签: c# app-config .net-4.5 configuration-files

上下文:我正在开发一个库(让我们称之为 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.[...],我可以吗?

2 个答案:

答案 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);
    }

Further reading

答案 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);
        }
    }
}