Laden...

External exception auslesen

Erstellt von dercommander vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.955 Views
D
dercommander Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren
External exception auslesen

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?

L
497 Beiträge seit 2006
vor 17 Jahren

Hast Du es schonmal mit exception.GetBaseException().Message versucht?

Sarkusmus ist, wenn nichts mehr hilft, außer Lachen.

D
dercommander Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

Ja.

kriege ich auch nur "External component has thrown an exception".

S
8.746 Beiträge seit 2005
vor 17 Jahren

Geht nicht. Man schaue sich WINAPI an. Jede Funktion liefert nen HRESULT. So muss man es leider machen.

D
dercommander Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

Ja, was kann ich mit dem HRESULT denn machen? Das ist doch nicht die Fehlermeldung, die ich selber werfen lasse.

S
8.746 Beiträge seit 2005
vor 17 Jahren

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."

D
dercommander Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

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?

D
dercommander Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

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.

S
8.746 Beiträge seit 2005
vor 17 Jahren

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.