делиться доступными для записи настройками между пользователями - PullRequest
2 голосов
/ 12 февраля 2012

Я хотел бы использовать конструктор / среду настроек .NET для создания настроек приложения во время разработки, чтобы эти настройки были доступны для записи приложению во время выполнения. Кажется, из коробки я не могу создать параметры, которые могут быть изменены приложением и которые будут прочитаны всеми пользователями при запуске приложения?

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

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

1 Ответ

1 голос
/ 13 февраля 2012

Вот как я это сделал.Теперь все, что мне нужно знать, - это если мне нужно реализовать IApplicationSettingsProvider для успешной миграции настроек между версиями?Рецензии и комментарии приветствуются!

using System.Collections.Generic;
using System.Configuration;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.IO.IsolatedStorage;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace NetworkManager
{
    class IsolatedStorageSettingsProvider : SettingsProvider
    {
        public IsolatedStorageSettingsProvider()
        {

        }

        public override string ApplicationName
        {
            get { return Application.ProductName; }
            set { }
        }

        public override void Initialize(string name, NameValueCollection col)
        {
            base.Initialize(this.ApplicationName, col);
        }

        // SetPropertyValue is invoked when ApplicationSettingsBase.Save is called
        // ASB makes sure to pass each provider only the values marked for that provider -
        // though in this sample, since the entire settings class was marked with a SettingsProvider
        // attribute, all settings in that class map to this provider
        public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propvals)
        {
            // Iterate through the settings to be stored
            // Only IsDirty=true properties should be included in propvals
            foreach (SettingsPropertyValue propval in propvals)
            {

                SetSettingValue(propval.Name, propval.SerializedValue);
            }
        }

        public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection props)
        {

            // Create new collection of values
            SettingsPropertyValueCollection values = new SettingsPropertyValueCollection();

            // Iterate through the settings to be retrieved
            foreach (SettingsProperty setting in props)
            {
                SettingsPropertyValue value = new SettingsPropertyValue(setting);
                value.IsDirty = false;
                value.SerializedValue = GetSettingValue(setting);
                values.Add(value);
            }
            return values;
        }

        private IsolatedStorageFile GetStore()
        {
            return IsolatedStorageFile.GetStore( IsolatedStorageScope.Machine | IsolatedStorageScope.Assembly | IsolatedStorageScope.Domain, null, null);
        }

        private object GetSettingValue(SettingsProperty setting)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            var settings = new Dictionary<string, object>();
            var store = GetStore();
            using (var stream = store.OpenFile("settings.cfg", FileMode.OpenOrCreate, FileAccess.Read))
            {
                if (stream.Length > 0) settings = (Dictionary<string, object>)formatter.Deserialize(stream);
            }
            return (settings.ContainsKey(setting.Name)) ? settings[setting.Name] : null;
        }

        private void SetSettingValue(string name, object value)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            var settings = new Dictionary<string, object>();
            var store = GetStore();
            using (var stream = store.OpenFile("settings.cfg", FileMode.OpenOrCreate, FileAccess.Read))
            {
                if (stream.Length > 0) settings = (Dictionary<string, object>)formatter.Deserialize(stream);
            }
            settings[name] = value;
            using (var stream = store.OpenFile("settings.cfg", FileMode.OpenOrCreate, FileAccess.Write))
            {
                formatter.Serialize(stream, settings);
            }
            return ;
        }

    }
}
...