获得意外,"无法启动此应用程序"弹出错误,该错误建议在.NET CLR中shim_noversion_found错误。这是正在发生的事情...
我有两个vb.net应用程序:
1- myapp.exe- Windows表单应用程序
2-启动器。EXE-Windows Service
两个都是.NET Framework 4.5应用程序,并且启动器exe嵌入了myApp.exe中。两者都是为AnyCPU配置的,都不使用App.Config文件。原因是交货工具只能交付一个文件,因此我不能包括任何附加文件。可执行文件必须是独立的,并且您不能嵌入app.config文件。
执行在以下层中运行:
第1层:交付工具
- 本机C 应用程序
- 抬高,作为本地系统帐户运行
第2层:MyApp.exe
- .NET 4.5应用程序
- 抬高,作为本地系统帐户运行
- 它运行良好,并将启动器.exe作为新的Windows服务安装。
第3层:启动器.exe
- .NET 4.5 Windows Service
- 抬高,作为本地系统帐户运行
- 使用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调试以比较2和4层myApp.exe的加载:
第2层:
6172,1589.119,解析配置文件:C:... myApp.exe.config
6172,1589.119,配置文件(OPEN)。结果:80070002
6172,1589.119,Uselegacyv2RuntimactivationPolicy设置为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,配置文件(OPEN)。结果:80070002
6552,1594.704,Uselegacyv2RuntimactivationPolicy设置为0
6552,1594.704,LegacyFunctionCall:GetFileversion。文件名:c: windows temp myapp.exe
6552,1594.704,错误:无法找到使用的运行时版本。
6552,1594.704,SEM_FAILCRICANIANTERRORS设置为5
6552,1688.055,functionCall:RealDllmain。原因:0
6552,1688.055,functionCall:OnshimdllMainCalled。原因:0
随机事实:
- 这并非在所有针对的计算机上发生。
- 禁用防病毒软件不能在受影响的系统上解决。
- 在某些计算机上,错误仅发生一次,并且后续执行不会重现弹出错误。
寻找任何帮助以理解或调试为什么.NET CLR无法确定要使用的运行时版本,而同一应用程序已经成功启动了!
我在运行的Windows服务与Localsystem和WPF应用程序中遇到了相同的问题,以及我试图使用CreateProcessAsuser运行的WPF应用程序,通过复制与Active会话(WTSqueryUserToken)相关的用户令牌。在手动运行.EXE时,它可以正常运行,但是当服务试图创建过程时,我一直收到"无法启动此应用程序"。我也获得了与您相同的CLR日志,其中"错误:找不到使用的运行时版本。"。
。这些是我完成的事情:
- 将OntaluseLatestClr注册表设置为1
- 使用UNC路径进行映射驱动器(我在Windows VM中运行,由于某种原因,系统在加载应用程序后找不到配置文件的路径) )
首先检查您要传递的路径是否正确。