2010-08-20 15 views
6

Ho un'applicazione C# che chiama una funzione in una dll C++. Questa funzione può generare varie eccezioni che ereditano std::exception. Attualmente prendo queste eccezioni in questo modo:Come si ottiene una descrizione dell'errore di std :: exception quando si chiama una dll C++ da C#

try 
{ 
    //Call to C++ dll 
} 
catch (System.Exception exception) 
{ 
    //Some error handling code 
} 

La mia prima domanda è la volontà di questo codice cattura tutto std::exception? La mia seconda domanda è come posso recuperare la stringa std::exception::what, se esamino lo exception.Message ottengo solo "Il componente esterno ha generato un'eccezione".

EDIT: La funzione in questione è in un non gestito dll C++, e importato come questo in C# classe:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
+0

C'è un metodo ToString restituisce una rappresentazione di stringa dell'eccezione corrente. http://msdn.microsoft.com/en-us/library/system.exception_members.aspx – DumbCoder

+2

http://stackoverflow.com/questions/150544/can-you-catch-a-native-exception-in-c- code/150596 # 150596 – celavek

risposta

0

chiamata come? Il CLR in realtà non "ottiene" la gestione delle eccezioni del C++. Se si chiama il codice C++ tramite COM, aggiungere un layer che rilevi l'eccezione std :: e avvolgerlo con HRESULT/IErrorInfo. Se lo chiami tramite C++ gestito, aggiungi un livello che lo avvolge in un sistema gestito.Exception ecc.

+0

Ho aggiornato la mia domanda –

+1

Lo stesso principio si applica a PInvoke. È più semplice trovare un altro protocollo per la segnalazione degli errori. Utilizzando i valori di ritorno, i parametri di output e/o la funzione SetLastError di Windows, ad esempio. –

0

Il modo migliore per procedere sarebbe gestire l'eccezione in C++ e salvare il messaggio di errore da qualche parte. Quindi, in C# è possibile verificare se è stato salvato un messaggio di errore e, in caso affermativo, è possibile recuperarlo.

C++:

try 
{ 
    //do some processing 
} 
catch(std::exception& ex) 
{ 
    // errorMessage can be a std::string 
    errorMessage = ex.what(); 
} 

C#:

[DllImport("SomeDLL.dll")] 
public extern static void SomeFunction(); 
[DllImport("SomeDLL.dll")] 
public extern static string GetError(); 

SomeFunction(); 
string Error = GetError(); 
if(String.IsNullOrEmpty(Error)==true) 
{ 
    //The processing was successfull 
} 
else 
{ 
    //The processing was unsuccessful 
    MessageBox.Show(Error); 
} 
+0

E se si tratta di un codice di terze parti, non ho la possibilità di modificarlo? – qub1n

Problemi correlati