【问题标题】:Deployed .net application without app.config - Where is it getting its settings from and how to change them?没有 app.config 的已部署 .net 应用程序 - 它从哪里获取设置以及如何更改它们?
【发布时间】:2016-07-06 15:29:21
【问题描述】:

我有一个部署了 Winforms 应用程序的客户端。由于应用程序的原始开发者出现问题,客户终止了与开发者的关系。一段时间后,该应用程序的缺陷达到了他们需要寻找另一位开发人员来帮助的地步——这就是我出现的时候。我发现的第一件事是他们没有源代码的副本! (编辑:有一些 3 年前的源代码副本。它们差别太大而无用。)

尽管没有任何源代码,但我使用 dnSpy(ILSpy 的一个分支,带有集成调试器和其他附加功能)和直接编辑应用程序的 SQL 服务器数据库中的数据(使用综合安全性)。然而,我遇到的最新问题是一个令人困惑的问题......


有一个屏幕,记录的显示仅限于 2015 年。在 dnSpy 的帮助下,我发现这个限制是从应用程序设置中检索到的。这是谜团之一:应用程序的部署文件夹中没有 app.config!

在进行一些 Google 研究时,我发现了有关 user.config 文件的信息。然后我在%UserProfile%\AppData\Local\(CompanyName)\(AppName)(Hash)\1.0.0.0\ 下发现了app 文件的user.config。我打开了配置文件,发现了一个与我正在寻找的名称相同的设置,它的值为“2015”。尤里卡!...至少我是这么认为的。

我将 user.config 中的设置更改为“2016”,但在我运行应用程序时它似乎没有影响。我再次查看了 user.config 文件,设置已更改回“2015”!所以看起来我有正确的 user.config 应用程序,因为它正在写入配置文件。它只是应用程序正在从其他地方读取其初始设置。

我已经排除了一些其他的事情:

  • 我检查了 machine.config。什么都没有。
  • 在反编译的 MySettings 文件中,我注意到设置属性字段上的 DefaultSettingValue 属性。不幸的是,我正在查看的设置的 DefaultSettingValue 为“2014”。所以它似乎没有使用设置的默认值。

所以... TLDR;

已部署的 .Net Winforms 应用程序。同一文件夹中没有匹配的 appname.exe.config 文件。它没有从 user.config 文件中读取设置(尽管它正在写入文件)。

应用程序可以从哪里读取其设置?

【问题讨论】:

  • 您可能找错地方了。查看Users\USER NAME\AppData\LOCAL\(CompanyName)\(AppName)(Hash)\VERSION(注意缺少的本地)。这似乎更有可能是一个应用程序设置
  • 实际上,这只是我原帖中的一个错字。 user.config 路径位于 AppData\\Local 下。感谢您发现这一点。
  • 您也可以使用 sysinternals 的 procmon 来查看应用程序访问了哪些文件。
  • 是的,仅仅因为您在“设置”中看到该值并不意味着它正在使用它。即使您看到代码读取它,也可能有其他代码从其他地方获取或计算它

标签: vb.net winforms app-config


【解决方案1】:

正如@Plutonix 所建议的那样,可能还有其他代码在设置中,而且确实如此。使用 Telerik JustDecompile 反编译整个 .exe 并将其保存到源文件中(不幸的是,生成的解决方案在 VS2015 中无法编译。因此对于应用程序问题的无源代码没有快速解决方案),我搜索了文本寻找其他参考到设置。

我在应用程序的登录表单中找到了它。在表单的加载事件期间,它会从数据库中读取一个值并将其分配给设置。成功登录后,将保存该设置和其他各种设置 (MySettingsProperty.Settings.Save()),从而更新 user.config。当您首先从数据库中读取此配置设置时,为什么要保存它?谁知道……哈哈。

另一个并发症是由于缺少 appname.exe.config 文件。由于配置文件不存在,应用程序使用“默认设置” - 包括连接字符串。事实证明,应用程序从中读取初始设置的数据库是开发数据库。我通过使用来自应用程序子文件夹中的 ClickOnce 部署的 .config 文件的副本解决了这个问题。 (比部署的 .exe 文件早了六个月,但我还是交叉手指尝试了一下)。而且……它奏效了!


总之,那里没有神秘的 .Net 配置系统机制。只是从我(最初)无法控制的数据库中读取设置的代码。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2010-11-04
    • 2021-11-26
    • 2010-09-07
    • 2013-08-09
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多