Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
.NET 4.x

Настройки приложения

04.07.2016, 18:06. Показов 3365. Ответов 55
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть проект в виде DLL. В нём есть класс с настройками приложения, контролов... Его сериализую и десерализую в XML. Settings не подходят в виду необходимости экспорта-импорта настроек.
Настройки используются во всё приложении в разных случаях. В разных невзаимосвязанных классах.
Вопрос: как лучше всего реализовать такую штуку? Т.е. доступ к настройкам полученным из XML файла.
Варианты, которые использую:
- статичное свойство в основном классе. Десериализуем при инициализации DLL
- статичный класс. Десериализуем при инициализации DLL.
-....
Может где-то не прав? Может стоит брать значения по мере необходимости и создать отдельный обработчик считывания-записи (сериализации-десериализации) из XML?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2016, 18:06
Ответы с готовыми решениями:

Региональные настройки. Стабильность работы приложения на других ПК
Доброго времени суток. Столкнулся со следующей ситуацией. Мною написано несколько программ на C#, которые работают с данными как sql...

Языковые настройки приложения
как лучше всего реализовать систему языковых настроек в приложении? т.е. чтобы в программе можно было менять язык интерфейса? понятно что в...

Куда сохраняются настройки приложения
Здравствуйте друзья. В одном решении есть два проекта: консольное приложение и виндовс приложение. Виндовс приложение второстепенное...

55
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 20:29  [ТС]
Студворк — интернет-сервис помощи студентам
Psilon, очень наглядно и сразу понятно)) Теперь вы советуете сделать ISettings? И дальше в проекте использовать интерфейсы?
И ещё вопрос, почему вам так понравился Json? Чем XML хуже?

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Легко
где оно было полторы страницы назад? (уже 2)
0
Эксперт .NET
 Аватар для Usaga
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
05.07.2016, 20:32
Цитата Сообщение от skilllab Посмотреть сообщение
где оно было полторы страницы назад?
Витало в виде надежды, что ты начнёшь гуглить незнакомые слова и сам разберёшься или попросишь пример
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 20:41  [ТС]
Psilon, и ещё. Типа не обязательно держать Settings всё время загруженными, так? Т.е. как понадобится - Load. А не как я, в родительском изначальном сделал статик свойство и через него всё выдёргивал.
Просто так может просесть производительность и ещё с памятью (наверное) могут быть проблемы. Один из триггеров участвует при рисовалке OpenGL, что-то вроде (СТАРЫЙ КОД):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (SwAddin.mySettings.EnableFiberRectangle)
   {
       {
          GL.glLineWidth(SwAddin.mySettings.BoxLineWeight);
          GL.glColor3d(SwAddin.mySettings.RedContour/255,
          SwAddin.mySettings.GreenContour/255,
          SwAddin.mySettings.BlueContour/255); //Red Green Blue
          GL.glBegin(GL.GL_LINE_LOOP);
          GL.glVertex3d(DrawingPoints.TargetPoints[0].x, DrawingPoints.TargetPoints[0].y, DrawingPoints.TargetPoints[0].z);
          GL.glVertex3d(DrawingPoints.TargetPoints[1].x, DrawingPoints.TargetPoints[1].y, DrawingPoints.TargetPoints[1].z);
          GL.glVertex3d(DrawingPoints.TargetPoints[2].x, DrawingPoints.TargetPoints[2].y, DrawingPoints.TargetPoints[2].z);
          GL.glVertex3d(DrawingPoints.TargetPoints[3].x, DrawingPoints.TargetPoints[3].y, DrawingPoints.TargetPoints[3].z);
          GL.glVertex3d(DrawingPoints.TargetPoints[0].x, DrawingPoints.TargetPoints[0].y, DrawingPoints.TargetPoints[0].z);
          GL.glEnd();
      }
    }
Добавлено через 3 минуты
Вот к этой штуке SwAddin.mySettings.EnableFiberRectangle идёт обращение постоянно, пока пользователь елозит мышкой))) в программе-родителе.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2016, 20:56
skilllab, хотите - доставайте сразу, не хотите - по необходимости. В этом и прелесть подобного решения, оно гибкое и может использовать как угодно.

Цитата Сообщение от skilllab Посмотреть сообщение
Теперь вы советуете сделать ISettings? И дальше в проекте использовать интерфейсы?
интерфейсы позволяют менять реализацию не застрагивая классы. Иногда это и не нужно. Но вот если все уже завязано на классы, потом если вдруг понадобится "развязать" адский клубок будет почти невозможно. Я как-то 3 месяца рефакторил подобную систему, в результате ушел в другую контору прежде чем успел закончить это Такие вот дела.

Цитата Сообщение от skilllab Посмотреть сообщение
И ещё вопрос, почему вам так понравился Json? Чем XML хуже?
JSON намного легче, его проще читать, он быстрее (де)сериализуется, он лучше поддерживается современными средствами программирования и сопутствующими товарами.

Тут вроде неплохо рассказано в деталях.

