vb.net CLR/SHIM error: This application could not be started. --> Unable to find a version of the runtime to use

vb.net CLR/SHIM error: This application could not be started. --> Unable to find a version of the runtime to use

出现意外的 "This application cannot be started" 弹出错误,提示 .NET CLR 中有 SHIM_NOVERSION_FOUND 错误。这是正在发生的事情...

我有两个 vb.net 申请:

1- MyApp.exe -- Windows Forms App
2- Launcher.exe -- Windows Service

两者都是 .NET framework 4.5 应用程序,Launcher.exe 嵌入在 MyApp.exe 中。两者都为 AnyCPU 配置,并且都不使用 app.config 文件。原因是传送工具只能传送一个文件,所以我不能包含任何额外的东西。可执行文件必须是独立的,不能嵌入 app.config 文件。

执行在以​​下层中运行:

第 1 层:交付工具

  • Native C++ application
  • Elevated, running as Local System Account

第 2 层:MyApp.exe

  • .NET 4.5 application
  • Elevated, running as Local System Account
  • It runs fine, and installs Launcher.exe as a new Windows Service.

第 3 层:Launcher.exe

  • .NET 4.5 Windows Service
  • Elevated, running as Local System Account
  • Uses Windows API calls to enable the following privileges: SE_INCREASE_QUOTA_NAME, SE_ASSIGNPRIMARYTOKEN_NAME, SE_TCB_NAME
  • In summary, it uses elevated privileges to search for Explorer.exe processes, open them, duplicate the user's security token, and call the CreateProcessAsUser() API, using the user's token, in order to launch a second copy of MyApp.exe, running on the user's desktop.

第 4 层:MyApp.exe

  • .NET 4.5 application
  • Fails to launch with popup error --> This application could not be started.
  • It's A COPY of MyApp.exe, same as layer 2.

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

第 2 层:
6172,1589.119,解析配置文件:C:...\MyApp.exe.config
6172,1589.119,配置文件(打开)。 Result: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,配置文件(打开)。 Result: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,函数调用:RealDllMain。原因:0
6552,1688.055,FunctionCall: OnShimDllMainCalled。原因:0

随机事实:

  • This doesn't happen on all computers targeted.
  • Disabling the antivirus doesn't resolve on affected systems.
  • On some computers, the error only happens once, and subsequent executions do not reproduce the popup error.

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

我遇到了与 Windows 服务 运行ning 作为 LocalSystem 和 WPF 应用程序相同的问题,我试图通过复制属于活动会话(WTSQueryUserToken)。当 运行 手动安装 .exe 时,它​​工作正常,但是当服务试图创建进程时,我一直收到 "This application could not be started"。 "ERROR: Unable to find a version of the runtime to use.".

我也得到了和你一样的 CLR 日志

这些是我做过的事情:

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

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