C# Marshal.ThroweExceptionForHR抛出NotSupportedException

C# Marshal.ThroweExceptionForHR抛出NotSupportedException,c#,pinvoke,marshalling,C#,Pinvoke,Marshalling,我使用以下模式将win32异常转换为.NET异常 var result = A_KERNEL32_PINVOKE_CALL(); if (result == 0) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } 为完整起见,pinvoke调用是以下调用之一:LoadLibrary、GetProcAddress、SetWindowsHookEx 这在大多数情况下都很有效,抛出如下异常: System.Ar

我使用以下模式将win32异常转换为.NET异常

var result = A_KERNEL32_PINVOKE_CALL();
if (result == 0)
{
   Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
为完整起见,pinvoke调用是以下调用之一:LoadLibrary、GetProcAddress、SetWindowsHookEx

这在大多数情况下都很有效,抛出如下异常:

System.ArgumentException:参数超出范围

在System.Runtime.InteropServices.Marshal.ThroweExceptionForhr内部(Int32 errorCode,IntPtr errorInfo)

但有时我会遇到以下例外情况:

System.NotSupportedException:此流不支持查找操作

在System.Net.ConnectStream.get_位置()处

在System.Net.WebClient.WebClientWriteStream.get_Position()处

在System.Drawing.UnsafentiveMethods.ComStreamFromDataStream.Seek(Int64偏移量,Int32原点)处

在System.Runtime.InteropServices.Marshal.ThroweExceptionForhr内部(Int32 errorCode,IntPtr errorInfo)

我想不出这个例外的原因。请注意,堆栈跟踪不像第一个异常那样以ThroweExceptionForhrInternal开头。因此,我认为这可能是ThroweExceptionForHR方法本身的一个例外

编辑:请注意,我没有直接调用任何流方法。但是,该代码是在线程池线程中执行的,因此同一线程中可能有其他代码使用流方法

如何解决这个问题有什么建议吗

更新:我刚刚发现,堆栈跟踪

在System.Net.ConnectStream.get_位置()处

在System.Net.WebClient.WebClientWriteStream.get_Position()处

在System.Drawing.UnsafentiveMethods.ComStreamFromDataStream.Seek(Int64偏移量,Int32原点)处

属于对Image.Save(流、格式)的调用。这里捕获了NotSupportedException。这些代码是完全独立的,但它们可能在同一线程池线程上执行


那么,为什么这个异常会在另一种方法中影响我的代码呢

我不知道为什么ThroweExceptionForhr内部试图操纵一些流


虽然调用堆栈看起来很奇怪,但是考虑不要直接从Web响应流到绘图函数,这些函数在您的情况下会引起异常,但首先将数据复制到内存流。这可能会让您看到最初的问题是什么(因为ThroweExceptionForhrInternal在尝试操作流时不再失败)。

现在我认为,我误用了Marshal.ThroweExceptionForHR()方法。我想它不打算用于Win32调用。我对该行为的解释是,该函数使用当前线程的上下文信息来收集有关异常的更多细节。对于类似的问题

在我的例子中,这个问题可以通过创建我自己的ThroweExceptionForWin32ErrorCode(errorCode)方法来解决


如果您有更好的解决方案,请继续回答。

当您获得NotSupportedException时,能否告诉我们您从Marshal.GetHRForLastWin32Error()中获得了什么值?我正在尝试获取此值,但问题很难重现。hresult是-2147024809(Win32/无效参数)。有时抛出ArgumentException,有时抛出NotSupportedException。(由于方法SetWindowsHookEx(path).ArguementException被处理)流方法调用不是我的代码。我不知道如何影响这一点。遗憾的是,博客的链接断了。