【问题标题】:Strange case of settings in app.config file and underlying classapp.config 文件和基础类中设置的奇怪案例
【发布时间】:2020-02-23 07:25:11
【问题描述】:

这很奇怪。

我创建了一个带有一些设置的 app.config 文件。

Visual Studio 创建一个类来“轻松”管理设置,但由于某种原因,当我调用时

Properties.Settings.Default.UrlImportacion

检索默认设置(在设计时设置的设置)。当我更改 app.config 文件中的值时,只会检索默认值。

我尝试在 applicationSettings 组和 userSettings 组中添加设置。不管我做什么,系统总是得到默认设置。

对此有解释吗?

谢谢 詹姆

【问题讨论】:

  • 您是否在运行应用程序之前更改了 app.config 文件?
  • @ChetanRanpariya 是的。为了暂时解决问题,我必须使用我需要的设置来构建项目。顺便说一句,这是一个类库项目。我在 .exe 项目的 app.config 文件中所做的所有更改。

标签: c# console-application app-config


【解决方案1】:

应用程序范围的设置是只读的,可以在设计时或通过在应用程序会话之间更改 .config 文件来更改。

用户范围的设置可以在运行时编写,但是如果您更改/删除/添加设置,您需要调用Properties.Settings.Default.Save(); 方法来保存您对应用程序会话之间设置的更改;否则每次检测到更改时设置可能会被清除。

要检查您的更改是否保留,您可以找到存储在此处%userprofile%\appdata\local%userprofile%\Local Settings\Application Data 的用户设置。

更新

如果我理解你,这个解决方案对你有用。

我试图通过将 bin 文件夹的内容复制到新项目并手动更改 ProjectName.exe.configApp.config 文件来模拟您的情况,Color 的默认值(在旧项目中)是 Green 但我的预期值是Purple

此部分是我添加到 ProjectName.exe.configApp.config 文件中的内容

<userSettings>
    <Namespace.Properties.Settings>
      <setting name="Color" serializeAs="String">
        <value>Purple</value>
      </setting>
    </Namespace.Properties.Settings>
</userSettings>

上面的Properties.Settings.Default.Color的输出是Green

但是为什么会这样呢?因为默认值是缓存的,如果框架无法访问或打开config 文件,它将使用默认值。

显然问题有解决办法。您可以通过在尝试读取值之前调用Reload 方法来解决它:

Properties.Settings.Default.Reload();
var color = Properties.Settings.Default.Color;

its documentation中所述:

Reload 方法会清除当前缓存的属性值,从而在随后访问这些值时从持久存储中重新加载这些值。此方法执行以下操作:

  • 它通过清除由 PropertyValues 属性表示的集合来清除当前缓存的属性。

  • 它为 Properties 集合的每个成员引发 PropertyChanged 事件。

Reload 与Reset 的不同之处在于前者将加载最后一组保存的应用程序设置值,而后者将加载保存的默认值。

【讨论】:

  • 您好...也许问题不清楚。但是,我正在手动更改 app.config 文件的内容......在启动应用程序之前。
  • 如果您正在编辑 bin 目录中的 app.config,则在每次构建时都会被覆盖。您应该检查我在答案中提到的目录。
  • 目前还不清楚。我正在部署应用程序。在我构建应用程序之后,当然 .config 文件会被覆盖。然后,我取出所有 bin 文件夹内容,在其他计算机上创建一个文件夹并将文件放入其中。最后,我需要使用其他计算机所需的参数来配置系统。 .config 文件的目标恰恰是,能够在不重新编译嵌入目标设置的情况下配置系统。我希望现在很清楚。
  • 很可惜但是没用,不过这和类库项目有关。我有一个控制台应用程序和一个类库项目。为了测试,我更改了应用程序的 app.config 文件中的设置并开始调试。通过使用即时窗口,我意识到无需调用 reload() 方法即可正确检索设置。那是完美的。但是,我调用了一个类库方法,并且得到了更改后的属性值。检索到的值是默认值。然后,我调用了 reload() 方法,同样如此。类库项目不喜欢。
  • 谢谢!!最后我想通了。我已经阅读了您发布的有关合并文件的链接,刚才我意识到我的错误。问题是 exe app.config 文件中使用的命名空间。我一直在使用 。我必须使用的是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2011-03-27
  • 1970-01-01
相关资源
最近更新 更多