Добавлено через 11 минут
Ах да, еще он не зависит от наличия дебильных атрибутов а-ля Serializable, но при этом прекрасно сам их понимает (например атрибут DataMember). Таким образом он не требует наличия атрибутов или специальных интефрейсов, но если они будут, то он переопределит свое поведение и будет использовать указанное вами.
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
05.07.2016, 21:03  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
JSON намного легче
Если в этом чуде я ни разу не встречу ошибку кодировки при чтении файла (чертов UTF-16 в нэймспэйсе этих XML), то ... уже перехожу
А что насчёт этого тестового примера с классом и
Цитата Сообщение от skilllab Посмотреть сообщение
Один из триггеров участвует при рисовалке OpenGL
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
05.07.2016, 21:09
Цитата Сообщение от skilllab Посмотреть сообщение
А что насчёт этого тестового примера с классом и
хотите - доставайте сразу, не хотите - по необходимости. В этом и прелесть подобного решения, оно гибкое и может использовать как угодно.
Что касается кодировки, то вы сами указываете её в методах save/load (там же принимается параметр энкодинга, это ведь стандартные методы записи файлов дотнета). Я обычно указываю UTF-8, что там используется по-умолчанию можно посмотреть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        [System.Security.SecuritySafeCritical]  // auto-generated
        [ResourceExposure(ResourceScope.Machine)]
        [ResourceConsumption(ResourceScope.Machine)]
        public static void WriteAllText(String path, String contents)
        {
            if (path == null)
                throw new ArgumentNullException("path");
            if (path.Length == 0)
                throw new ArgumentException(Environment.GetResourceString("Argument_EmptyPath"));
            Contract.EndContractBlock();
 
            InternalWriteAllText(path, contents, StreamWriter.UTF8NoBOM, true);
        }
UTF8 - то, что нужно
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
26.07.2016, 23:33
Наивный вопрос:
Можно ли сериализовывать настройки в деструкторе самого класса настроек?
Где-то читал, что деструктор может не сработать
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.07.2016, 00:08
Цитата Сообщение от Serg34 Посмотреть сообщение
Наивный вопрос:
Есть такие методы, как:
OnDeserializing/OnDeserialised, OnSerializing/OnSerialized. Можете использовать их.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
27.07.2016, 00:12
Я имел ввиду, что настройки сохраняются при уничтожении экземпляра при закрытии программы
Что-то вроде:
C#
1
2
3
4
~GeneralSettings()
{
    serialazer.Save("GeneralSettings.xml", this);
}
0
Эксперт .NET
 Аватар для Usaga
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
27.07.2016, 05:54
Serg34, финализаторы предназначены только для высвобождения неуправляемых ресурсов. Обращение к управляемым ресурсам из финализаторов недопустимо, так как порядок уничтожения объектов сборщиком мусора не определён и объект на который указывает ссылка serializer уже может быть недоступен.

Для этих целей подходит подписка на событие Form.Closed (Windows Forms) или Window.Closed (WPF), либо же на AppDomain.ProcessExit.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
27.07.2016, 21:28
Usaga, а вы специально мой "деструктор" "финализатором" называете? (читал статью сегодня на эту тему)
Я вспомнил где прочитал - Шилдт: "программа может завершиться до того, как произойдет "сборка мусора", а следовательно, деструктор может быть вообще не вызван."
Правда теперь непонятно какая польза от этих деструкторов, если они работают через раз...
Но я на самом деле не об этом: я хочу добиться сохранения настроек один раз в конце жизни программы независимо от исхода: исключения, завершение процесса в диспетчере задач или, самое интересное, после остановки отладки в Visual Studio (уж очень люблю я эту кнопку )
Как понимаете, ни один из этих методов не подходит.
Есть же алгоритмы сохранения при аварийном завершении.
Думал о FirstChanceExeption. Но по моему все-равно не то...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.07.2016, 22:11
Serg34, ничего не может гарантировать подобного сохранения. Ибо например если в консольке просто нажать на крестик, то финализаторы не отработают, т.к. процесс просто умрет. А это не единственный случай, когда процесс жестко останавливается. А учитывая, что 99% пользователь нажимают на крестик (а не выходят через ctrl+c), становится ясна моя печаль Как раз недавно этот вопрос вентилировал. Без хуков и замены жесткого приземления на мягкое никак не добиться.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
27.07.2016, 22:22
Psilon, Тогда как тот же Excel предлагает восстановить несохраненные файлы после жесткой остановки???
Значит программа может понимать как она завершается
Или там что-то замудреное, типа сохранения временных фалов, которые только при мягкой посадке удаляются?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.07.2016, 23:17
Цитата Сообщение от Serg34 Посмотреть сообщение
Или там что-то замудреное, типа сохранения временных фалов, которые только при мягкой посадке удаляются?
Именно так Попробуйте включить отображение скрытых файлов и открыть docx на рабочем столе, например.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,051
Записей в блоге: 1
28.07.2016, 09:28  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
то финализаторы не отработают
А что происходит с объектами кода при аварийном завершении в дебаге собранной ранее сборки? память тупо обнуляется? Или всё так и остаётся висеть пока винда сама не решит освободить? Если винда освобождает, она же может дойти до деструктора? Или вообще куда то в GC залезть можно?
0
Эксперт .NET
 Аватар для Usaga
14804 / 9577 / 1368
Регистрация: 21.01.2016
Сообщений: 36,085
28.07.2016, 10:13
Цитата Сообщение от skilllab Посмотреть сообщение
А что происходит с объектами кода при аварийном завершении в дебаге собранной ранее сборки?
Винда высвобождает все ресурсы процесса. CLR уже не у руля, потому финализаторы не отрабатывают.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2016, 10:13

Где в UWP хранить настройки приложения?
В WPF есть Setting.setting а в UWP нету в Properties

Как и где хранить настройки приложения
Есть WIN приложение, есть возможность указать в нем некоторые опции. Как обычно поступают? Создают класс опций а потом обращаются к...

Сохранить настройки в событии Shutdown приложения
Добрый день, товарищи!! Читаю в "события приложения" "' Shutdown: возникает после закрытия всех форм приложения. Это событие не...

Читать настройки приложения из файла конфигурации
Добрый день. Хотелось бы часть настроек программы вывести в конфиг-файл, но как грамотно это сделать? В качестве временного...

Сохраняем настройки приложения средствами Visual Studio
Привет, я хотел бы рассказать о новой возможности. Начиная с версии framework 2.0, существует возможность сохранения настроек в сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru