Параметры сборки не загружаются во время выполнения

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

Пользовательский интерфейс использует строго типизированные настройки, которые, как обычно, хранятся в файле 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() этого не сделает.

Спасибо.


person Vasile Tomoiaga    schedule 09.09.2009    source источник


Ответы (2)


Что вам нужно сделать, так это объединить разделы конфигурации вашей библиотеки с app.connfig. Для объединения файлов конфигурации сначала нужно добавить элементы внутри ‹configSections> config. element, чтобы идентифицировать раздел конфигурации, а затем путем добавления элементов конфигурации внутри элемента конфигурации.

Пример объединения файлов конфигурации:

Конфигурация приложения:

<?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>
person Pop Catalin    schedule 09.09.2009
comment
Да, спасибо, я только что попробовал то же решение с моим тестовым решением, и оно работает. Это не сложно, мне нужно вручную объединить файлы конфигурации, но я могу использовать сгенерированный класс для доступа к настройкам, и это хорошо. Мне очень не нравится использовать такие строки, как ConfigurationManager.AppSettings [Color]. - person Vasile Tomoiaga; 09.09.2009
comment
Ваш ответ пришел раньше моего, поэтому я удалил свой. Еще раз спасибо! - person Vasile Tomoiaga; 09.09.2009

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

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

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

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

person Mark Seemann    schedule 09.09.2009
comment
Спасибо, проверю ваш пост. Один файл конфигурации оставляет мне проблему, заключающуюся в том, что я не могу получить доступ к настройкам в библиотеке, используя мой строго типизированный класс. - person Vasile Tomoiaga; 09.09.2009
comment
@Vasi: Как я уже упоминал выше, и как Pop Catalin демонстрирует в своем ответе, вы можете объединить настройки вашей библиотеки в файл конфигурации приложения. - person Mark Seemann; 09.09.2009