Нужно ли выводить из ConfigurationSection для поддержки пользовательских настроек? - PullRequest
3 голосов
/ 06 мая 2009

Я играю с поддержкой конфигурации .NET (класс ConfigurationManager и связанные классы поддержки). Я хотел бы написать приложение, которое после установки:

  • Имеет настройки по умолчанию в файле foo.exe.config (в программных файлах).
  • Пользователь может позднее переопределить настройки значениями по умолчанию, которые следует сохранить.
  • Предпочтения пользователя должны быть сохранены в профиле пользователя, поскольку у него не должно быть разрешений на запись в каталог Program Files.

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

Кажется, это должно быть легко - это очень распространенная модель. Но мои попытки это наталкиваются на неприятности, и мне интересно, правильно ли я подхожу.

Следующий код создает исключительную ситуацию во время выполнения «Свойства ConfigurationSection нельзя редактировать, если они заблокированы».

using System;
using System.Configuration;

namespace DemoAppSettingsProblem
{
    class Program
    {
        static void Main(string[] args)
        {
            Configuration userConfig =
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            if ( userConfig.AppSettings.Settings["foo"] != null )
                userConfig.AppSettings.Settings.Remove("foo");

            userConfig.AppSettings.Settings.Add("foo", "The string is foo.");

            userConfig.Save(ConfigurationSaveMode.Modified);    // exception!
        }
    }
}

Проблема в том, что определенный в * .NET раздел <appSettings> объявлен со значением по умолчанию allowExeDefinition=MachineToApplication (см. Этот хороший пост от Microsoft Ирены Кеннеди). Это запрещает запись раздела в профиль пользователя (локальный или в роуминге).

Итак, я предполагаю, что мне нужно определить свой собственный раздел с allowExeDefinition=MachineToLocalUser. Но, насколько я могу судить из документов MSDN, это означает, что мне нужно создать свой собственный класс конфигурации, производный от ConfigurationSection. Приведенные здесь примеры указывают мне на большую работу, чем я ожидал, что обычно вызывает тревогу, что я делаю что-то не так.

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

Ответы [ 2 ]

2 голосов
/ 07 мая 2009

Я использовал функцию настроек, она записывает настройки пользователя в конфигурацию приложения для вас ...

http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx

1 голос
/ 07 мая 2009

Если вы работаете в .NET 2.0 и выше, вы проверили файлы "Настройки"? Они хранятся в вашем app.config - настройки приложения в <applicationSettings> разделах, пользовательские настройки в , которые, кстати, имеют настройку allowExeDefinition=MachineToLocalUser, которую вы упомянули.

Может быть, это может быть подходом? Эти пользовательские настройки относятся к определенному типу, который можно при необходимости использовать под другим именем («mySettings»).

Марк

...