我有一个配置文件app.exe.config和appSettings部分有这样的:
<configuration>
<appSettings configSource="app.file.config" />
</configuration>
Run Code Online (Sandbox Code Playgroud)
app.file.config文件有这样的东西:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
我需要在运行时编辑var1,var2和var3,我有这样的代码:
Configuration config = ConfigurationManager.OpenExeConfiguration("...path\app.exe);
config.AppSettings.SectionInformation.ConfigSource = "app.file.config";
config.AppSettings.Settings["var1"].Value = "value 11";
config.AppSettings.Settings["var2"].Value = "value 22";
config.AppSettings.Settings["var3"].Value = "value 33";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
Run Code Online (Sandbox Code Playgroud)
当我运行config.Save ....文件app.file.config有一个appSettings节点,其属性为"file".此属性具有app.file.config的值
<appSettings file="app.file.config">
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试加载配置文件,我有一个例外,消息"无法识别的属性'文件'.请注意,属性名称区分大小写." 在app.file.config中.
如果手动删除文件属性,则会正确加载配置文件.
有任何想法吗?
保存配置文件时如何避免写入文件属性.
谢谢
小智 12
使用外部配置文件对于应用程序是透明的,
这部分还可以
</configuration>
<appSettings configSource="app.file.config" />
</configuration>
Run Code Online (Sandbox Code Playgroud)
还有这个:
<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
将代码更改为:
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
config.AppSettings.Settings["var1"].Value = "value 11";
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
Run Code Online (Sandbox Code Playgroud)
引用外部配置文件对应用程序是透明的,因此您不必直接调用它.您可以使用配置管理器中的默认appSetting部分.
祝好运
一个更完整的答案,以防止混淆:
设置:
app.exe.config 文件,App.config:
<appSettings file="App.Settings.config"></appSettings>
Run Code Online (Sandbox Code Playgroud)带有“复制到输出目录”=“始终复制”的 App.Settings.config 文件
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="test" value="OVERRIDDEN"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)程序.cs:
static void Main(string[] args)
{
try
{
Console.WriteLine("Local Config sections");
var exepath = (new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase)).LocalPath;
Configuration config = ConfigurationManager.OpenExeConfiguration(exepath);
config.AppSettings.SectionInformation.ConfigSource = "App.Settings.config";
Console.WriteLine("BEFORE[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine($"BEFORE[testExternalOnly]={config.AppSettings.Settings["testExternalOnly"]?.Value}");
//to avoid: Error CS0266
//Explicitly cast 'System.Configuration.AppSettingsSection'
AppSettingsSection myAppSettings = (AppSettingsSection)config.GetSection("appSettings");
myAppSettings.Settings["test"].Value = "NEW";
if (!myAppSettings.Settings.AllKeys.Contains("testExternalOnly"))
myAppSettings.Settings.Add("testExternalOnly", "NEWEXTERNAL");
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
//Read updated config
Console.WriteLine("AFTER[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine("AFTER[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value);
Console.WriteLine("AFTER CONFIG EXTERNAL FILE: " + System.IO.File.ReadAllText("App.Settings.config"));
Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config"));
//Shut current config
config = null;
//Open config
config = ConfigurationManager.OpenExeConfiguration(exepath);
config.AppSettings.SectionInformation.ConfigSource = "App.Settings.config";
Console.WriteLine("AFTER[test]=" + config.AppSettings.Settings["test"].Value);
Console.WriteLine("AFTER[testExternalOnly]=" + config.AppSettings.Settings["testExternalOnly"].Value);
Console.WriteLine("AFTER CONFIG EXTERNAL FILE: " + System.IO.File.ReadAllText("App.Settings.config"));
Console.WriteLine("AFTER CONFIG FILE: " + System.IO.File.ReadAllText(System.AppDomain.CurrentDomain.FriendlyName + ".config"));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("press the ENTER key to end");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)这将导致 App.Settings.config 文件更新到文件系统上,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="test" value="NEW" />
<add key="testExternalOnly" value="NEWEXTERNAL" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
将配置文件声明如下:
<appSettings configSource="app.file.config">
<add key="var1" value="value 1" />
<add key="var2" value="value 2" />
<add key="var3" value="value 3" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
并从代码中
Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
AppSettingsSection myAppSettings = config.GetSection("appSettings")
myAppSettings.Settings["var1"].Value = "value 11";
config.Save(ConfigurationSaveMode.Modified);
Run Code Online (Sandbox Code Playgroud)
请注意,我使用 GetSection("appSettings") 而不是 config.AppSettings.Settings
感谢 StackOverflow 中所有帮助人们的人。
| 归档时间: |
|
| 查看次数: |
12980 次 |
| 最近记录: |