Я играю с поддержкой конфигурации .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, обеспечивающий это, или я, возможно, должен использовать совсем другой подход?