Редактирование / изменение настроек приложения C#

Функция настройки конфигурации.NET не так гибка, как хотелось бы. Если я правильно понимаю настройки приложения, я ограничен в том, когда я могу изменять / редактировать настройки. В C# параметры приложения разделены на два разных типа или области действия ("Приложение" и "Пользователь"), но оба имеют ограничения в отношении того, как их можно изменять или модифицировать. Следующая таблица демонстрирует разницу:

   ОБЛАСТЬ ПРИМЕНЕНИЯ:   | РЕДАКТИРОВАТЬ В ДИЗАЙН-ВРЕМЯ:   | РЕДАКТИРОВАТЬ В RUN-TIME: | РЕДАКТИРОВАТЬ МЕЖДУ СЕССИЯМИ:
-------------------------------------------------- -------------------------------------
   Пользователь |   Setings.settings    |  Settings.Default.Save()  |     *Не поддерживается*       
Применение |   Setings.settings    |      * Не поддерживается *      | редактировать app.exe.config   

Есть ли какая-либо "встроенная" функциональность настроек, которая позволит мне редактировать настройки всеми тремя механизмами? Одним из основных мотивов использования файла конфигурации является предоставление пользователям возможности изменять значения по умолчанию, не перестраивая исходный код (как это можно сделать с помощью параметров в области приложения). Тем не менее, пользователь не должен быть вынужден редактировать файл.config; они также должны иметь возможность вносить изменения во время выполнения, которые сохраняются во всех настройках (как это можно сделать в настройках, определяемых пользователем). Конечно, должен быть какой-то механизм, который обеспечивает обе функции.

НИЖНЯЯ ЛИНИЯ: Почему нельзя настроить приложение (app.exe.config) быть отредактирован во время выполнения? Это решило бы все мои проблемы. Я понимаю, что это может вызвать проблемы у пользователей, которые используют одну и ту же машину. Но кто это делает?

ВОЗМОЖНОЕ ВОЗМОЖНОЕ РЕШЕНИЕ: есть ли способ изменить место хранения по умолчанию для файла конфигурации пользовательских настроек в не скрытую папку?


ОБНОВЛЕНИЕ (для пояснения): я хочу сказать, что я хочу иметь возможность изменять настройки по умолчанию во время разработки, во время выполнения или между сеансами (т. Е. Путем редактирования файла конфигурации). Но при использовании встроенных в C# механизмов сохранения, предоставляемых Settings.settings Я должен выбрать не более 2 из 3. Я что-то упустил? Есть ли другая альтернатива, о которой я не знаю?

[ Вариант использования: я хочу сохранить имя базы данных "по умолчанию" для строки подключения, но я хочу, чтобы пользователь мог указать другую базу данных во время выполнения (и, таким образом, стать "новым" по умолчанию для этого пользователя). Но я также хочу иметь возможность перезаписать настройки по умолчанию в файле конфигурации, не перезапуская и не перестраивая приложение.]

[ ЛУЧШЕЕ Использование: (в ответ на комментарии)

У меня есть вычислительная модель с файлом конфигурации, который содержит значения по умолчанию для параметров в модели. Пользователь А запускает модель и решает изменить значение нескольких параметров. Это изменение должно сохраняться для всех будущих сеансов для этого пользователя (т. Е. Редактировать в RunTime). Впоследствии этот пользователь хочет поделиться этим измененным файлом конфигурации со своей командой (например, через репозиторий контроля версий или по электронной почте). Это позволило бы пользователю B обновить свои значения параметров по умолчанию (в соответствии с параметрами пользователя A) без необходимости вручную изменять их в приложении (т. Е. Редактировать между сеансами). Все эти моды должны произойти ПОСЛЕ Design-Time. ]

* Я понимаю, что могу "технически" отредактировать пользовательские настройки в файле app.exe.config, расположенном в скрытой папке AppData, но это скрытый файл, и не все пользователи могут иметь достаточные права для его просмотра. (НО см. "Возможный обходной путь" выше.)

2 ответа

Что, если вы попробовали следующее в тематическом исследовании и могли бы обобщить его?

  1. Пока пользователь может изменить имя базы данных по умолчанию, поэтому этот ключ должен определяться в области действия пользователя, а не в области приложения.
  2. После установки приложения, которое я предполагаю для приложения Windows, и при первом запуске проверьте, имеет ли user.config значение Имя базы данных, если да, продолжите загрузку приложения, в противном случае перейдите к шагу 3.
  3. Показывать пользователю экран с именем базы данных имеет значение по умолчанию, и пользователь может изменить настройки и выполнить некоторые проверки здесь, после завершения страницы настроек, сохранить их в файле user.config, чтобы ваше приложение на следующем запустить, он найдет необходимые настройки для нормального запуска.
  4. Для привилегий администратора вы можете показать кнопку для изменения настроек во время выполнения.

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

надеюсь, что это даст вам подсказку или что-то

Все, что вам нужно сделать, это объединить две техники!

В начале сеанса прочитайте настроенный параметр из файла конфигурации и сохраните его в глобальной статической переменной (или в любой форме постоянства), которая доступна для записи.

Затем, когда пользователь решит изменить этот параметр, просто измените значение параметра.

public static Program {

    public static string ConnectionString { get; set; }

    void Main(string connectionString) {
         ConnectionString = connectionString;
    }

}

public class SomeOtherClass {
     public void SomeOtherMethod () {
         Program.ConnectionString = "new value";
     }
}

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

Другие вопросы по тегам