程序集特定设置未在运行时加载
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 在他的回答中所展示的那样,您可以将库设置合并到应用程序配置文件中。以上是关于程序集特定设置未在运行时加载的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序未在管理博览会的情况下运行时,在通知上设置应用程序图标徽章编号