2010-08-20 4 views
6

Ich habe eine C# -Anwendung, die eine Funktion in einer C++ - DLL aufruft. Diese Funktion kann verschiedene Ausnahmen auslösen, die std::exception erben. Ich fange gerade diese Ausnahmen wie folgt aus:Wie bekomme ich eine std :: Ausnahme Fehlerbeschreibung beim Aufruf einer C++ - DLL aus C#

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

Meine erste Frage ist, wird dieser Code fangen alle std::exception? Meine zweite Frage ist, wie kann ich die std::exception::what Zeichenfolge abrufen, wenn ich untersuchen exception.Message Ich bekomme nur "Externe Komponente hat eine Ausnahme ausgelöst".

EDIT: Die fragliche Funktion ist in einem nicht verwalteten C++ dll, und wie dies in der C# Klasse importiert:

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

Es gibt eine toString Methode eine String-Darstellung der aktuellen Ausnahme zurückgibt. 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-c code/150596 # 150596 – celavek

Antwort

0

Anruf wie? Die CLR "lernt" nicht wirklich C++ Ausnahmebehandlung. Wenn Sie den C++ - Code über COM aufrufen, fügen Sie einen Layer hinzu, der die std :: -Ausnahme abfängt und mit einem HRESULT/IErrorInfo umschließt. Wenn Sie es über verwaltetes C++ aufrufen, fügen Sie einen Layer hinzu, der es in eine verwaltete System.Exception usw. einbindet.

+0

Ich habe meine Frage aktualisiert –

+1

Das gleiche Prinzip gilt für PInvoke. Es ist einfacher, ein anderes Protokoll für die Fehlerberichterstattung zu finden. Verwenden Sie zum Beispiel die Rückgabewerte, Ausgabeparameter und/oder Windows 'SetLastError-Funktion. –

0

Der beste Weg zu gehen wäre, die Ausnahme in C++ zu behandeln und die Fehlermeldung irgendwo zu speichern. Dann können Sie in C# prüfen, ob eine Fehlermeldung gespeichert wurde, und falls ja, können Sie sie abrufen.

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

Und was, wenn es sich um einen Code eines Drittanbieters handelt, habe ich keine Möglichkeit, es zu ändern? – qub1n