C# Marshal.ThroweExceptionForHR抛出NotSupportedException
我使用以下模式将win32异常转换为.NET异常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
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被处理)流方法调用不是我的代码。我不知道如何影响这一点。遗憾的是,博客的链接断了。