Как использовать конфигурационные файлы.NET (app.config, settings.settings), чтобы сохранить и восстановить все данные приложения?

Наблюдение, поскольку у Вас только есть 30 кодов ошибки, код Ваша собственная таблица переходов, тогда Вы делаете весь выбор оптимизации сами (переход всегда будет самым быстрым), вместо того, чтобы надеяться, что компилятор сделает правильную вещь. Это также делает код очень маленьким (кроме статического объявления таблицы переходов). Это также имеет дополнительную льготу, что с отладчиком можно изменить поведение во времени выполнения, должен Вы так нуждаться, только путем ввода по абсолютному адресу данных таблицы непосредственно.

7
задан Community 23 May 2017 в 12:17
поделиться

5 ответов

Поскольку я не получил других ответов и не был доволен своим предыдущим решением, я снова задал вопрос, провел дополнительное исследование и смог придумайте лучший ответ. См. Как динамически загрузить отдельный файл настроек приложения и объединить его с текущими настройками? для кода и объяснения.

2
ответ дан 7 December 2019 в 03:16
поделиться

Поскольку ваш файл app.config является простым файлом xml, вы можете загрузить его в XDocument:

string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
XDocument doc = XDocument.Load(path);
//Do your modifications to section x
doc.Save(path);
ConfigurationManager.RefreshSection("x");

Я исправил код XDocument.Load () в соответствии с комментарием @ Pat

3
ответ дан 7 December 2019 в 03:16
поделиться

Рекомендуется НЕ записывать в app.config, а использовать файл настроек для сохранения измененных пользовательских настроек. App.config и web.config следует использовать только для значений только для чтения.

3
ответ дан 7 December 2019 в 03:16
поделиться

Я не думаю, что переопределение всего файла конфигурации - хорошая идея. Некоторые из настроек в этом файле могут содержать настройки, которые должны быть обработаны очень рано, прежде чем какой-либо из ваших кодов сможет что-либо сделать, например, те, которые связаны с запуском .NET CLR.

1
ответ дан 7 December 2019 в 03:16
поделиться

Благодаря предложению Ману просто прочитать файл как XML, я вместе взломал это решение . (Он работает только в текущей форме для свойств, сохраненных в виде строк, таких как свойство Text TextBox. Это не будет работать, например, если вы сохраните свойство Value элемента управления NumericUpDown.) Он работает с использованием экспорта с путь к файлу для сохранения, в результате чего создается файл следующего вида:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <HawkConfigGUI.Properties.Settings>
            <setting name="FpgaFilePath" serializeAs="String">
                <value>testfpga</value>
            </setting>
            <setting name="FirmwareFilePath" serializeAs="String">
                <value>test</value>
            </setting>
        </HawkConfigGUI.Properties.Settings>
    </userSettings>
</configuration>

Затем вы импортируете файл, и все настройки в приложении изменяются (не забудьте в какой-то момент использовать .Save ()). Если что-то пойдет не так, настройки вернутся обратно.

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using AedUtils;

namespace HawkConfigGUI
{
    public static class SettingsIO
    {
        private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();

        internal static void Import(string settingsFilePath)
        {
            if (!File.Exists(settingsFilePath))
            {
                throw new FileNotFoundException();
            }

            var appSettings = Properties.Settings.Default;
            try
            {
                // Open settings file as XML
                var import = XDocument.Load(settingsFilePath);
                // Get the <setting> elements
                var settings = import.XPathSelectElements("//setting");
                foreach (var setting in settings)
                {
                    string name = setting.Attribute("name").Value;
                    string value = setting.XPathSelectElement("value").FirstNode.ToString();

                    try
                    {
                        appSettings[name] = value; // throws SettingsPropertyNotFoundException
                    }
                    catch (SettingsPropertyNotFoundException spnfe)
                    {
                        _logger.WarnException("An imported setting ({0}) did not match an existing setting.".FormatString(name), spnfe);
                    }
                    catch (SettingsPropertyWrongTypeException typeException)
                    {
                        _logger.WarnException(string.Empty, typeException);
                    }
                }
            }
            catch (Exception exc)
            {
                _logger.ErrorException("Could not import settings.", exc);
                appSettings.Reload(); // from last set saved, not defaults
            }
        }

        internal static void Export(string settingsFilePath)
        {
            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            config.SaveAs(settingsFilePath);
        }
    }
}
0
ответ дан 7 December 2019 в 03:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: