出现意外的“无法启动此应用程序”弹出错误,提示 .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 无法确定要使用的运行时版本,而同一应用程序已经成功启动!