ClickOnce и параметры приложения
Параметры приложения для Windows Forms упрощают создание, хранение и обслуживание пользовательских настроек приложения и пользователей на клиенте. В следующем документе описывается, как файлы параметров приложения работают в приложении ClickOnce и как ClickOnce переносит параметры при обновлении пользователя до следующей версии.
Приведенные ниже сведения относятся только к поставщику параметров приложения по умолчанию, LocalFileSettingsProvider классу. Если вы предоставляете настраиваемый поставщик, этот поставщик определит способ хранения данных и способ обновления параметров между версиями. Дополнительные сведения о поставщиках параметров приложения см. в разделе «Архитектура параметров приложения».
Файлы параметров приложения
Параметры приложения используют два файла: и user.config, где приложение — имя приложения Windows Forms. user.config создается на клиенте при первом хранилище параметров пользовательского область. , напротив, будет существовать до развертывания, если вы определяете значения по умолчанию для параметров. Visual Studio будет включать этот файл автоматически при использовании команды публикации . При создании приложения ClickOnce с помощью Mage.exe или MageUI.exe необходимо убедиться, что этот файл включен в другие файлы приложения при заполнении манифеста приложения.
В ClickOnce для .NET Core 3.1 и .NET 5 или более поздней версии используйте dotnet-mage.exe вместо Mage.exe. Дополнительные сведения см. в разделе ClickOnce для .NET.
В приложении Windows Forms, не развернутом с помощью ClickOnce, файл app.exe.config> приложения хранится в каталоге приложения, а файл user.config хранится в папке «Документы пользователя» и Параметры. В приложении > находится в каталоге приложений внутри кэша приложений ClickOnce, а конфигурация user.config находится в каталоге данных ClickOnce для этого приложения.
Независимо от способа развертывания приложения параметры приложения обеспечивают безопасный доступ на чтение к app.exe.config> и безопасный доступ на чтение и запись к user.config.
В приложении ClickOnce размер файлов конфигурации, используемых параметрами приложения, ограничивается размером кэша ClickOnce. Дополнительные сведения см. в обзоре кэша ClickOnce.
.NET Core и .NET 5 или более поздней версии
В настоящее время публикуемая сборка .NET Core должна быть подписана с помощью файла ключа строгого имени. Если это не так, ApplicationSettingsBase.Upgrade метод не копирует параметры правильно после новой публикации ClickOnce. Вы можете указать строгое имя в свойствах проекта .NET Core в разделе «Строгое именование сборки>«.
Обновление версий
Так же, как и каждая версия приложения ClickOnce изолирована от всех остальных версий, параметры приложения для приложения ClickOnce также изолированы от параметров для других версий. Когда пользователь обновляется до более поздней версии приложения, параметры приложения сравнивают последние (самые нумерованные) версии с параметрами, предоставленными обновленной версией, и объединяет параметры в новый набор файлов параметров.
В следующей таблице описывается, как параметры приложения определяют, какие параметры следует копировать.
| Тип изменения | Действие обновления |
|---|---|
| Параметр, добавленный в | Новый параметр объединяется в конфигурацию app.exe.config> текущей версии. |
| Параметр удален из | Старый параметр удаляется из конфигурации app.exe.config> текущей версии |
| Значение по умолчанию изменено; Локальный параметр по-прежнему установлен на исходное значение по умолчанию в user.config | Параметр объединяется с текущей конфигурацией user.config текущей версии с новым значением по умолчанию. |
| Значение по умолчанию изменено; параметр, не используемый по умолчанию в user.config | Параметр объединяется в конфигурацию user.config текущей версии с сохраненным значением, не используемым по умолчанию. |
Если вы создали собственный класс оболочки параметров приложения и хотите настроить логику обновления, можно переопределить Upgrade метод.
Параметры ClickOnce и роуминга
ClickOnce не работает с перемещаемыми параметрами, что позволяет файлу параметров следовать за вами на компьютерах в сети. Если вам нужны перемещаемые параметры, необходимо либо реализовать поставщик параметров приложения, который хранит параметры по сети, либо разработать собственные классы параметров для хранения параметров на удаленном компьютере. Дополнительные сведения о поставщиках параметров см. в разделе «Архитектура параметров приложения».
Связанный контент
- Развертывание и безопасность технологии ClickOnce
- Общие сведения о параметрах приложений
- Общие сведения о кэше ClickOnce
- Доступ к локальным и удаленным данным в приложениях ClickOnce
Файл User.config
![]()
Файл User.config поддерживается, начиная с версии WebMap.NET 2017.3.10. До этой версии все настройки – системные и пользовательские хранились в файле Web.config. В файл User.config перенесены все настройки раздела \appSettings из файла Web.config.
Хранение пользовательских настроек в отдельном файле позволяет сохранить их при обновлении программы. Для этого достаточно перед выполнением обновления переместить файл User.config во временную папку, а после обновления вернуть в папку приложения WebMap.NET.
Если настройка отсутствует в файле User.config (не добавлена или закомментирована), то в программе будет применено значение по умолчанию. Такое может иметь место, например, если в новой версии программы были добавлены новые параметры в файл User.config, но пользователь использует старую версию файла с установленными настройками. Новая настройка может быть добавлена в файл User.config в любом текстовом редакторе.
Файл User.config расположен в папке \webmap – папка приложения WebMap.NET. Файл может быть открыт, изменен и сохранен в любом текстовом редакторе.
Изменяя настройки в файле User.config, убедитесь, что настройка не закомментирована. Такие настройки не обрабатываются. Комментарии ограничиваются символами «», например:
Ниже рассмотрены основные разделы настроек, заданные в файле User.config. Каждая настройка имеет определенный тег. Формат файл — XML.
Описание тегов (add key=):
AGConnectionString – параметры подключения к базе данных: имя пользователя, пароль, имя базы данных и т.д. Именно эти настройки используются для создания и обновления базы данных в разделе \Install, на вкладке «Конфигурация БД».
default-locale – начальный язык интерфейса, используемый при входе пользователя в программу в первый раз. При первом входе информация об использованном языке интерфейса (текущий заданный или тот, на который переключился пользователь после входа) сохраняется в файл cookie и далее этот язык автоматически устанавливается при следующих сессиях. Начальный язык интерфейса необходимо задавать в формате XML. Всего программа поддерживает 4 языка: Русский, Английский, Немецкий и Китайский.
multicast-endpoint – адрес для групповой рассылки уведомлений об изменении данных при использовании нескольких web-серверов. Данная настройка необходима для правильной синхронизации файлов в системе с разделением web-сервера на несколько разных с целью уменьшения нагрузки. При такой схеме одинаковые адреса «multicast-endpoint» должны быть заданы на всех web-серверах.
license-file – путь к файлу лицензии. Путь может быть задан как абсолютный, так и относительный (относительно папки приложения WebMap.NET). По умолчанию файл лицензии хранится в папке \App_Data. Для того чтобы использовать файл лицензии из другой папки необходимо в строке с тегом «license-file» указать полный путь к этому файлу. Подробнее о получении и установке лицензии см. в разделе «Установка лицензии».
links-upper – дополнительные ссылки на стартовой странице программы. Ссылка и заголовок должны быть заданы в формате «Заголовок=ссылка» . Несколько ссылок должны быть разделены точкой с запятой (;): «Заголовок1=ссылка1;Заголовок2=ссылка2» . Пример ссылок на основе настроек, заданных в файле User.config выше, приведен на Рис.1.

