我有一个使用 Visual Studio 2008 的发布 (ClickOnce) 系统部署的 WinForms 应用程序。在应用程序的app.config
文件中,我有一个第三方组件所需的配置部分,其形式为:
<section name="thirdPartySection"
type="System.Configuration.NameValueSectionHandler" />
因此,该部分不在 appSettings 中,如下所示:
<thirdPartySection >
<add key="someKey" value="someValue" />
</thirdPartySection >
我了解键/值对是 NameValueCollection。我面临的问题是我希望在部署时间或运行时更改someValue
值(对我来说都可以),以便someOtherValue
基于安装的环境。
目前我在运行时进行了一些其他配置更改,但这些都在该AppSettings
部分中,因此很容易获得。我在寻找解决方案时发现了许多参考资料,但它们似乎依赖于具有自定义类的部分,而不是我面临的 NameValueCollection。
有谁知道修改此数据的最佳方法?使用 ConfigurationManager.RefreshSection() 进行运行时更改将更符合我当前的代码,但我也愿意在安装阶段接受建议。
编辑:这在运行时有效。这就是我处理旧配置覆盖的方式。
Configuration config = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
config.AppSettings.Settings["Main.ConnectionString"].Value =
PolicyTrackerInfo.ConnectionString;
config.AppSettings.Settings["Main.linq"].Value =
PolicyTrackerInfo.LinqConnectionString;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
我尝试对另一个部分做同样的事情:
string overwriteXml = config.GetSection("thirdPartySection")
.SectionInformation.GetRawXml();
XmlDocument xml = new XmlDocument();
xml.LoadXml(overwriteXml);
XmlNode node = xml.SelectSingleNode("thirdPartySection/add");
node.Attributes["value"].Value = PolicyTrackerInfo.OverwriteString;
到现在为止还挺好。但是,我没有看到允许我用修改后的数据替换旧 XML 的方法。在运行时可以吗?
顺便说一句:我尝试手动修改 app.config.deploy 文件。这只是给我一个验证错误,因为安装程序检测到修改并且它拒绝继续。我真的很喜欢自动部署,并且之前的覆盖效果很好。