System.Runtime.InteropServices.GetHRForException的陷阱
来源:互联网 发布:a 算法优缺点 编辑:程序博客网 时间:2024/05/16 03:03
从字面上看,GetHRForException函数的作用很简单:得到Exception所对应的HRESULT的值。但是,GetHRForException还会做一件事情:设置当前线程的IErrorInfo使之指向该Exception(严格来说是获得Exception的CCW中的IErrorInfo接口指针)。如果对IErrorInfo不熟悉的朋友们可以把IErrorInfo看成COM版本的GetLastError或者errno。设置IErrorInfo会导致之后的代码如果使用GetErrorInfo查询IErrorInfo的值,会获得一个非0的结果,那么有些代码可能会认为程序出错而拒绝继续执行。更糟糕的是,如果之后的代码在做COM Interop或者PInvoke,CLR会检查IErrorInfo,如果IErrorInfo非0则认为该调用失败,并抛出异常或者返回错误值(视乎PreserveSigAttribute是否存在)。直接的结果是可能函数调用成功,但是因为IErrorInfo已经被设置而导致该调用最终失败。很有意思的是在.NET中有一段处理资源的代码正好有这个问题,结果间接导致了巴西葡萄牙语版本(是的,你没看错J)的.NET的RegAsm挂掉。其实我个人认为这个函数应该被命名为GetHRForExceptionAndSetIErrorInfo(Exception ex);虽然有些长,但是很清晰,总比简短而错误的名字要来的好。
在正常情况下,如果你需要获得Exception的HRESULT值,应该直接使用Exception.HResult属性。那么什么时候才应该使用GetHRForException呢?当你写了一个.NET的函数准备让非托管代码调用(最好是通过COM),并且返回一个HRESULT,这个时候你有必要把托管函数内部抛出的异常转换为HR,并且把Exception本身的信息设置到当前线程的IErrorInfo中去,这才是最符合COM规范的。
- System.Runtime.InteropServices.GetHRForException的陷阱
- System.Runtime.InteropServices.Marshal.Release
- “System.Runtime.InteropServices.COMException”解决之道
- System.Runtime.InteropServices.COMException解决办法
- 关于system.runtime.interopservices.comexception(0x800A1066)的问题
- System.Runtime.InteropServices.COMException 6/2
- Visual Studio 2008 System.Runtime.InteropServices.COMException
- 解决System.Runtime.Interopservices.COMException问题
- 错误:system.runtime.interopservices.comexception (0x80040154)
- System.Runtime.InteropServices.COMException (0x80028018):
- System.Runtime.InteropServices.COMException (0x800A03EC)
- 解决System.Runtime.Interopservices.COMException问题
- win7+VS2008 System.Runtime.InteropServices.COMException
- C# System.Runtime.InteropServices 相关学习总结
- Asp.Net操作Word内容“System.Runtime.InteropServices.COMException: 命令失败”的解决方法
- 关于System.Runtime.InteropServices.COMException (0x80070006): 句柄无效的问题
- System.Runtime.InteropServices.COMException 检索COM类工厂中CLSID{xxxxxxxxx}的组件时失败解决方法
- System.Runtime.InteropServices.COMException (0x80010105): 服务器出现意外情况 问题的解决
- ASP后台快速调用Mysql 数据库
- 天主教与基督新教聖经主要译名对照
- 从C# 3.0说以人为本(三)—— 扩展方法
- ADC和DAC的接地(作者:James M. Bryant, Analog Devices 译者:dhdahai)
- 提高ASP页面的执行效率
- System.Runtime.InteropServices.GetHRForException的陷阱
- 利用ASP在客户端注册DLL文件
- 1032 Parliament
- 梵蒂冈国歌
- Ffmpeg解码获取一帧图像(转)
- 一种效率极高的分类算法
- 从C# 3.0说以人为本(四)—— Lambda表达式
- 为你的ASP程序制作一个编译组件(上)
- ASP中优化数据库处理