2016-03-22 7 views
5

Eine C# -WPF-Anwendung, an der ich arbeite, enthält viele Aufrufe an eine nicht verwaltete externe DLL. Alle Aufrufe der DLL funktionieren wie erwartet, wenn die Anwendung normal ausgeführt wird (d. H. Außerhalb des Visual Studio-Debuggers). Wenn jedoch in Visual Studio 2013 debuggen, ein Anruf an eine bestimmte Methode in der DLL stürzt die Anwendung:Irgendeine Idee, was verursachen kann, "vshost32.exe funktioniert nicht mehr" in Visual Studio 2013?

vshost32.exe has stopped working

Dies ist, wie ich importieren Sie die Methode:

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

... und das ist, wie ich die DLL-Methode aufrufen:

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

Es scheint, dass Visual Studio die vshost32.exe Prozess verwendet Anwendungen während einer Debug-Host Ging-Sitzung (VSHOST - the Hosting Process). Darüber hinaus können "Aufrufe an bestimmte APIs beeinflusst werden, wenn der Hosting-Prozess aktiviert ist. In diesen Fällen ist es notwendig, den Hosting-Prozess zu deaktivieren, um die korrekten Ergebnisse zurückzugeben." (Siehe den MSDN-Artikel How to: Disable the Hosting Process). Das Deaktivieren des „Aktivieren Sie den Visual Studio-Hosting-Prozess“ im Projekt> Eigenschaften ...> Debug, wie unten gezeigt, beheben ist in der Tat das Problem:

enter image description here

jemand eine Idee Hat was speziell dies dazu führen könnte, Problem mit "... Aufrufe an bestimmte APIs ..."?

+1

Einfach den Fehler in Ihrem Code beheben. Der Rückgabetyp kann keine Zeichenfolge sein, es muss IntPtr sein. Verwenden Sie dann Marshal.PtrToStringAnsi(), um die Zeichenfolge wiederherzustellen. –

+0

Dank @HansPassant für Ihre schnelle Antwort - das hat es sortiert! – YetMoreStuff

Antwort

1

Der vshost32.exe-Fehler wird durch eine falsche DllImport-Anweisung verursacht - der Rückgabetyp der externen DLL kann keine Zeichenfolge sein, es muss IntPtr sein. Hier

ist der korrigierte Code:

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

... und das ist der überarbeitete Aufruf der DLL-Methode:

string version; 

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

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

Dank @HansPassant für die Antwort.

0

Beenden Sie Visual Studio und Relaunch im Administratormodus. Es funktioniert!!!

Verwandte Themen