Сохранение данных в app.config между сеансами отладки
Итак, короче говоря, я разрабатываю приложение, которое будет использовать некоторую информацию о конфигурации, которая может быть изменена во время выполнения через само приложение. Для цели я подумал об использовании Settings
учебный класс.
Считалось, что проблема заключается в том, что информация не сохраняется между различными запусками приложения:
Прогон 1)
Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"
Запустить 2)
Console.WriteLine(Settings.Default["User"]); //prints "Default user"
Settings.Default["User"] = "abc";
Console.WriteLine(Settings.Default["User"]); //prints "abc"
(оба выводят одинаковый вывод)
Оба прогона показывают одну и ту же первую печать "Пользователь по умолчанию", хотя во 2-м прогоне я хотел бы получить "abc", указывая, что информация не сохраняется между различными выполнениями приложения.
Я признаю, что это должно быть связано с тем, как Visual Studio обрабатывает файлы.config, но даже в этом случае я хотел бы знать, как исправить это (неприятное) поведение?
5 ответов
По умолчанию App.config не копируется напрямую, скорее его содержимое помещается в <assembly-name>.config
файл в выходной папке. Настройки копирования не применяются к этой операции.
Как правило, для приложения не рекомендуется изменять собственный app.config. Если вы разрабатываете приложение, которое может использоваться несколькими пользователями на одном ПК, используйте вместо этого Настройки. Таким образом, каждый пользователь может иметь свои собственные настройки.
Для служб и общесистемных настроек рассмотрите возможность использования другого хранилища, например отдельного файла конфигурации, реестра или базы данных.
Изменить о сохранении настроек:
При использовании класса настроек вы должны вызвать Save(), чтобы записать его в файл, иначе изменения настроек будут отменены при закрытии приложения. Если вы часто закрываете свое приложение во время разработки и оно не достигает своего конечного кода (где вы обычно вызываете функцию Save()), тогда у вас есть несколько вариантов:
- Используйте окно просмотра отладчика для вызова Save(). Для этого поместите выражение как
Settings.Default.Save()
в окне просмотра и обновляйте его каждый раз, когда вы хотите сохранить. - Вы можете попробовать использовать таймер для вызова Сохранить каждую секунду.
- Вы можете вставить вызовы Save() в свой код после изменения настроек.
- Вы можете написать собственный провайдер настроек или оболочку, которая будет сразу сохранять настройки после каждого изменения.
Вот что я использовал, чтобы сохранить что-то обратно в файл app.config.
//write the last run time to config
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (config.AppSettings.Settings["LastRunTime"] == null)
{
config.AppSettings.Settings.Add("LastRunTime", DateTime.UtcNow.ToString());
}
else
{
config.AppSettings.Settings["LastRunTime"].Value = DateTime.UtcNow.ToString();
}
config.Save();
Надеюсь это поможет.
Этот код со свойством User, установленным с User
объем:
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ConsoleApplication4.Settings1.Default["User"]); //prints "DefaultUser"
ConsoleApplication4.Settings1.Default["User"] = "abc";
Console.WriteLine(ConsoleApplication4.Settings1.Default["User"]);
ConsoleApplication4.Settings1.Default.Save();
Console.Read();
}
}
}
Сохраняет настройку в неизвестном месте:
C: \ Users \ имя пользователя \AppData\Local\ConsoleApplication4\ConsoleApplication4.exe_Url_acauylh2btl2j4ed0ilz0mujq5aomfmu\1.0.0.0
Так что даже в вашем app.config вы по-прежнему видите "Пользователь по умолчанию" после многократного запуска приложения:
<userSettings>
<ConsoleApplication4.Settings1>
<setting name="User" serializeAs="String">
<value>Default User</value>
</setting>
</ConsoleApplication4.Settings1>
</userSettings>
В User.Config это будет последнее установленное значение для пользователя.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<ConsoleApplication4.Settings1>
<setting name="User" serializeAs="String">
<value>abc</value>
</setting>
</ConsoleApplication4.Settings1>
</userSettings>
</configuration>
Когда я запускаю этот код первый раз, когда вывод "Пользователь по умолчанию", "abc", второй запуск вывод "abc" "abc"
Возможно, это было просто Save();
что ты пропал.
Если ваш файл App.Config хранится вместе с программой в разделе "Program Files", обычный пользователь (не администратор, не опытный пользователь) НЕ сможет писать в этот файл.
Сохранение данных в app.config между сеансами отладки
Вам нужно будет написать исполняемый файл или скрипт, который вы запускаете из события PreBuild, которое записывает параметры User.Config обратно в файл settings1.settings и, в свою очередь, встроено в App.Config.
Я не думаю, что вы хотите сделать это, потому что User.config переопределяет App.Config и при второй отладке кода вы получите "abc" и "abc".
Я вполне уверен, что это было просто Save()
чего не хватало Или что настройки области приложения должны быть доступны только для чтения.
Я не уверен, чем это отличается от вашего подхода, но я решил эту проблему с помощью файла настроек.
Сначала создайте файл настроек из меню "Свойства" вашего проекта. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите "Свойства". Перейдите на вкладку "Настройки" и создайте файл настроек. Как только файл создан, вы должны увидеть сетку данных, где вы можете ввести Имя / Тип / Область / Значение. Установите все переменные, которые вы хотите использовать здесь (я не уверен, что вы можете создать больше переменных во время выполнения, но я так не думаю).
Теперь в коде вы можете использовать класс Properties, который будет находиться в пространстве имен вашего проекта по умолчанию.
Чтобы прочитать настройку:
Properties.Settings.Default.SrcDir;
и сохранить настройки:
Properties.Settings.Default.SrcDir = src;
Properties.Settings.Default.Save();
Возможно, вы можете использовать файловую систему для создания символической ссылки между двумя файлами, чтобы она фактически редактировала файл в исходном коде. Однако я не могу придумать быстрого решения для компилятора, чтобы не перезаписывать файл конфигурации (и таким образом удалять ссылку).
По крайней мере, этот подход не требует от вас кода обходного пути. Это также не влияет на то, как вы хотите сохранить настройки (например, переход от настройки по умолчанию к пользовательской области). Так что это эффективно только при разработке.