【问题标题】:Assembly specific settings not loading at runtime程序集特定设置未在运行时加载
【发布时间】:2010-11-26 19:47:13
【问题描述】:

我正在开发一个 .NET 3.5 Windows 窗体应用程序。我有两个项目,UI 和一个库。

UI 使用强类型设置,通常存储在 app.config 文件中。我使用 UI.Properties.Settings 类(由 Visual Studio 生成)阅读它们。

Library 使用自己的强类型设置(转储到 Library.config 文件中的 Settings.settings 文件)。

在运行时,库设置不会从 Library.config 文件中重新加载。运行时仅读取 UI.config 文件。所以我被库程序集中的默认设置卡住了,部署后无法提供值。

总结一下:对于不是主要可执行文件的应用程序集,在程序集加载时不会读取设置。

我知道我可以使用 ConfigurationManager.AppSettings["value"] 这将从默认应用程序配置文件 (UI.config) 中读取,但如果我想要强类型设置(使用 Properties.Settings 类读取)我该怎么办?

拨打Library.Properties.Settings.Default.Reload() 不会这样做。

谢谢。

【问题讨论】:

    标签: c# .net settings app-config


    【解决方案1】:

    您需要做的是将您的库配置部分合并到 app.config。合并配置文件的方法是首先在 configSections> 配置元素中添加元素,以标识配置部分,然后在配置元素中添加配置元素。

    合并配置文件示例:

    应用配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="CA3.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <CA3.Settings>
                <setting name="Setting" serializeAs="String">
                    <value>2</value>
                </setting>
            </CA3.Settings>
        </userSettings>
    </configuration>
    

    库配置:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="CA3.Library" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <CA3.Library>
                <setting name="Setting" serializeAs="String">
                    <value>1</value>
                </setting>
            </CA3.Library>
        </userSettings>
    </configuration>
    

    合并的 app.config 包含库和应用配置。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="CA3.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
                <section name="CA3.Library" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <CA3.Settings>
                <setting name="Setting" serializeAs="String">
                    <value>2</value>
                </setting>
            </CA3.Settings>
            <CA3.Library>
                <setting name="Setting" serializeAs="String">
                    <value>1</value>
                </setting>
            </CA3.Library>
        </userSettings>
    </configuration>
    

    【讨论】:

    • 是的,谢谢,我刚才用我的测试解决方案尝试了相同的解决方案,它可以工作。这不是直截了当的,我必须手动合并配置文件,但我可以使用生成的类来访问设置,这很好。我真的不喜欢使用像 ConfigurationManager.AppSettings["Color"] 这样的字符串。
    • 嗯,你的答案比我的早,所以我删除了我的。再次感谢!
    【解决方案2】:

    每个 AppDomain 只能有一个 .config 文件。对于 Windows 窗体应用程序,该 .config 文件是以可执行文件命名的文件 - 在您的情况下为 UI.exe.config。

    这意味着虽然您可能拥有 Library.dll.config 文件,但配置系统永远不会选择它。

    您应该将库的配置设置合并到应用程序配置文件中。 .NET 框架不支持库的配置文件。

    更好的是,重新设计您的库,使其不依赖于配置文件,而是使用Imperative Configuration

    【讨论】:

    • 谢谢,我会检查你的帖子。一个配置文件让我无法使用我的强类型类访问库中的设置。
    • @Vasi:正如我上面提到的,正如 Pop Catalin 在他的回答中所展示的那样,您可以将库设置合并到应用程序配置文件中。
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2023-03-23
    相关资源
    最近更新 更多