1

我的目标是以编程方式更新属于另一个应用程序的 .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...

这些数据是什么,它来自哪里?更重要的是如何阻止它被写入我的文件?

4

2 回答 2

0

我解决这个问题的方法是将机器配置文件设置为与我的 EXE 配置文件相同,这样 .net 配置对象在保存时不会看到机器和 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);

这样,您不应该在保存时获取配置文件中的部分。

于 2013-08-08T17:07:14.580 回答
0

尝试从更改 ConfigurationSaveMode

ConfigurationSaveMode.Minimal 

ConfigurationSaveMode.Modified

已修改仅保存您已更改的属性。

来自 MSDN:

Full
将所有属性写入配置文件。这主要用于创建信息配置文件或将配置值从一台机器移动到另一台机器。

Minimal
仅将与继承值不同的属性写入配置文件。

Modified
仅将修改后的属性写入配置文件,即使该值与继承的值相同。

于 2013-07-23T08:33:32.917 回答