Почему настройки приложения доступны только для чтения в app.config? - PullRequest
25 голосов
/ 17 апреля 2009

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

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

Почему это?

И как мне сохранить глобальные настройки моего приложения?

Edit:

На самом деле это приложение службы Windows, которое работает как служба как LocalSystem. Он также может быть запущен вручную локальным администратором с аргументом "/ config", который запускает форму окна для редактирования значений конфигурации.

Таким образом, он будет иметь доступ на запись к %PROGRAMFILES% в обеих ситуациях.

Таким образом, я получаю доступ к своим настройкам:

Settings.Default.MySetting = MyNewValue;

И когда MySetting установлен на Application (в свойствах моего проекта, Settings.settings), я получаю ошибку во время компиляции «MySetting только для чтения».

Я новичок в этом, и еще не нашел очень хорошего объяснения того, как это должно быть сделано. Например, почему я должен сказать «По умолчанию», и что это на самом деле означает? Я понятия не имею. Если кто-нибудь может указать мне на руководство по использованию app.config, это будет очень полезно.

Ответы [ 6 ]

59 голосов
/ 20 октября 2009

Реальный полный ответ:

Настройки app.config доступны только для чтения, поскольку существует 2 типа настроек:

  1. Настройки приложения
  2. Настройки пользователя

Первое не изменится, если издатель приложения не опубликует его новую версию. Второй хранится не в файле app.config, а в файле user.config. В отсутствие этого файла user.config app.config предоставляет значение по умолчанию.

Если MySetting является настройкой пользователя:

Settings.Default.MySetting = MyNewValue;
Settings.Default.Save();

Он создаст файл user.config на [User Local Settings Application Data]\[company name]\[application].exe[hash string]\[version] с новыми настройками, и эти настройки будут иметь приоритет над настройками в файле app.config.

4 голосов
/ 17 апреля 2009

Почему: Настройки приложения предназначены для хранения в папке «Приложения» в папке «Program Files», где у пользователя нет прав на запись.

Как: По умолчанию "Все пользователи" не поддерживаются, но вы должны иметь возможность настроить свой собственный файл конфигурации в общей папке или использовать базу данных.

3 голосов
/ 17 апреля 2009

Проще говоря: на машине нет места, которое каждый может изменить, если только вы не предоставите для этого привилегии.

Есть несколько способов справиться с такой ситуацией:

  • Вы можете создать файл конфигурации / некоторые параметры реестра, поместить его в профиль «все пользователи» и предоставить «Все» права на изменение этого конкретного файла. Во время установки вы можете автоматизировать процедуру предоставления соответствующих привилегий, а ваша программа может обработать все остальное.

  • Вы можете использовать UAC, чтобы у текущего пользователя были соответствующие привилегии для изменения общесистемного параметра. Это рекомендуемый подход, но он также означает, что не каждый может изменить определенные настройки.

  • Вы можете использовать общую базу данных и хранить там свои настройки.

  • ???

Я бы не рекомендовал менять элементы в каталоге файлов программы или изменять привилегии по умолчанию.

РЕДАКТИРОВАТЬ: Как локальная система у вас действительно есть права на запись в каталог программных файлов. Если появляется ошибка «Только чтение», это означает, что сами настройки доступны только для чтения. Вам потребуется использовать менеджер конфигурации, чтобы иметь возможность изменять настройки в файлах конфигурации.

Надеюсь, это поможет.

1 голос
/ 17 апреля 2009

Не совсем уверен, что вы имеете в виду здесь. Вы имеете в виду, что вы позволили пользователям изменять app.config из пользовательского интерфейса, и эти изменения не сохраняются?

ты звонил

ConfigurationManager.RefreshSection("appSettings");

и

Configuration.Save();
0 голосов
/ 17 апреля 2009

Настройки конфигурации кэшируются в памяти при запуске приложения. вы можете использовать файл app.config в формате xml для изменения значений.

0 голосов
/ 17 апреля 2009

Одной из причин является то, что файл app.config находится в папке вашего приложения в каталоге Program Files, и все содержимое Program Files по умолчанию доступно только для обычных пользователей.

Другое: настройки app.config применяются ко всей системе. Если один пользователь вносит изменения, это повлияет на других пользователей. Обычные пользователи не должны иметь возможность вносить подобные изменения. Все, что может повлиять на нескольких пользователей, должно быть установлено только системным администратором. Настройки для каждого пользователя находятся в папке Application Data каждого пользователя.

...