知道啥会导致 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 已停止工作”吗?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以知道在 Visual Studio 2013 中加载了多少个类型的对象
求助visual studio2013怎么设置参考线,以及怎么自定义代码配色