Marschall.ThrowExceptionForHR löst eine NotSupportedException

im mit Sie das folgende Muster für die übersetzung von win32-Ausnahmen in .NET Ausnahmen.

var result = A_KERNEL32_PINVOKE_CALL();
if (result == 0)
{
   Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}

Für die Vollständigkeit der pinvoke-Aufruf ist einer der folgenden: LoadLibrary, GetProcAddress, SetWindowsHookEx.

Dies funktioniert gut die meiste Zeit, das werfen von Ausnahmen wie diese:

System.ArgumentException: das Argument außerhalb des Bereichs.

System.- Laufzeit.InteropServices.Marschall.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)

Aber manchmal bekomme ich die folgende exception:

System.NotSupportedException: Dieser Stream unterstützt keine seek-Operationen.

System.Net.ConnectStream.get_Position()

System.Net.WebClient.WebClientWriteStream.get_Position()

System.Zeichnung.UnsafeNativeMethods.ComStreamFromDataStream.Seek(Int64 offset, Int32 Herkunft)

System.- Laufzeit.InteropServices.Marschall.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)

Ich kann nicht denken, ein Grund für diese Ausnahme. Bitte beachten Sie, dass der stack-trace nicht starten mit ThrowExceptionForHRInternal wie die erste Ausnahme. Also ich denke, das könnte eine Ausnahme von der ThrowExceptionForHR Methode selbst.

EDIT: Bitte beachten, dass ich nicht den Aufruf irgendeiner Stream-Methoden direkt. Allerdings wird der code ausgeführt, der in einem threadpool-thread, so könnte es sein, code in der gleichen thread mithilfe der Stream-Methoden.

Irgendwelche Vorschläge wie man dieses Problem lösen?

UPDATE: ich habe gerade herausgefunden, dass der stack-trace

System.Net.ConnectStream.get_Position()

System.Net.WebClient.WebClientWriteStream.get_Position()

System.Zeichnung.UnsafeNativeMethods.ComStreamFromDataStream.Seek(Int64 offset, Int32 Herkunft)

gehört zu einem call zu Bild.Save(Stream-Format). Gibt es eine die NotSupportedException gefangen ist. Diese code-Stücke sind völlig unabhängig, aber vielleicht hat Sie ausgeführt, die auf dem gleichen thread-pool-thread.

Also warum diese Ausnahme Einfluss auf meinen code in eine andere Methode?

Können Sie uns sagen, welchen Wert bekommen Sie von der Marschall.GetHRForLastWin32Error (), wenn Sie NotSupportedException?
Ich versuche, diesen Wert, aber das Problem ist schwer zu reproduzieren.
Das hresult ist -2147024809 (Win32 / ungültige parameter). Manchmal löst eine ArgumentException aus, manchmal eine NotSupportedException. (Als Ergebnis der Methode SetWindowsHookEx(Pfad). ArguementException gehandhabt wird)

InformationsquelleAutor Michael Stoll | 2011-04-04

Schreibe einen Kommentar