2016-03-22 13 views
5

Un'applicazione WPF C# su cui sto lavorando contiene molte chiamate a una DLL esterna non gestita. Tutte le chiamate alla DLL funzionano come previsto durante l'esecuzione dell'applicazione (ad esempio all'esterno del debugger di Visual Studio). Tuttavia quando il debug dall'interno di Visual Studio 2013, una chiamata a un metodo specifico nella DLL si blocca l'applicazione:Qualche idea su cosa può causare "vshost32.exe ha smesso di funzionare" in Visual Studio 2013?

vshost32.exe has stopped working

questo è come importare il metodo:

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

... e questo è come chiamo il metodo DLL:

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

sembra che Visual Studio utilizza il processo vshost32.exe per ospitare applicazioni durante un debug ging session (VSHOST - the Hosting Process). Inoltre, "le chiamate a determinate API possono essere influenzate quando il processo di hosting è abilitato, in questi casi è necessario disabilitare il processo di hosting per restituire i risultati corretti." (Vedere l'articolo MSDN How to: Disable the Hosting Process). Disabilitare l'opzione "Attiva il processo di hosting di Visual Studio" in Project> Proprietà ...> Debug, come mostrato di seguito, effettivamente risolvere il problema:

enter image description here

Qualcuno ha idea di cosa potrebbe causare questo specifico problema con "... chiama a specifiche API ..."?

+1

Basta correggere il bug nel codice. Il tipo di ritorno non può essere una stringa, deve essere IntPtr. Quindi utilizzare Marshal.PtrToStringAnsi() per ripristinare la stringa. –

+0

Grazie a @HansPassant per la tua risposta veloce - che lo ha risolto! – YetMoreStuff

risposta

1

L'errore vshost32.exe è causato da un'istruzione DllImport errata: il tipo restituito della DLL esterna non può essere una stringa, deve essere IntPtr.

Ecco il codice corretto:

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

... e questa è la chiamata rivisto al metodo DLL:

string version; 

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

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

Grazie a @HansPassant per la risposta.

0

Esci da Visual Studio e riavvia in modalità amministratore. Funziona!!!

Problemi correlati