VS2022 VB.NET创建Excel对象时反射调用异常求助
VS2022 VB.NET中CreateObject创建Excel对象的ActiveX异常解决
问题现象
在VS2022 Community版VB.NET项目中,调用CreateObject("Excel.Application")创建Excel对象时,运行时抛出Cannot create ActiveX component异常,同时伴随Cannot call method System.Reflection.MemberInfo.get_CustomAttributes in this context错误。
- 同一会话中偶尔短时间可正常运行,但修改代码后异常重现;
- 多数新会话首次执行即触发异常。
已尝试无效/仅偶尔有效的方案
- 将Install ActivateX服务设为自动并重启
- 执行命令
regsvr32 scrrun.dll - 执行命令
sfc /scannow - 修改项目平台为32位、64位或Any,仅偶尔有效
相关代码片段
Private Sub PreparaXLSX() Dim myApp As Excel.Application myApp = CreateObject("Excel.Application") End Sub
异常信息
System.Exception HResult=0x80131500 Message = Cannot create ActiveX component. + TargetSite {System.Object CreateObject(System.String, System.String)} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo} X Cannot call method System.Reflection.MemberInfo.get_CustomAttributes in this context.
彻底解决方案
1. 改用Excel互操作程序集(PIA)替代晚绑定
放弃CreateObject的晚绑定方式,直接使用官方互操作程序集,避免反射上下文冲突:
- 右键项目 → 管理NuGet程序包,搜索并安装
Microsoft.Office.Interop.Excel - 修改代码为:
Imports Microsoft.Office.Interop.Excel Private Sub PreparaXLSX() Dim myApp As New Application() ' 使用完毕务必释放COM资源,避免内存泄漏 ' myApp.Visible = False ' 根据需求设置 ' ... 业务逻辑 ... ' myApp.Quit() ' System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp) End Sub
2. 重新注册Excel COM组件
修复Office组件的注册信息,解决ActiveX创建失败问题:
- 以管理员身份打开命令提示符;
- 根据Office位数切换到对应目录:
- 64位Office:
cd "C:\Program Files\Microsoft Office\root\Office16" - 32位Office:
cd "C:\Program Files (x86)\Microsoft Office\root\Office16"
- 64位Office:
- 执行注册命令:
excel.exe /regserver - 重启电脑后重新测试项目
3. 禁用VS调试的快速编辑模式
快速编辑模式可能干扰COM对象的创建流程,导致反射异常:
- 打开VS2022 → 工具 → 选项 → 调试 → 常规;
- 取消勾选「启用快速编辑模式(仅适用于控制台)」;
- 重启VS后重新运行项目
4. 清理VS缓存文件
VS缓存损坏可能引发编译/运行时的反射异常:
- 关闭所有VS2022窗口;
- 删除以下目录的缓存文件:
%LOCALAPPDATA%\Microsoft\VisualStudio\17.0_*\ComponentModelCache%USERPROFILE%\AppData\Roaming\Microsoft\VisualStudio\17.0_*\ReflectedSchemas
- 重启VS,重新生成项目后测试
内容的提问来源于stack exchange,提问作者Jose Jorge Duran
相关产品推荐
相关产品推荐

