Сохранение пользовательских настроек библиотеки классов в winforms .Net 3.5 SP1 - PullRequest
1 голос
/ 08 июля 2010

Некоторое время назад я написал свой собственный поставщик настроек, потому что у меня были проблемы с сохранением настроек в библиотеке классов. (Примечание - у меня не было проблем с сохранением настроек из приложения).

Сегодня я только что проверил сохраняющиеся настройки библиотеки классов, и она работала без моего специального провайдера. Тест это:

(1) Создать библиотеку классов
(2) Добавить настройку - «Имя»
(3) Добавьте класс с общедоступным общим свойством «Имя», который читает и записывает параметр «Имя».
(4) Создайте приложение, которое ссылается на библиотеку классов, и используйте свойство shared для чтения и записи параметра «Имя».

Я уверен, что до того, как настройка «Имя» сохранится, пока приложение открыто, но после того, как я закрою его и снова открою, настройка вернется к значению по умолчанию. Этого сейчас не происходит, и я хотел бы быть уверен, что раньше я был идиотом, а не идиотом.

Является ли поведение, которое я сейчас получаю, ожидаемым?

ETA: я заметил, что в первый раз, когда я создаю тестовое приложение, изменяю настройку, закрываю и снова открываю, настройка не сохраняется. Впоследствии это так. Может быть, я сдался после одной попытки раньше. Есть идеи, почему это не сохранилось в первый раз?

ETA2: Например, у меня есть библиотека классов с именем «MyLibrary» и тестовое приложение с именем «MyApp». Я выполняю шаги 1-4, приведенные выше, и ниже приводится содержимое файла user.config, который находится в C: \ Documents and Settings \ Имя пользователя \ Локальные настройки \ Application Data \ MyApp \ MyApp.vshost.exe_Url_vi5gjcooahbdm2ma3dcay0mkexu2suul \ 1.0.0.0. Примечание: я не трогал настройки в MyApp; -

<configuration>
<configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral >
        <section name="MyLibrary.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
</configSections>
<userSettings>
    <MyLibrary.My.MySettings>
        <setting name="Name" serializeAs="String">
            <value>New changed value</value>
        </setting>
    </MyLibrary.My.MySettings>
</userSettings>

1 Ответ

1 голос
/ 24 января 2012

Я бы порекомендовал изучить сериализацию XML .NET. Это работает очень хорошо, и я использую его почти для всех своих вещей хранения настроек.

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

public class Settings
{
    public Settings() { }

    public string MySetting { get; set; }
}

А затем из вашего приложения используйте функцию, подобную этой, чтобы сериализовать ее в файл XML:

public static string Serialize<T>(T item) where T:class
{
    try
    {
        XmlSerializer serial = new XmlSerializer(typeof(T));
        StringBuilder sb = new StringBuilder();
        StringWriter writer = new StringWriter(sb);
        serial.Serialize(writer, item);
        writer.Close();
        return sb.ToString();
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to serialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return "Failed to serialize";
    }
}

и подобная функция для десериализации файла XML в ваш класс настроек:

public static T Deserialize<T>(string FilePath) where T : class
{
    try
    {
        XmlSerializer xml = new XmlSerializer(typeof(T));
        FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
        XmlSerializer xml = new XmlSerializer(typeof(T));
                T res = (T)xml.Deserialize(fs);
        fs.Close();
        return res;
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to deserialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return default(T);
    }
}

Удачи, и надеюсь, что это поможет вам

...