我需要编辑不是代码运行的可执行文件的配置文件(exefilename.config)。 XML文件格式如下:
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XNet.XNetService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
<section name="XNetService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>
</configSections>
<applicationSettings>
<XNet.XNetService.Properties.Settings>
<setting name="DataSource" serializeAs="String">
<value>192.168.2.127</value>
</setting>
<setting name="DefaultPort" serializeAs="String">
<value>8085</value>
</setting>
<setting name="UserName" serializeAs="String">
<value>notiuser</value>
</setting>
<setting name="Password" serializeAs="String">
<value>6ITLet6k1HCOhgTmXI5C/1m1DrCQli8dIAKfdtP+o6w=</value>
</setting>
<setting name="Instance" serializeAs="String">
<value />
</setting>
<setting name="bindTo" serializeAs="String">
<value />
</setting>
</XNet.XNetService.Properties.Settings>
</applicationSettings>
我需要更改&#34; DefaultPort&#34;参数,&#34; DataSource&#34;等等。并在同一级别添加新的。我能怎么做?如果.config文件是我的可执行文件,使用简单的SettingsWriter会更容易,但在这种情况下我该怎么办?
答案 0 :(得分:1)
Web配置只是一个XML,为什么不把它当作一个呢?沿着这些方向的东西可以解决这个问题:
void ModifyConfig(string filepath, string xpath, string newValue)
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(filepath);
System.Xml.XmlNode elementToReplace = doc.DocumentElement.SelectSingleNode(xpath);
elementToReplace.InnerText = newValue;
doc.Save(filepath);
}
并称之为:
ModifyConfig("C:\\temp\\App.config",
"applicationSettings//XNet.XNetService.Properties.Settings//setting[@name='DefaultPort']//value",
"5000");
如果文件正在使用中,您可能会遇到问题。
答案 1 :(得分:0)
我按照Alex Nolasco的建议实现了此主题中描述的代码:Change default app.config at runtime。
但是当我尝试阅读下面描述的属性“Datasource”时,我仍然得到原始的.config值: - (
// the default app.config is used.
using (AppConfig.Change(exePath))
{
// the app.config in exePath is used
string test = Properties.Settings.Default.DataSource;
}
// the default app.config is used.
我有一个疑问:我要阅读的临时配置文件有不同的组合。这可能是问题吗?
这是AppConfig代码:
using System;
using System.Configuration;
using System.Linq;
using System.Reflection;
namespace XNet.XManager
{
public abstract class AppConfig : IDisposable
{
public static AppConfig Change(string path)
{
return new ChangeAppConfig(path);
}
public abstract void Dispose();
private class ChangeAppConfig : AppConfig
{
private readonly string oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
private bool disposedValue;
public ChangeAppConfig(string path)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
ResetConfigMechanism();
}
public override void Dispose()
{
if (!disposedValue)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig);
ResetConfigMechanism();
disposedValue = true;
}
GC.SuppressFinalize(this);
}
private static void ResetConfigMechanism()
{
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, null);
}
}
}
}