2009-09-09 6 views
4

Я разрабатываю приложение Windows 3.5 для .NET 3.5. У меня есть два проекта: пользовательский интерфейс и библиотека.Сборочные настройки не загружаются во время выполнения

UI использует строго типизированные настройки, которые хранятся, как обычно, в файле app.config. Я прочитал их с использованием класса UI.Properties.Settings (сгенерированного Visual Studio).

В библиотеке используются собственные строго типизированные параметры (файл Settings.settings, который сбрасывается в файл Library.config).

Во время выполнения настройки библиотеки не перезагружаются из файла Library.config. Среда выполнения считывает только файл UI.config. Поэтому я застрял с настройками по умолчанию в сборке библиотеки и не могу предоставить значения после развертывания.

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

Я знаю, что могу использовать ConfigurationManager.AppSettings ["value"], и это будет прочитано из файла конфигурации приложения по умолчанию (UI.config), но что я могу сделать, если я хочу строго типизированные настройки (читайте с помощью класса Properties.Settings)?

Вызов Library.Properties.Settings.Default.Reload() не будет.

Спасибо.

ответ

5

Что вам нужно сделать, это объединить разделы конфигурации библиотеки с app.connfig. Слияние конфигурационных файлов выполняется путем добавления элементов внутри элемента конфигурации < configSections> для идентификации раздела конфигурации, а затем путем добавления элементов конфигурации внутри элемента конфигурации.

Пример слияния конфигурационных файлов:

App конфигурации:

<?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> 

Merged 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> 
+0

Да, спасибо, я попробовал такое же решение только с моим тестовым решением, и оно работает. Это не сложно, я должен вручную объединить файлы конфигурации, но я могу использовать сгенерированный класс для доступа к настройкам, что хорошо. Мне действительно не нравятся строки, такие как ConfigurationManager.AppSettings ["Цвет"]. –

+0

Ну, ваш ответ пришел раньше моего, поэтому я удалил свою. Еще раз спасибо! –

4

У вас может быть только один файл .config для AppDomain. Для приложения Windows Forms этот файл .config - это файл, который назван в честь исполняемого файла - это: UI.exe.config в вашем случае.

Это означает, что, хотя у вас может быть файл Library.dll.config, система конфигурации никогда не собирается его подбирать.

Вы должны объединить настройки конфигурации библиотеки в файл конфигурации приложения. Файлы конфигурации для библиотек не поддерживаются платформой .NET.

Еще лучше, перепроектируйте свою библиотеку, чтобы она не опиралась на файлы конфигурации, а использует Imperative Configuration.

+0

Спасибо, я проверю ваше сообщение. Один файл конфигурации оставляет мне проблему неспособности доступа к настройкам в библиотеке с использованием моего строго типизированного класса. –

+0

@Vasi: Как я уже упоминал выше, и, как показывает Pop Catalin, вы можете объединить свои настройки библиотеки в конфигурационный файл приложения. –

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