0

Context : 私は同僚が使用するライブラリ ( InternalLibと呼びましょう) に取り組んでいますが、彼らの観点からは、それは外部アセンブリです。InternalLibでは、 ILMerge を使用してInternalLibにマージした外部ライブラリも使用する必要があります (これをExternalLibと呼びましょう)。

InternalLibExternalLibの両方で、app.config の構成を使用する必要があります。同僚がapp.config でInternalLibExternalLibconfigSections定義してリンクできることは知っていますが、別の構成ファイルから構成を読み取る方法はありますか? (たとえば、InternalLib.dll.config) 構成ファイルにn 個の構成セクションを追加するよう依頼するよりも、DLL と .config を提供したいと考えています。applicationSettings

を使用してInternalLibを変更して構成ファイルをConfigurationオブジェクトに読み込むことはできますが、 ExternalLibExeConfigurationFileMapがその構成をどこから取得するかを制御することはできません。つまり、ExternalLibの構成をオブジェクトに取得したとしても、 ExternalLibに、たとえば の代わりにそのオブジェクトを使用するように指示することはできません。ConfigurationSettings.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 に答える