Vb.net 没有app.config的已部署.net应用程序-从何处获取其设置以及如何更改它们?

Vb.net 没有app.config的已部署.net应用程序-从何处获取其设置以及如何更改它们?,vb.net,winforms,app-config,Vb.net,Winforms,App Config,我有一个带有已部署Winforms应用程序的客户端。由于应用程序的原始开发人员出现问题,客户端终止了与开发人员的关系。一段时间后,该应用程序的缺陷发展到了一个地步,他们需要另一个开发人员来帮助-这就是当我进入图片。我发现的第一件事是他们没有源代码的副本!(编辑:有一些3年前的源代码副本。它们太不一样了,没有用处。) 尽管没有任何源代码,但我还是很好地结合使用了dnSpy(ILSpy的一个分支,带有集成调试器和其他附加功能)和直接编辑应用程序SQL server数据库中的数据(使用集成安全性进行保

我有一个带有已部署Winforms应用程序的客户端。由于应用程序的原始开发人员出现问题,客户端终止了与开发人员的关系。一段时间后,该应用程序的缺陷发展到了一个地步,他们需要另一个开发人员来帮助-这就是当我进入图片。我发现的第一件事是他们没有源代码的副本!(编辑:有一些3年前的源代码副本。它们太不一样了,没有用处。)

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


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

在谷歌做了一些调查后,我发现了user.config文件。然后,我在
%UserProfile%\AppData\Local\(CompanyName)\(AppName)(Hash)\1.0.0.0\
下找到了应用程序文件的user.config。我打开配置文件,找到了一个与我要查找的名称相同的设置,它的值为“2015”。尤里卡!。。。至少我是这么想的

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

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

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

所以。。。TLDR

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


应用程序从何处读取其设置?

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

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

另一个复杂原因是缺少appname.exe.config文件。因为配置文件不在那里,所以应用程序使用“默认设置”——包括连接字符串。事实证明,应用程序从中读取初始设置的数据库是一个开发数据库。我通过使用在应用程序子文件夹中找到的ClickOnce部署中的.config文件副本解决了这个问题。(它比部署的.exe文件早了六个月,但我还是祈祷着试试看)。而且。。。成功了



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

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