Ich verwende eine nicht verwaltete DLL mit einer Funktion, die std::exception
löst.Catch unmanaged dll Ausnahme in .NET
Ich benutze einen .NET DLL-Wrapper, so dass es zur Verwendung in .NET-Programmen verteilt werden kann.
Ich möchte in der Lage Fang sein, die Nachricht von der nativen Ausnahme, sondern alles, was ich habe, ist immer System.Runtime.InteropServices.SEHException("External component has thrown an exception.")
Gibt es eine Möglichkeit die Ausnahme Details zu propagieren? Vielleicht sollte ich eine benutzerdefinierte Ausnahme von der nativen DLL exportieren? Wie würde ich das tun?
Dank
nativen DLL:
__declspec(dllexport) void __stdcall W32DLLFunc(int param) {
if (param < 0) {
throw new exception("Error: param must be > 0");
}
...
}
.net DLL:
[DllImport("nw32.dll", CharSet = CharSet::Auto)]
static void W32DLLFunc(int param);
vb.net Programm:
Try
W32DLLFunc(-1)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Das stimmt, die berühmte 'E msc'-Ausnahme. Ich werde meine Kommentare im Austausch für eine Upvote löschen.Sie könnten immer noch eine Notiz hinzufügen über das Schreiben eines C++/CLI-Wrappers, um C++ - Ausnahmen in .NET-Ausnahmen zu übersetzen, was die sauberste Lösung zu sein scheint. Die Assembly im gemischten Modus kann sogar von nativem und verwaltetem Code verwendet werden. – IInspectable
Prost. Ein C++/CLI-Wrapper ist mir aufgefallen, aber ich wusste nicht, wie native Exceptions mit C++/CLR interagieren. [Dieser Artikel] (http://msdn.microsoft.com/en-us/library/df24ysb6.aspx) bedeutet fast, dass es funktionieren würde, also gab ich es und es tut. Ich habe meine Antwort aktualisiert. – arx