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