Hi,
Ich habe ein kleines C# Projekt, in dem ich eine unmanaged DLL aufrufe. In der DLL gibt es ein Exception Handling. Wenn ich jetzt versuche diese Exception zu bekommen dann kriege ich als Ausgabe nur : "System.Runtime.InteropServices.SEHException:External component has thrown an exception."
Meine Frage ist es nun gibt es in C# einen Weg auch die richtige Message zu kriegen, die auch geworfen wird oder muss ich mir da selber etwas zu recht stricken?
Hast Du es schonmal mit exception.GetBaseException().Message versucht?
Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.
Ja.
kriege ich auch nur "External component has thrown an exception".
Geht nicht. Man schaue sich WINAPI an. Jede Funktion liefert nen HRESULT. So muss man es leider machen.
Ja, was kann ich mit dem HRESULT denn machen? Das ist doch nicht die Fehlermeldung, die ich selber werfen lasse.
Nein, HRESULT ist nix weiter als eine Fehlernummer. Wer Funktionen in DLLs exportiert, darf eben keine Exceptions zur Fehlermeldung verwenden, sondern muss den "klassischen" Weg mit Returnwerten (bzw. Win32-GetLastError()) beschreiten.
Kannst ja mal versuchen die Interop-Exception zu fangen und dann GetLastWin32Error() aufzurufen. Wichtig ist aber, bei der PInvoke-Definion SetLastError=true zu setzen:
"The runtime marshaler calls GetLastError and caches the value returned to prevent it from being overwritten by other API calls. You can retrieve the error code by calling GetLastWin32Error."
Hi, ich habe das Attribut beim DLL - Import gesetzt.
Mit dem hier gezeigten Code kriege ich aber nur eine Ausgabe von 0.
try
{
//aufruf der Funktion aus der unmanaged DLL wo die Exception geworfen wird
NipNative.nnnipm(sfileName);
}
catch(Exception e)
{
MessageBox.Show(this,Marshal.GetLastWin32Error().ToString());
}
Kannst du mir sagen was ich vielleicht falsch mache?
So ich habe es jetzt selber gelöst. Damit auch andere die Lösung kriegen:klick
Das Beispiel hat mir geholfen um eine Lösung zu kriegen. Kann mir zwar nur selber generierte Ausgaben zurück geben lassen, aber das wollte ich ja auch um mein eigenes Exception Handling zu haben.
Das Beispiel funktionierte aber nicht ganz so. Meine Änderungen waren:1.CALLBACK_FUNCTION - muss klein geschrieben werden 1.man muss die "windows.h includieren 1.vor das *callback_function kommt ein __stdcall um keine Fehler zu bekommen wenn man mit Übergabeparametern arbeitet.
Ich weiß das ist nicht die beste Lösung aber für mich funktioniert sie erst mal und es soll ja auch nur ein Prototyp sein um unsere weiteren Strategien für die Umsetzung zu planen. Falls jemand noch Vorschläge hat wie man es besser machen kann bin ich gerne bereit sie mir anzusehen.
Wenn jemand noch Probleme damit hat dann werde ich auch gerne behilflich sein um das zum Laufen zu kriegen.
Original von dercommander
Kannst du mir sagen was ich vielleicht falsch mache?
Wie gesagt: Die unmanaged Methode muss den Fehler auch mit SetLastError() signalisieren. Es ist keine automatische Umsetzung von Exceptions oder sowas.