65.9K
CodeProject 正在变化。 阅读更多。
Home

“vshost32.exe 已停止工作”

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2020年9月5日

CPOL

4分钟阅读

viewsIcon

5413

这是开发人员经常遇到并询问的常见错误之一: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 位)总是有帮助的。我们应该意识到与第三方程序集或非托管程序集完成的操作,并拥有与应用程序交互的正确代码/文件集。

祝您故障排除愉快!

.

© . All rights reserved.