5

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

vshost32.exe 已停止工作

这就是我导入方法的方式:

[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 - 托管进程)。此外,“启用托管进程后,对某些 API 的调用可能会受到影响。在这种情况下,必须禁用托管进程才能返回正确的结果。” (请参阅 MSDN 文章如何:禁用托管进程)。在 Project > Properties... > Debug 中禁用“启用 Visual Studio 托管进程”选项,如下所示,确实可以解决问题:

在此处输入图像描述

有谁知道“......调用特定API......”具体可能导致这个问题的原因是什么?

4

2 回答 2

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 的回答。

于 2016-03-22T12:31:53.903 回答
0

退出 Visual Studio 并以管理员模式重新启动。这行得通!!!

于 2016-09-23T19:45:31.723 回答