vshost32.exe停止工作

 

问题陈述

当我运行项目(或特定用例)时,它显示错误:vshost32.exe已停止工作

评定

vshostVisual 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)总是有帮助的。我们应该认识到第三方程序集或非托管程序集所做的操作,并拥有与应用程序交互的正确的代码/文件集。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值