Рис.1. Верхние ссылки.
logo-upper – URL графического файла с дополнительным логотип, который будет отображаться рядом с логотипом ТехноКом на стартовой странице программы. Не допускаются ссылки на локальные каталоги с изображением. Поддерживаются все графические форматы файлов. Размер прикрепляемого изображения не должен превышать 400х53 пикселей.
logo-upper-llinks – ссылка, которая будет открываться при нажатии на дополнительный логотип «logo-upper», например, таким образом может быть настроен переход на сайт дилера при нажатии на логотип компании. Данный параметр может быть пустым, в этом случае логотип будет без ссылки.
cache-org-max-time – максимальное время хранения организации в кэше, в минутах. Если организация не используется дольше заданного времени, то эта организация выгружается из кэша. Значение по умолчанию – 10 минут. Если настройка не задана в файле User.config, то программа использует значение по умолчанию.
Приведенные ниже настройки используются сторонними сервисами, запрашивающих данные с программы WebMap.NET: ServiceJSON/WCF и 1C:ASMX.
driver-to-string – информация о водителях, передаваемая web-сервером внешнему сервису: 0 – передается глобальный уникальный идентификатор водителя (GUID); 1 – передается строка номер карточки.
time-to-string – формат, в котором web-сервер передает время внешнему сервису: 0 – время (длительность) будут передаваться в формате ISO 8601 (например, PT5H35M, если длительность 05 часов, 35 минут); 1 – время передается в формате HH:MM, например, 05:35, если длительность 05 часов 35 минут).
redis-host – адрес и порт для подключения к серверу Redis для кэширования данных. Такой способ хранения кэша актуален, когда используется несколько серверов. В этом случае будет одно общее хранилище кэша. Сервис Redis используется только для хранения тайлов интернет-карт, трека и онлайн данных ТС.
Приведенные ниже настройки относятся к прокси-серверу, используемому на web-сервере для доступа к сети Интернет. Данный блок настроек необходим для возможности кэширования интернет карт при использовании прокси-сервера.
proxy-host – это полный адрес прокси-сервера и номер порта для подключения в формате адрес:порт;
proxy-login – это имя пользователя прокси-сервера;
proxy-pass – это пароль для подключения к прокси-серверу.
Управление параметрами приложения (.NET)
Параметры приложений позволяют динамически хранить данные приложения. С параметрами приложения можно использовать клиентский компьютер для хранения информации, которая не должна быть включена в код приложения во время выполнения. Параметры приложения могут включать строка подключения, предпочтения пользователей и многое другое.
Параметры приложения заменяют динамические свойства, используемые в более ранних версиях Visual Studio.
Каждый параметр приложения должен иметь уникальное имя. Имя может быть любым сочетанием букв, чисел или подчеркивания. Однако имя не может начинаться с числа, и у него не может быть пробелов. Для изменения имени служит свойство Name .
Параметры приложения могут храниться в виде любого типа данных, который может быть сериализован в формат XML или имеет метод TypeConverter , реализующий ToString / FromString . Наиболее распространенными типами являются String , Integer и Boolean . Вы также можете хранить значения как , Objectили как Colorстрока подключения.
Параметры приложений также содержат значение. Значение задается с помощью свойства Value и должно соответствовать типу данных параметра.
Кроме того, параметры приложений могут быть связаны со свойством формы или элемента управления во время разработки.
Существуют два типа параметров приложений в зависимости от области действия:
- Параметры область приложения можно использовать для получения сведений, таких как URL-адрес веб-службы или базы данных строка подключения. Эти значения связаны с приложением. Следовательно, пользователи не могут изменять их во время выполнения.
- Параметры, область пользователей, можно использовать для получения сведений, таких как сохранение последней позиции формы или предпочтения шрифта. Пользователи могут изменять эти значения во время выполнения.
Можно изменить тип параметра с помощью свойства Scope .
Система работы с проектами хранит параметры приложений в двух файлах XML:
- Файл app.config, созданный во время разработки при создании первого параметра приложения
- Файл user.config, который создается во время выполнения, когда пользователь, который запускает приложение, изменяет значение любого параметра пользователя.
Обратите внимание, что изменения параметров пользователя не записываются на диск, если приложение специально не вызывает метод для этого.
Создание параметров приложения во время разработки
Во время разработки можно создать параметры приложения двумя способами:
- Используйте страницу Параметры конструктора проектов.
- Используйте окно «Свойства» для формы или элемента управления, что позволяет привязать параметр к свойству.
При создании параметра область приложения (например, базы данных строка подключения или ссылки на ресурсы сервера) Visual Studio сохраняет его в файле app.config с тегом . (Строки подключения сохраняются под тегом .)
При создании параметра область пользователя (например, шрифта по умолчанию, домашней страницы или размера окна) Visual Studio сохраняет его в файле app.config с тегом .
При хранении строк подключения в файле в app.config нужно предпринимать меры предосторожности, чтобы избегать раскрытия конфиденциальной информации, такой как пароли или пути сервера, содержащейся в строке подключения.
Если вы принимаете строка подключения информацию из внешнего источника, например пользователя, который предоставляет идентификатор пользователя и пароль, необходимо быть осторожным, чтобы убедиться, что значения, используемые для создания строка подключения, не содержат дополнительных строка подключения параметров, которые изменяют поведение подключения.
Рассмотрите возможность использования функции защищенной конфигурации для шифрования секретной информации в файле конфигурации. Дополнительные сведения см. в разделе Защита сведений о подключении.
Так как для библиотек классов нет модели файлов конфигурации, параметры приложения не применяются для проектов библиотек классов. Исключением является проект DLL среды выполнения набор средств Visual Studio для Office, который может иметь файл конфигурации.
Использование настраиваемых файлов параметров
Для удобства управления группами параметров в проект можно добавить индивидуальные файлы настроек. Содержащиеся в одном файле параметры загружаются и сохраняются как единое целое. Хранение параметров в отдельных файлах для часто и редко используемых групп позволяет сэкономить время на загрузке и сохранении параметров.
Например, в проект можно добавить файл Special Параметры.settings. Хотя класс SpecialSettings не предоставлен в пространстве имен My , функция Просмотр кода позволяет считывать индивидуальный файл параметров, содержащий Partial Class SpecialSettings .
Конструктор Параметры сначала ищет файл Параметры.settings, создаваемый системой проекта. Этот файл Параметры.settings — это файл по умолчанию, отображаемый конструктором проектов на вкладке Параметры. Файл Параметры.settings находится в папке «Мой проект» для проектов Visual Basic и в папке «Свойства» для проектов Visual C#. Затем конструктор проектов ищет другие файлы параметров в корневой папке проекта. Таким образом, индивидуальный файл параметров следует помещать туда же. Если добавить файл с расширением .settings в другое место проекта, конструктор проектов не сможет найти его.
Чтение и изменение параметров приложения во время выполнения в Visual Basic
В проектах Visual Basic доступ к параметрам приложения во время выполнения можно получить с помощью объекта My.Settings . На странице Параметры нажмите кнопку «Вид кода«, чтобы просмотреть файл Параметры.vb. Файл Settings.vb определяет класс Settings , который позволяет обрабатывать эти события в классе параметров: SettingChanging, PropertyChanged, SettingsLoaded и SettingsSaving. Обратите внимание, что класс Settings в файле Settings.vb является разделяемым классом, который отображает только принадлежащий пользователю код, а не весь сгенерированный класс. Дополнительную информацию о доступе к параметрам приложения с помощью объекта My.Settings см. в разделе Доступ к параметрам приложения (.NET Framework).
Значения любых параметров в пользовательской области (например, положение формы), изменяемые пользователем во время выполнения, хранятся в файле user.config. Обратите внимание, что значения по умолчанию по-прежнему сохраняются в файл app.config.
Если во время выполнения во время выполнения изменяются какие-либо параметры область пользователя, например при тестировании приложения, и хотите сбросить эти параметры в значения по умолчанию, нажмите кнопку «Синхронизировать«.
Рекомендуется использовать My.Settings объект и файл параметров по умолчанию для доступа к параметрам. Рекомендуется использовать конструктор Параметры для назначения свойств параметрам и, кроме того, параметры пользователя автоматически сохраняются перед завершением работы приложения. Однако приложение Visual Basic может получить доступ к настройкам напрямую. В этом случае необходим доступ к классу MySettings и использование настраиваемого файла SETTINGS в корневой папке проекта. Перед завершением приложения необходимо сохранить параметры пользователя, как описано в следующем разделе.
Чтение и изменение параметров приложения во время выполнения в языке C#
На языках, отличных от Visual Basic, например C#, необходимо напрямую получить доступ к классу Settings , как показано в следующем примере Visual C#.
Properties.Settings.Default.FirstUserSetting = "abc";
Нужно явным образом вызывать метод Save этого класса-оболочки, чтобы сохранить параметры пользователя. Обычно это делается в обработчике Closing событий основной формы. В приведенном ниже примере C# показан вызов метода Save .
Properties.Settings.Default.Save();
Общие сведения о доступе к параметрам приложений с помощью класса Settings см. в разделе Общие сведения о параметрах приложений (.NET Framework). Информацию об итерации параметров см. в этой записи форума.
Связанный контент
C#, способы хранения настроек программы
В интернете приведено очень много способов хранения настроек программы, но все они как-то разбросаны, поэтому я решил их собрать вместе и расписать, как этим пользоваться.
C# и app.config
На хабре уже была посвящена этому тема, поэтому… перейти
C# и Properties.Settings
Информация о Properties.Settings
Организация Properties.Settings — это обычный xml файл, который можно найти в папке пользователя:
С:\ Users \ [user name] \ AppData \ Local \ [ (Project Name) or (AssemblyCompany) ] \ [name project_cashBuild] \ [AssemblyVersion] \ user.config
Для начала нам нужно создать такие переменные для Properties.Settings. Перейдем в Properties -> Settings.settings:
Properties -> Settings.settings in VS 2013
Я создал 3-и переменные и выбрал область их использования: 2- область пользователь и 1- приложение.
Различие между областями просты. Область приложения можно только читать, а пользователь — изменять и читать.
Вернемся к переменным:
- Version — версия нашей программы. Определил ее строкой и областью приложение. Т.к. версия может содержать буквы (например, b — от beta). А область выбрал, чтоб не менялась наша версия приложения (т.к. AssemblyVersion редко кто использует).
- Save_text — это переменная, куда мы будем сохранять наш текст.
- open_sum — сколько раз мы открыли программу.
Код Form1.cs
namespace Habrahabr < public partial class Form1 : Form < public Form1() < InitializeComponent(); this.Text += " " + Properties.Settings.Default.Version; //Добавляем в название программы, версию. Properties.Settings.Default.open_sum++; //Добавляем +1 к кол-ву запусков программы. label2.Text = Properties.Settings.Default.open_sum.ToString(); //выводим в Label2 кол-во запусков программы. richTextBox1.Text = Properties.Settings.Default.Save_text; // Загружаем ранее сохраненный текст Properties.Settings.Default.Save(); // Сохраняем переменные. >private void button1_Click(object sender, EventArgs e) < Properties.Settings.Default.Save_text = richTextBox1.Text; // Записываем содержимое richTextBox1 в Save_text Properties.Settings.Default.Save(); // Сохраняем переменные. MessageBox.Show("Текст сохранен", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. >> >
Результаты работы программы
Первый запуск, мы видим, что кол-во запусков равно 1. И теста в richTextBox1 нет.

