“vshost32.exe 已停止工作”





5.00/5 (5投票s)
这是开发人员经常遇到并询问的常见错误之一:vshost32.exe 已停止工作。
问题陈述
当我运行我的项目(或特定用例)时,它会显示一个错误:vshost32.exe 已停止工作。
评估
vshost
是 在 Visual Studio 2005 中引入的(仅用于 VS)。这些是文件名中包含 vshost 的文件,它们位于应用程序的输出(默认 bin)文件夹下。它是我们在 Visual Studio 中构建项目时创建的“托管进程”。
它具有以下核心职责
- 提供对改进的 F5 性能的支持:为了使用
F5 命令
在调试模式下运行托管应用程序,Visual Studio 需要一个AppDomain
来为运行时环境提供一个应用程序可以运行的地方。创建AppDomain
并初始化调试器需要花费很多时间。托管进程通过在点击 F5 之前在后台完成所有这些工作来加速此过程,并在应用程序的多次运行之间保持状态。 - 用于部分信任调试:要在调试器下模拟 Visual Studio 中的部分信任环境,需要对
AppDomain
进行特殊初始化。这由托管进程处理。 - 用于设计时表达式评估:无需实际运行应用程序即可从
即时窗口
测试应用程序中的代码。托管进程用于在设计时表达式评估下执行代码。
更多详细信息可以在 此处 阅读。
通过上述细节,在通过此 AppDomain
与操作系统交互时可能会出现问题,从而导致错误。
可能的解决方案
通常,这将是确定问题是否专门由于 Visual Studio 托管进程引起的,或者是否存在与其他与 vshost 交互的问题。
场景 1
是 64 位操作系统,应用程序配置为构建为 AnyCPU,但我们仍然收到错误。
试试
32 位/64 位问题通常与操作系统功能和不同的位置有关。在构建配置中有一个设置可以驱动为 AnyCPU 设置调试器的行为。您需要关闭(取消选中复选框)Prefer 32 bit(首选32位) 标志才能在 64 位模式下运行。
现在,即使进行了上述更改,我们仍然可能遇到 32/64 位区域内的问题。这就是 vshost 仍在发挥作用的地方。与上述情况无关,vshost 继续以 32 位模式(平台配置 AnyCPU)工作。现在,当托管进程启用时,对某些 API 的调用可能会受到影响。在这些情况下,有必要禁用托管进程以返回正确的结果。有关如何在“调试”选项卡中将其关闭的详细信息:如何禁用托管进程
通过上述更改,AnyCPU 配置将等同于应用程序作为平台目标 x64 配置。
场景 2
应用程序配置为构建为 x86(或 AnyCPU)。
试试
如果工作流程与第三方相关,对于 32 位应用程序,请使用 32 位运行时,无论操作系统是 32 位还是 64 位。
场景 3
应用程序正在为涉及非托管程序集的特定代码工作流程抛出错误。
试试
如果工作流程包括对外部程序集(在 CLR
之外执行的非托管代码)的互操作调用,则可能不正确地使用了该函数。我见过一些例子,其中错误的返回类型会导致 vshost
错误。外部 DLL 的返回类型不能是 string
,它必须是 IntPtr
。
[DllImport("Some.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr SomeMethod();
场景 4
应用程序正在为特定代码工作流程抛出错误,该工作流程属于托管代码(由 CLR
)。
试试
可能是该过程在执行该特定工作流程时花费了时间。如果该过程长时间处于繁忙状态,则可能会抛出错误。其中一个解决方案是尝试在 BackgroundWorker
线程上执行整个长时间运行的操作,并释放 UI 线程。
结论
只要我们不在乎,我们就可以关闭 vshost
。拥有与应用程序预期运行相同的调试环境(32/64 位)总是有帮助的。我们应该意识到与第三方程序集或非托管程序集完成的操作,并拥有与应用程序交互的正确代码/文件集。
祝您故障排除愉快!