2016-03-22 17 views
5

Ứng dụng C# WPF mà tôi đang thực hiện chứa nhiều cuộc gọi đến một DLL ngoài không được quản lý. Tất cả các cuộc gọi đến DLL hoạt động như mong đợi khi chạy ứng dụng bình thường (tức là bên ngoài trình gỡ rối Visual Studio). Tuy nhiên khi gỡ lỗi từ bên trong Visual Studio 2013, một cuộc gọi đến một phương pháp cụ thể trong DLL bị treo ứng dụng:Bất kỳ ý tưởng nào có thể gây ra "vshost32.exe đã ngừng hoạt động" trong Visual Studio 2013?

vshost32.exe has stopped working

này là làm thế nào tôi nhập khẩu phương pháp:

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

... và đây là cách tôi gọi phương thức DLL:

try 
{ 
    version = ClientGetVersion(); 
} 
catch (Exception ex) 
{ 
    // Error handling omitted for clarity... 
} 

Có vẻ như Visual Studio sử dụng quy trình vshost32.exe để lưu trữ ứng dụng trong khi gỡ lỗi phiên ging (VSHOST - the Hosting Process). Hơn nữa, "Các cuộc gọi đến một số API nhất định có thể bị ảnh hưởng khi quá trình lưu trữ được bật. Trong những trường hợp này, cần phải tắt quy trình lưu trữ để trả lại kết quả chính xác". (Xem bài viết MSDN How to: Disable the Hosting Process). Vô hiệu hóa "Enable quá trình Visual Studio lưu trữ" trong dự án> Properties ...> Debug, như hình dưới đây, không thực sự giải quyết vấn đề:

enter image description here

Có ai có bất kỳ ý tưởng gì đặc biệt có thể gây ra điều này vấn đề với "... cuộc gọi đến các API cụ thể ..."?

+1

Chỉ cần sửa lỗi trong mã của bạn. Kiểu trả về không thể là chuỗi, nó phải là IntPtr. Sau đó sử dụng Marshal.PtrToStringAnsi() để khôi phục chuỗi. –

+0

Cảm ơn @HansPassant đã trả lời nhanh - đã sắp xếp nó! – YetMoreStuff

Trả lời

1

Lỗi vshost32.exe là do câu lệnh DllImport không chính xác - kiểu trả về của DLL ngoài không thể là chuỗi, nó phải là IntPtr.

Đây là mã sửa:

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

... và đây là cuộc gọi sửa đổi để phương pháp DLL:

string version; 

try 
{ 
    version = Marshal.PtrToStringAnsi(ClientGetVersion()); 

} 
catch (Exception ex) 
{ 
    // Error handling omitted for clarity... 
} 

Nhờ @HansPassant cho câu trả lời.

0

Thoát khỏi Visual Studio và khởi chạy lại ở chế độ quản trị viên. Nó hoạt động !!!

Các vấn đề liên quan