Как поступить, используя несколько классов .settings из библиотеки классов?

Наличие двух проектов: один представляет собой библиотеку классов (сборка .dll), а другой — графический интерфейс (.exe), использующий библиотеку классов.

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

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

Я пытаюсь получить настройки MyLib.dll.config из приложения с графическим интерфейсом, но пока это не работает. Я пытался сделать классы .settings общедоступными, но безуспешно.

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

Примечание. Я не хочу вручную добавлять записи из MyLib.dll.config в 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, содержащая два раздела.


person Stécy    schedule 28.09.2009    source источник


Ответы (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; }
        }
    }
}

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

person csharptest.net    schedule 28.09.2009
comment
Отличная идея, но, похоже, это ошибка с DllConfig.AppSettings[propertyName], поскольку компилятор этого не позволяет. Вместо этого я попробовал DllConfig.AppSettings.Settings и все еще не работает. Я даже пытался использовать DllConfig.AppSettings.Properties, но он объявлен как защищенный внутренний... - person Stécy; 28.09.2009
comment
Извините за это, я обновил эту реализацию [string], чтобы она действительно компилировалась, но пока она еще не проверена... но должно работать. - person csharptest.net; 29.09.2009

В общем, настройки конфига должны принадлежать приложению, а не компоненту.

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

person Michael Maddox    schedule 28.09.2009