Как загрузить отдельное приложение файл Настроек динамично и слияние с текущими настройками?

Существуют вопросы, имеющие отношение к настройкам чтения из отдельного файла конфигурации и других, подобных ему, но мой вопрос характерен для настроек свойства приложения (т.е. - посмотрите XML-файл ниже), и как загрузить их динамично. Я попробовал метод в этом сообщении, которое включило обновление всего appSettings раздела основного файла конфигурации, но моя адаптация выдала исключения, потому что я не заменял раздел appSettings:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
// Have tried the other ConfigurationUserLevels to no avail
config.AppSettings.File = myRuntimeConfigFilePath;
config.Save(ConfigurationSaveMode.Modified); // throws ConfigurationErrorsException
ConfigurationManager.RefreshSection("userSettings");

ConfigurationErrorsException. Сообщение является "Корневым элементом, должен соответствовать названию раздела, ссылающегося на файл, 'appSettings' (C:\myFile.xml строка 2)". Файл:



    
        
            
                6
            
            
                6
            
        
    

Есть ли способ импортировать значения из этого файла в MyApplication.Properties.Settings.Default класс, с платформой, обрабатывающей всю десериализацию XML как он, делает, когда файл конфигурации загружается на запуске приложения?

9
задан Community 23 May 2017 в 11:52
поделиться

1 ответ

Что ж, это работает:

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

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

        var appSettings = Properties.Settings.Default;
        try
        {
            var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);

            string appSettingsXmlName = 
Properties.Settings.Default.Context["GroupName"].ToString(); 
// returns "MyApplication.Properties.Settings";

            // Open settings file as XML
            var import = XDocument.Load(settingsFilePath);
            // Get the whole XML inside the settings node
            var settings = import.XPathSelectElements("//" + appSettingsXmlName);

            config.GetSectionGroup("userSettings")
                .Sections[appSettingsXmlName]
                .SectionInformation
                .SetRawXml(settings.Single().ToString());
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("userSettings");

            appSettings.Reload();
        }
        catch (Exception) // Should make this more specific
        {
            // Could not import settings.
            appSettings.Reload(); // from last set saved, not defaults
        }
    }

    internal static void Export(string settingsFilePath)
    {
        Properties.Settings.Default.Save();
        var config = 
ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal);
        config.SaveAs(settingsFilePath);
    }
}

Метод экспорта создает файл, подобный следующему:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <userSettings>
        <MyApplication.Properties.Settings>
            <setting name="SineWaveFrequency" serializeAs="String">
                <value>1</value>
            </setting>
            <setting name="SineWaveAmplitude" serializeAs="String">
                <value>100</value>
            </setting>
            <setting name="AdcShift" serializeAs="String">
                <value>8</value>
            </setting>
            <setting name="ControlBitsCheckedIndices" serializeAs="String">
                <value>0,1,2,3,5,6,7,8</value>
            </setting>
            <setting name="UpgradeSettings" serializeAs="String">
                <value>False</value>
            </setting>
        </MyApplication.Properties.Settings>
    </userSettings>
</configuration>

Метод импорта анализирует этот файл, берет все внутри узла, помещает этот XML в файл user.config в соответствующем месте , затем перезагружает Properties.Settings.Default, чтобы получить эти значения из нового файла user.config.

7
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

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