知道啥会导致 Visual Studio 2013 中的“vshost32.exe 已停止工作”吗?

Posted

技术标签:

【中文标题】知道啥会导致 Visual Studio 2013 中的“vshost32.exe 已停止工作”吗?【英文标题】:Any idea what can cause "vshost32.exe has stopped working" in Visual Studio 2013?知道什么会导致 Visual Studio 2013 中的“vshost32.exe 已停止工作”吗? 【发布时间】:2016-07-09 06:42:34 【问题描述】:

我正在处理的 C# WPF 应用程序包含对非托管外部 DLL 的许多调用。正常运行应用程序时(即在 Visual Studio 调试器之外),对 DLL 的所有调用都按预期工作。但是,在 Visual Studio 2013 中进行调试时,调用 DLL 中的一个特定方法会使应用程序崩溃:

这是我导入方法的方式:

[DllImport("Client.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern string ClientGetVersion();

...这就是我调用 DLL 方法的方式:

try

  version = ClientGetVersion();

catch (Exception ex)

  // Error handling omitted for clarity...

Visual Studio 似乎在调试会话期间使用 vshost32.exe 进程托管应用程序 (VSHOST - the Hosting Process)。此外,“启用托管进程后,对某些 API 的调用可能会受到影响。在这种情况下,必须禁用托管进程才能返回正确的结果。” (请参阅 MSDN 文章 How to: Disable the Hosting Process)。在 Project > Properties... > Debug 中禁用“启用 Visual Studio 托管进程”选项,如下所示,确实可以解决问题:

有谁知道具体是什么导致了“...调用特定 API...”的问题?

【问题讨论】:

只需修复代码中的错误。返回类型不能是字符串,必须是 IntPtr。然后使用 Marshal.PtrToStringAnsi() 恢复字符串。 感谢@HansPassant 的快速回复 - 已经整理好了! 【参考方案1】:

vshost32.exe错误是由不正确的DllImport语句引起的——外部DLL的返回类型不能是字符串,必须是IntPtr。

以下是更正后的代码:

[DllImport("Client.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr ClientGetVersion();

...这是修改后的 DLL 方法调用:

string version;

try

  version = Marshal.PtrToStringAnsi(ClientGetVersion());


catch (Exception ex)

  // Error handling omitted for clarity...

感谢@HansPassant 的回答。

【讨论】:

【参考方案2】:

退出 Visual Studio 并以管理员模式重新启动。好用!!!

【讨论】:

以上是关于知道啥会导致 Visual Studio 2013 中的“vshost32.exe 已停止工作”吗?的主要内容,如果未能解决你的问题,请参考以下文章

React-Native:啥会导致模块为空?

是否可以知道在 Visual Studio 2013 中加载了多少个类型的对象

求助visual studio2013怎么设置参考线,以及怎么自定义代码配色

字符串格式 %02d 未按预期执行?啥会导致以下代码不打印截断的两位数形式?

Visual Studio 2013 自动恢复断点和书签

是啥导致 Visual Studio 调试器使某些问题无法重现?