程序集特定设置未在运行时加载

Posted

技术标签:

【中文标题】程序集特定设置未在运行时加载【英文标题】: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() 不会这样做。

谢谢。

【问题讨论】:

【参考方案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 在他的回答中所展示的那样,您可以将库设置合并到应用程序配置文件中。

以上是关于程序集特定设置未在运行时加载的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序未在管理博览会的情况下运行时,在通知上设置应用程序图标徽章编号

在运行时加载、使用和卸载程序集

.net 在运行时重新加载程序集

java.nio.Buffer 未在运行时加载 clear() 方法

在运行时加载 2 个版本的程序集

应用程序未在 ipad 中运行