【问题标题】:Edit App.Config name-value pairs from a separate tool从单独的工具编辑 App.Config 名称-值对
【发布时间】:2012-11-30 18:55:33
【问题描述】:

我正在尝试为服务人员创建一个简单的工具来更新不同程序的 App.Config 中的一些条目。 App.Config 文件包含在我们的程序初始化时使用的自定义参数。

由于 App.Config 包含许多敏感项目,因此需要一个工具来确保仅更改某些参数。因此,不允许他们直接编辑 App.Config 的原因。

我的问题:

  1. 如何从单独的程序中访问 App.config 的配置部分中的名称-值对?
  2. 哪个更适合 UI:Winforms 还是 WPF?他们的控件是否便于将来添加更多条目?
  3. 该工具应允许用户设置 String、int、double 或 Boolean。

这里是 App.Config 的结构:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <sectionGroup name="Settings">
      <section name="Section1" type="System.Configuration.NameValueSectionHandler"/>
      <section name="Section2" type="System.Configuration.NameValueSectionHandler"/>
      <section name="Section3" type="System.Configuration.NameValueSectionHandler"/>
      <section name="Section4" type="System.Configuration.NameValueSectionHandler"/>
    </sectionGroup>
  </configSections>

  <Settings>
    <Section1>
      <add key="NAME_STRING" value="Some String"/>
    </Section1>

    <Section2>
      <add key="NAME_INTEGER" value="10"/>
    </Section2>

    <Section3>
      <add key="NAME_DOUBLE" value="10.5"/>
    </Section3>

    <Section4>
      <add key="NAME_BOOLEAN" value="true"/>
    </Section4>
  </Settings>

  ... Omitted ...

</configuration>

在使用 App.Config 本身的程序中,我可以像这样轻松更改值:

NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("Settings/Section1");

在加载 App.Config 后,是否有类似的方法可以从单独的程序中执行此操作?

【问题讨论】:

  • 请注意:您的问题 3 实际上并不是一个问题。关于设置这些类型的数据,您有什么想问的吗?
  • 啊,是的,很好!只是 UI 控件应该尽可能提供数据类型。如果有错误控制,例如在应该有整数的地方设置双精度,则会导致错误。
  • 您是否考虑过加密敏感部分?然后您可以让服务人员更改未加密的部分。这个link 有更多信息。
  • 感谢@DeanOC 的链接。下次我会注意这一点。不幸的是,目前我们无法更改 App.Config 程序。

标签: c# wpf winforms app-config


【解决方案1】:

问题 1 的答案:app.config 文件是一个 XML 文件。与使用System.Configuration 类相比,将其作为XML 文档加载并以编程方式对其进行修改,然后保存可能更容易。

ETA:我相信ConfigurationManager 可以做到。查看OpenMappedExeConfiguration 方法。那里有一个很好的例子。

【讨论】:

  • 谢谢安。我更新了 Q 以显示我们如何使用 ConfigurationManager 更新值。加载 XML 后有没有办法做到这一点?
  • 如果您的意思是“使用 XML 技术”,是的,您可以使用 LINQ for XML 来实现。如果您的意思是“使用 ConfigurationManager”,我不确定。可以使用它用另一个配置文件覆盖配置文件,但我不知道您是否可以即时编辑和保存配置文件。让我查一下。
  • 如果你找不到任何东西,你能举一个简单的例子,在这种情况下 LINQ 是如何工作的。我不熟悉LINQ。谢谢。
  • @RyanR 我已经更新了我的答案以包含一个示例链接。
  • 太棒了!该链接非常有用。
【解决方案2】:

您可以将 app.config 文件视为普通的 XML 文件。使用 XDocument 或 XmlDocument 加载文件。

然后使用 XPath 或 Linq to XML 查找名称-值对。

对于 Windows.Forms 与 WPF,这是一个设计决定。两者各有优劣。

[更新]

如果您仍想使用 System.Configuration,您可以使用ConfigurationManager.OpenExeConfiguration 来访问其他程序的 app.config 文件。这将返回一个Configuration 对象,该对象具有GetSection 方法。

【讨论】:

  • 我更新了 Q 以展示我们如何更新程序本身的值。是否有类似的方法可以从外部程序执行此操作?
  • 正如@Ann 和我所建议的,不要使用System.Configuration。只需将其视为 XML 文件即可。
  • 谢谢理查德。你能举一个简单的例子吗?如何使用 XPath 或 LINQ?
  • 感谢您的帮助 Richard,但我认为 Ann 将链接发布得更早一些。再次感谢!
  • 尝试谷歌搜索“c# xpath”或“c# linq to xml”
猜你喜欢
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多