Теперь напишем и сохраним текст.

При втором запуске мы видим, что текст сохранен, и кол-во запусков уже 2-ва.

Очень удобно использовать этот объект, если надо работать в разных областях видимости в одном проекте. Метод хорош, когда вам не надо, чтоб рядовой пользователь рылся в файлах настройки программы.
C# и ini-файлы
С ini-файлами все на оборот, они лежат в папке рядом с программой, что позволяет пользователю изменить настройки вне-программы. Данный способ хорош, если настройки программы заносятся вручную. Например, эмулятор для запуска игры без лицензии (тотже revLoader).
Теперь перейдем к нашей теме. Для работы с таким типом файлов, нам нужно создать класс по работе с ним. Создаем класс, например «IniFile», подключаем пространство имен, которых нет:
using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text;
А теперь разбираем по-порядку:
Код IniFiles.cs
using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace IniFiles < class IniFile < string Path; //Имя файла. [DllImport("kernel32")] // Подключаем kernel32.dll и описываем его функцию WritePrivateProfilesString static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath); [DllImport("kernel32")] // Еще раз подключаем kernel32.dll, а теперь описываем функцию GetPrivateProfileString static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); // С помощью конструктора записываем пусть до файла и его имя. public IniFile(string IniPath) < Path = new FileInfo(IniPath).FullName.ToString(); >//Читаем ini-файл и возвращаем значение указного ключа из заданной секции. public string ReadINI(string Section, string Key) < var RetVal = new StringBuilder(255); GetPrivateProfileString(Section, Key, "", RetVal, 255, Path); return RetVal.ToString(); >//Записываем в ini-файл. Запись происходит в выбранную секцию в выбранный ключ. public void Write(string Section, string Key, string Value) < WritePrivateProfileString(Section, Key, Value, Path); >//Удаляем ключ из выбранной секции. public void DeleteKey(string Key, string Section = null) < Write(Section, Key, null); >//Удаляем выбранную секцию public void DeleteSection(string Section = null) < Write(Section, null, null); >//Проверяем, есть ли такой ключ, в этой секции public bool KeyExists(string Key, string Section = null) < return ReadINI(Section, Key).Length >0; > > >
Теперь переходим в основную программу.
Код Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace IniFiles < public partial class Form1 : Form < IniFile INI = new IniFile("config.ini"); public Form1() < InitializeComponent(); auto_read(); >private void auto_read() < if (INI.KeyExistsINI("SettingForm1", "Width")) numericUpDown2.Value = int.Parse(INI.ReadINI("SettingForm1", "Height")); else numericUpDown1.Value = this.MinimumSize.Height; if (INI.KeyExistsINI("SettingForm1", "Height")) numericUpDown1.Value = int.Parse(INI.ReadINI("SettingForm1", "Width")); else numericUpDown2.Value = this.MinimumSize.Width; if (INI.KeyExistsINI("SettingForm1", "Width")) textBox1.Text = INI.ReadINI("Other", "Text"); this.Height = int.Parse(numericUpDown1.Value.ToString()); this.Width = int.Parse(numericUpDown2.Value.ToString()); >private void button1_Click(object sender, EventArgs e) < INI.WriteINI("SettingForm1", "Height", numericUpDown2.Value.ToString()); INI.WriteINI("SettingForm1", "Width", numericUpDown1.Value.ToString()); INI.WriteINI("Other", "Text", textBox1.Text); MessageBox.Show("Настройки SettingForm1 и Other сохранены", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. >private void button2_Click(object sender, EventArgs e) < auto_read(); // Чтоб не повторяться. >private void button3_Click(object sender, EventArgs e) < INI.WriteINI("SettingForm1", "Height", numericUpDown2.Value.ToString()); INI.WriteINI("SettingForm1", "Width", numericUpDown1.Value.ToString()); this.Height = int.Parse(numericUpDown1.Value.ToString()); this.Width = int.Parse(numericUpDown2.Value.ToString()); MessageBox.Show("Настройки SettingForm1 сохранены и применены", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); // Говорим пользователю, что сохранили текст. >> >
Результаты работы программы
При первом запуска, у нас нет файла config.ini. Поэтому при проверке возвращаются fasle и мы приравниваем окно к минимальным параметрам.
Меняем параметры окна и жмем «Применить»
Редактируем файл config.ini руками и жмем загрузить.
На этом все, в следующий раз опишу работу с xml файлами и с бинарными файлами.