2016-03-22 12 views
5

Aplikacja C# WPF, nad którą pracuję, zawiera wiele wywołań do niezarządzanej zewnętrznej biblioteki DLL. Wszystkie wywołania biblioteki DLL działają zgodnie z oczekiwaniami podczas normalnej pracy aplikacji (np. Poza debugerem Visual Studio). Jednak podczas debugowania z poziomu Visual Studio 2013, wezwanie do jednej konkretnej metody w DLL wywala aplikacja:Każdy pomysł, co może spowodować, że "vshost32.exe przestał działać" w Visual Studio 2013?

vshost32.exe has stopped working

ten sposób importować metodę:

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

... i I to jest jak wywołać metodę DLL:

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

Wydaje się, że Visual Studio wykorzystuje proces vshost32.exe gościć podczas debugowania aplikacji sesja ging (VSHOST - the Hosting Process). Ponadto, "Połączenia z niektórymi interfejsami API mogą zostać zakłócone, gdy proces hostowania jest włączony. W takich przypadkach konieczne jest wyłączenie procesu hostingu w celu zwrócenia poprawnych wyników." (Zobacz artykuł MSDN How to: Disable the Hosting Process). Wyłączenie „Włącz proces Visual Studio hosting” opcję w Projekcie> Właściwości ...> Debug, jak pokazano poniżej, rzeczywiście rozwiązać problem:

enter image description here

Czy ktoś ma jakiś pomysł co może być przyczyną tego specjalnie problem z "... wywołaniami do konkretnych interfejsów API ..."?

+1

Napraw błąd w swoim kodzie. Typ zwracany nie może być łańcuchem, musi to być IntPtr. Następnie użyj Marshal.PtrToStringAnsi(), aby odzyskać ciąg znaków. –

+0

Dzięki @HansPassant za szybką odpowiedź - to posortowało! – YetMoreStuff

Odpowiedz

1

Błąd vshost32.exe jest spowodowany przez niepoprawną instrukcję DllImport - typ zwracanej zewnętrznej biblioteki DLL nie może być łańcuchem, musi to być inttrtr.

Oto poprawiony kod:

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

... i jest to poprawione wywołanie metody DLL:

string version; 

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

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

Dzięki @HansPassant na odpowiedź.

0

Zamknij program Visual Studio i uruchom ponownie w trybie administratora. Działa!!!

Powiązane problemy