Auf der MSDN habe ich die folgende Beschreibung für die beiden Attribute gefunden:DllImport - PreserverSig und SetLastError Attribute
PreserveSig das PreserveSig Feld auf true gesetzt, um direkt unmanaged Signaturen mit HRESULT oder Retval Werten zu übersetzen; Setzen Sie es auf "false", um HRESULT- oder retval-Werte automatisch in Ausnahmen zu konvertieren. Standardmäßig ist das PreserveSig-Feld wahr.
SetLastError Ermöglicht dem Aufrufer, mithilfe der Marshal.GetLastWin32Error-API-Funktion festzustellen, ob beim Ausführen der Methode ein Fehler aufgetreten ist. In Visual Basic ist der Standardwert wahr (was zusätzlichen Aufwand verursacht); In C# und C++ ist der Standardwert falsch.
Meine Frage ist: Wie diese beiden miteinander in Beziehung stehen? Angenommen, ich habe PreserveSig auf 'false' gesetzt - dies bedeutet, dass HRESULT in Ausnahme konvertiert werden soll - wenn die nicht verwaltete Funktion eine ganze Zahl zurückgibt, die anzeigt, dass ein Fehler oder kein Fehler aufgetreten ist, wie kann dies in eine Ausnahme umgesetzt werden?
Auch warum muss ich GetLastWin32Error Methode aufrufen, wenn ich irgendwie die Ausnahme mit PreserveSig extrahieren konnte?
Mit freundlichen Grüßen PK
Ich habe keine Erfahrung mit COM-Objekten, also lassen Sie mich noch eine Frage bezüglich der Erstellung der Methodensignatur stellen. Die Frage ist: Wenn ich sehe, dass die COM-Funktion HRESULT zurückgibt, kann ich meine Methode als void zurückgeben und PreserveSig = false (wie Sie sagten) setzen oder PreserveSig = true setzen und meine Methode als IntPtr zurückgeben, um den zurückgegebenen Code manuell zu untersuchen. – pkolodziej
Ja, das ist richtig, außer HRESULTs sind UInt32s, nicht IntPtrs. –
Danke - Sie waren sehr hilfreich. – pkolodziej