1

出现意外的“无法启动此应用程序”弹出错误,提示 .NET CLR 中出现 SHIM_NOVERSION_FOUND 错误。这是发生了什么...

我有两个 vb.net 应用程序:

1- MyApp.exe -- Windows 窗体应用程序
2- Launcher.exe -- Windows 服务

两者都是 .NET 框架 4.5 应用程序,Launcher.exe 嵌入在 MyApp.exe 中。两者都针对 AnyCPU 进行了配置,并且都不使用 app.config 文件。原因是交付工具只能交付单个文件,所以我不能包含任何额外内容。可执行文件必须是自包含的,并且不能嵌入 app.config 文件。

执行在以下层中运行:

第 1 层:交付工具

  • 本机 C++ 应用程序
  • 提升,作为本地系统帐户运行

第 2 层:MyApp.exe

  • .NET 4.5 应用程序
  • 提升,作为本地系统帐户运行
  • 它运行良好,并将 Launcher.exe 作为新的 Windows 服务安装。

第 3 层:Launcher.exe

  • .NET 4.5 Windows 服务
  • 提升,作为本地系统帐户运行
  • 使用 Windows API 调用来启用以下权限:SE_INCREASE_QUOTA_NAME、SE_ASSIGNPRIMARYTOKEN_NAME、SE_TCB_NAME
  • 总之,它使用提升的权限来搜索 Explorer.exe 进程,打开它们,复制用户的安全令牌,并使用用户的令牌调用 CreateProcessAsUser() API,以便启动 MyApp.exe 的第二个副本,运行在用户的桌面上。

第 4 层:MyApp.exe

  • .NET 4.5 应用程序
  • 无法启动并出现弹出错误 --> 无法启动此应用程序。
  • 它是 MyApp.exe 的副本,与第 2 层相同。

我启用了 .NET CLR 调试来比较 MyApp.exe 在第 2 层和第 4 层的加载:

第二层:
6172,1589.119,解析配置文件:C:...\MyApp.exe.config
6172,1589.119,配置文件(打开)。结果:80070002
6172,1589.119,UseLegacyV2RuntimeActivationPolicy 设置为 0
6172,1589.119,LegacyFunctionCall:GetFileVersion。文件名:C:...\MyApp.exe
6172,1589.119,LegacyFunctionCall:GetFileVersion。文件名:C:...\MyApp.exe
6172,1589.119,C:...\MyApp.exe 构建版本:v4.0.30319
6172,1589.166,运行时决定:v4.0.30319

第4层:
6552,1594.704,解析配置文件:C:\windows\TEMP\MyApp.exe.config
6552,1594.704,配置文件(打开)。结果:80070002
6552,1594.704,UseLegacyV2RuntimeActivationPolicy 设置为 0
6552,1594.704,LegacyFunctionCall:GetFileVersion。文件名:C:\windows\TEMP\MyApp.exe


6552,1594.704,错误:找不到要使用的运行时版本。
6552,1594.704,SEM_FAILCRITICALERRORS 设置为 5
6552,1688.055,FunctionCall: RealDllMain。原因:0
6552,1688.055,函数调用:OnShimDllMainCalled。原因:0

随机事实:

  • 这不会发生在所有目标计算机上。
  • 禁用防病毒软件无法在受影响的系统上解决。
  • 在某些计算机上,错误只发生一次,后续执行不会重现弹出错误。

寻求任何帮助以了解或调试为什么 .NET CLR 无法确定要使用的运行时版本,而同一应用程序已经成功启动!

4

1 回答 1

0

对于作为 LocalSystem 运行的 Windows 服务和我试图通过复制与活动会话 (WTSQueryUserToken) 相关的用户令牌来使用 CreateProcessAsUser 运行的 WPF 应用程序,我遇到了同样的问题。手动运行 .exe 时它可以工作,但是当服务尝试创建进程时,我一直收到“无法启动此应用程序”。我也得到了与您相同的 CLR 日志,显示“错误:无法找到要使用的运行时版本。”。

这些是我做过的事情:

  • 将 OnlyUseLatestCLR 注册表值设置为 1
  • 对映射驱动器使用 UNC 路径(我在 Windows VM 中运行,由于某种原因,系统在加载应用程序后找不到配置文件的路径)

首先检查您传递给 CreateProcessAsUser 的路径是否正确。

于 2018-02-24T10:10:32.353 回答