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 的路径是否正确。
出现意外的 "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 的路径是否正确。