2009-09-28 3 views
0

Имея два проекта: один представляет собой библиотеку классов (сборку .dll), а другой - графический интерфейс (.exe) с использованием библиотеки классов.Использование нескольких классов .settings из библиотеки классов, как действовать?

В библиотеке классов я добавил два файла .settings (который автоматически добавляет файл app.config в проект), используя все настройки «приложения». Когда я компилирую проект, я получаю файл MyLib.dll.config в выходном каталоге.

Теперь, для проекта GUI, я ссылаюсь на библиотеку классов и вручную копирую MyLib.dll.config в папку bin \ debug (и release).

Я пытаюсь получить настройки MyLib.dll.config из приложения GUI, но пока он не работает. Я пробовал иметь классы .settings для публики, но я не увенчался успехом.

Я читал о методе OpenMappedExeConfiguration(), но я не могу найти параметры в возвращаемом конфиге. Кроме того, как я могу заставить классы .settings использовать конфигурацию, возвращаемую OpenMappedExeConfiguration?

Примечание: Я не хочу вручную добавлять записи из MyLib.dll.config в app.config приложения GUI, поскольку эти записи вообще не принадлежат.


Дополнительные примечания:

.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, который содержит две секции.

ответ

1

Предположим, что ваш проект DLL есть что-то подобное в \ Свойства \ 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; } 
     } 
    } 
} 

Больше «взломать» решение, я не знаю, как правильно, но оно будет работать.

+0

Отличная идея, но кажется, что это ошибка с DllConfig.AppSettings [propertyName], поскольку компилятор не разрешает это. Я попробовал DllConfig.AppSettings.Settings и все еще не работал. Я даже пытался использовать DllConfig.AppSettings.Properties, но он объявлен как защищенный внутренний ... –

+0

К сожалению, я обновил эту реализацию [string], чтобы фактически скомпилировать, но она по-прежнему не проверена, так как это происходит ... но * should * Работа. –

0

Как правило, настройки конфигурации должны принадлежать приложению, а не компоненту.

При этом компонент должен иметь возможность считывать собственные настройки, поэтому добавьте метод к компоненту, который считывает параметры, а затем вызывает этот метод из приложения.

Смежные вопросы