【问题标题】:Using multiple .settings classes from a class library, how to proceed?使用类库中的多个 .settings 类,如何进行?
【发布时间】:2010-12-02 01:47:12
【问题描述】:

有两个项目:一个是类库(.dll 程序集),另一个是使用类库的 GUI (.exe)。

在类库中,我使用所有“应用程序”设置添加了两个 .settings 文件(它会自动将 app.config 文件添加到项目中)。当我编译项目时,我有效地在输出目录中获得了 MyLib.dll.config 文件。

现在,对于 GUI 项目,我引用类库并手动将 MyLib.dll.config 复制到 bin\debug(和发布)文件夹。

我正在尝试从 GUI 应用程序中获取 MyLib.dll.config 设置,但到目前为止它无法正常工作。我尝试将 .settings 类设置为 public,但没有成功。

我已阅读有关 OpenMappedExeConfiguration() 方法的信息,但我似乎无法在返回的配置中找到设置。此外,我将如何强制 .settings 类使用 OpenMappedExeConfiguration 返回的配置?

注意:我不想手动将 MyLib.dll.config 中的条目添加到 GUI 应用程序的 app.config 中,因为这些条目根本不属于那里。


补充说明:

我拥有的 .config 文件是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="TestAssembly.ItemClass" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
            <section name="TestAssembly.Entity" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <TestAssembly.ItemClass>
            <setting name="Job" serializeAs="String">
                <value>TrussPlant.Job</value>
            </setting>
            <setting name="Family" serializeAs="String">
                <value>TrussPlant.Family</value>
            </setting>
        </TestAssembly.ItemClass>
        <TestAssembly.Entity>
            <setting name="TrussClassifier" serializeAs="String">
                <value>TrussPlant.Classifier</value>
            </setting>
            <setting name="TrussComposer" serializeAs="String">
                <value>TrussPlant.Composer</value>
            </setting>
        </TestAssembly.Entity>
    </applicationSettings>
</configuration>

请注意,有一个 SectionGroup 包含两个部分。

【问题讨论】:

    标签: .net-3.5 configuration c#-3.0 configuration-files


    【解决方案1】:

    一般来说,配置设置应该属于应用程序,而不是组件。

    也就是说,组件应该能够读取自己的设置,因此向组件添加一个读取设置的方法,然后从应用程序调用该方法。

    【讨论】:

      【解决方案2】:

      假设您的 DLL 项目在 .\Properties\Settings.Designer.cs 中有类似的内容:

      namespace _SampleApplication.Properties {
      [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
      [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
      internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
      ...
      

      然后您可以使用以下代码将其添加到您的 DLL 项目中的另一个文件中:

      namespace _SampleApplication.Properties {
          partial class Settings
          {
              static System.Configuration.Configuration _config = null;
      
              private System.Configuration.Configuration DllConfig
              {
                  get
                  {
                      return _config != null ? _config : 
                          _config = System.Configuration.ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location);
                  }
              }   
      
              public override object this[string propertyName]
              {
                  get { return DllConfig.AppSettings.Settings[propertyName].Value; }
                  set { DllConfig.AppSettings.Settings[propertyName].Value = value as string; }
              }
          }
      }
      

      更多的是“hack”解决方案,我不知道如何正确操作,但它会起作用。

      【讨论】:

      • 好主意,但 DllConfig.AppSettings[propertyName] 似乎是一个错误,因为编译器不允许这样做。我尝试了 DllConfig.AppSettings.Settings ,但仍然无法正常工作。我什至尝试使用 DllConfig.AppSettings.Properties 但它被声明为受保护的内部...
      • 抱歉,我已经更新了这个 [string] 实现以实际编译,但它仍然未经测试......但 应该 工作。
      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 2017-11-29
      • 2021-02-17
      • 2020-06-26
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多