我的目标是以编程方式更新属于另一个应用程序的.config文件。
我从一个看似这样的简单配置文件开始......
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Test1" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
然后我运行我的代码来更新名为Test1
的连接字符串,并将其重命名为Test2
...
var configMap = new ExeConfigurationFileMap() { ExeConfigFilename = @"test\app.config" };
var externalConfiguration = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
externalConfiguration.ConnectionStrings.ConnectionStrings[1].Name = "Test2";
externalConfiguration.Save(ConfigurationSaveMode.Minimal, true);
这会保存配置文件,但现在查看该文件,您会看到其中添加了一些其他数据......
ConfigurationSaveMode.Minimal
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Test2" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<trust level="Full" />
<webControls clientScriptsLocation="/aspnet_client/{0}/{1}/" />
</system.web>
</configuration>
ConfigurationSaveMode.Modified
使用修改后的设置我得到更多“东西”......
<configuration>
<appSettings />
<configProtectedData />
<system.diagnostics />
<system.windows.forms />
<uri />
<connectionStrings>
<add name="Test2" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.net>
<authenticationModules />
<connectionManagement />
<defaultProxy />
...snip...
这些数据是什么?它来自哪里?更重要的是如何阻止它被写入我的文件?
答案 0 :(得分:0)
尝试从
更改ConfigurationSaveModeConfigurationSaveMode.Minimal
到
ConfigurationSaveMode.Modified
修改仅保存您已更改的属性。
来自MSDN:
完整
导致将所有属性写入配置文件。这主要用于创建信息配置文件或将配置值从一台计算机移动到另一台计算机。
最小
仅导致与继承值不同的属性写入配置文件。
改性
仅将已修改的属性写入配置文件,即使该值与继承的值相同。
答案 1 :(得分:0)
我解决这个问题的方法是将机器配置文件设置为与我的EXE配置文件相同,这样.net配置对象在保存时没有看到Machine和EXE之间有任何区别。
例如:
var fm = new ExeConfigurationFileMap();
fm.MachineConfigFilename = fm.ExeConfigFilename = @"C:\dude.config";
var c = ConfigurationManager.OpenMappedExeConfiguration(fm, ConfigurationUserLevel.None);
// Do Stuff
c.Save(ConfigurationSaveMode.Minimal, true);
这样您就不应该在保存时获取配置文件中的部分。