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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mittlerweile denke ich, dass ich missbraucht Marschall.ThrowExceptionForHR () - Methode. Ich nehme an, dass es nicht vorgesehen für die Verwendung mit einem Win32-Aufruf. Meine interpretation des Verhaltens ist, dass die Funktion verwendet Kontext-information des aktuellen thread zu sammeln mehr details über die Ausnahme. Finden Sie in diesem blog für ein ähnliches problem.
In meinem Fall das Problem gelöst werden können durch die Erstellung meiner eigenen ThrowExceptionForWin32ErrorCode(errorCode) - Methode.
Bitte halten Sie die Beantwortung, wenn Sie eine bessere Lösung.
InformationsquelleAutor Michael Stoll
Ich weiß nicht, warum ThrowExceptionForHRInternal zu manipulieren versucht einige stream.
Während call-stack sieht seltsam aus, berücksichtigen nicht vorbei-stream direkt von der Web-Antwort zu zeichnen-Funktionen, die scheinen verursachen Ausnahme in Ihrem Fall, aber das kopieren von Daten zum memory-stream-ersten. Dies wird wahrscheinlich erlauben Ihnen, zu sehen, welche ursprüngliche problem ist (wie ThrowExceptionForHRInternal wird nicht mehr scheitern, die versuchen zu manipulieren stream).
InformationsquelleAutor Alexei Levenkov