0

上下文:我正在开发一个供同事使用的库(我们称之为InternalLib),但从他们的角度来看,它是一个外部程序集。在InternalLib中,我也需要使用一个外部库(我们称之为ExternalLib),我使用 ILMerge将其合并到InternalLib中。

InternalLibExternalLib都需要使用 app.config 中的配置。我知道我的同事可以在他们的 app.config 中为InternalLibExternalLibconfigSections定义和链接,但是有没有办法可以从不同的配置文件中读取配置?(例如,InternalLib.dll.config)我宁愿给他们一个 dll 和一个 .config,而不是要求他们在他们的配置文件中添加n 个配置部分。applicationSettings

我可以更改InternalLib以使用 将配置文件读入Configuration对象ExeConfigurationFileMap,但我无法控制ExternalLib从何处获取配置文件。我的意思是,即使我将ExternalLib的配置放入一个Configuration对象中,我也不能告诉ExternalLib使用该对象而不是,例如Settings.Default.[...],可以吗?

4

2 回答 2

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

进一步阅读

于 2013-10-29T14:18:16.560 回答
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);
        }
    }
}
于 2013-10-29T14:21:38.013 回答