(InstallShield) 如果不是 运行 管理员,WPF 可执行文件调用错误的 dll 版本

(InstallShield) WPF Executable Calls wrong dll version if not run as administrator

我的可执行项目有一个非常奇怪的问题。我在发布模式 (x86) 中使用 InstallShield 创建了这个包。

最近这个已部署的可执行文件开始表现异常(我尝试回滚并找出原因,但这没有任何帮助)。当我通过我的 InstallShield 项目创建我的可执行文件时,它看起来像 id 期望的那样。

我遇到的问题是 运行 应用程序。如果我 运行 作为管理员,我可以登录并 运行 一切如预期。但是,如果我不 运行 作为管理员,我会收到以下错误(在第一次提到使用 class 使用 newtonsoft.json.dll:

[System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' ---> System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) File name: 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'

WRN: Assembly binding logging is turned OFF. To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1. Note: There is some performance penalty associated with assembly bind failure logging. To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

at System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor() at Player.Services.DataService.UploadLogToServer(AuditDTO record)
at Player.Controller.PlayerControls.logInfo(String eventCode, String information, String className, Exception e)

]

如果我 运行 作为管理员,我根本看不到这一点。对于围绕 dll 被错误引用等的类似问题,我尝试了多个答案的许多解决方案。None 这些解决方案产生了影响。我没有任何这些版本的参考资料。我目前使用的是版本 10.0.0.0(Nuget 包 10.0.3),我也尝试使用版本 9.0 来满足版本 9 的错误。这也与上面的结果相同。我已经检查过它是我的 .net 框架的正确 dll 和版本,我已经尝试了 50 多次卸载它然后重新安装它,更新它,手动引用它。

我已尝试更改我电脑上所有用户的安全权限,以授予 everything/everyone 对部署我的可执行文件的所有文件夹的完全访问权限。同样,这也没有解决问题。

我还尝试从 PC 的明显位置清除所有其他对 newtonsoft.json.dll 的引用,以及任何和所有临时文件夹、隐藏文件夹、visual studio 和包含任何相关内容的 Microsoft 文件夹我的项目或 newtonsoft.json.dll.

我清除了我所有的构建(调试和发布文件夹),我的整个解决方案文件夹都被清理并重建了,我仍然 none 更清楚发生了什么以及如何解决这个问题。

重要提示: 当我构建我的项目(发布模式)时,我能够从我的项目的 bin/x86/release 文件夹中按预期(普通用户)运行 exe 而不会发生错误。这让我相信这可能与 install shield 或我的 installshield 配置有关?不确定,但这可能是有用的信息。

任何建议、想法或者如果有人遇到类似的问题并修复它,我将不胜感激你可以在下面给我的任何意见和建议。



更新:

Eugene B 的回答帮助解决了这个问题。尽管该修复可能不是最佳做法,而且我仍然不确定为什么会发生这种情况或如何发生,甚至不确定根本问题是什么,但我将在下面分享我是如何解决该问题的:

感谢您的建议。不幸的是,日志没有提供任何有用的信息。似乎确实添加了一个不在我的机器上或在我的项目中的任何地方引用的版本。你回答的最后一部分帮助我解决了这个问题。我将dll参考版本:9.0.0.0直接添加到installshield文件中。然后我决定将 wpf 项目中的 dll 版本 10.0.0.0 回滚到版本 9。最后它 运行 再次以管理员和普通用户身份运行。不过,我很想找出根本问题所在。非常感谢!!

如果有人知道或理解问题的根本原因是什么以及为什么 installshield le 要求此文件的版本 9,请在下面回答或添加评论。

查看InstallShield 项目编译日志。如果您的项目中没有明确列出程序集,并且如果 InstallShield 确定它是需要添加的依赖项,它会为您添加它,并且会在其编译日志中创建一个条目(通常位于子目录中\日志文件)。它可能添加了一个目标机器上不存在的版本,或者位于具有不同访问级别的目录中,因此只有管理员可以访问它。如果您还没有,请尝试将程序集显式添加到 InstallShield (InstallScript) 项目。