gpt4 book ai didi

.net - 如何动态加载单独的应用程序设置文件并与当前设置合并?

转载 作者:行者123 更新时间:2023-12-02 06:51:29 27 4
gpt4 key购买 nike

有与 reading settings from a separate config file 相关的问题和其他类似的问题,但我的问题特定于应用程序属性设置(即 <MyApplication.Properties.Settings> - 请参阅下面的 XML 文件)以及如何动态加载它们。我尝试了this post中的方法,其中涉及刷新主配置文件的整个 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.Message 是“根元素必须与引用文件‘appSettings’的部分的名称匹配(C:\myFile.xml 第 2 行)。”该文件是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<MyApplication.Properties.Settings>
<setting name="SineWaveFrequency" serializeAs="String">
<value>6</value>
</setting>
<setting name="SineWaveAmplitude" serializeAs="String">
<value>6</value>
</setting>
</MyApplication.Properties.Settings>
</userSettings>
</configuration>

有没有办法将此文件中的值导入到 MyApplication.Properties.Settings.Default类,框架处理所有 XML 反序列化,就像在应用程序启动时加载配置文件时那样?

最佳答案

嗯,这有效:

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 以从新用户获取这些值。配置文件。

关于.net - 如何动态加载单独的应用程序设置文件并与当前设置合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2389290/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com