[C#, Excel Add

[C#, Excel Add-In, TroubleShooting] 无法将类型 'System.__ComObject' 的 COM 对象转换为界面类型 'Microsoft.Office.Interop.Excel._Application'。…之解决方案


今天在跑一个之前开发过的 Excel 2010 Add-In 的开发,结果在 Build 过程没有错,没想到发生错误时间点是在当我 Trigger 某一事件时,就发生如下的错误了: (请参考如下:)

无法将类型 'System.__ComObject' 的 COM 对象转换为界面类型 'Microsoft.Office.Interop.Excel._Application'。由于发生下列错误,界面 (IID 为 '{000208D5-0000-0000-C000-000000000046}') 之 COM 组件上的 QueryInterface 调用失败而导致作业失败: 程序库未登录。 (发生例外状况于 HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))。"}

英文的消息可能有:

Unable to cast COM object of type 'Microsoft.Office.Interop.Excel.ApplicationClass' to interface type 'Microsoft.Office.Interop.Excel._Application'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{000208D5-0000-0000-C000-000000000046}' failed due to the following error:  could not be found. (Exception from HRESULT: 0x80030002 (STG_E_FILENOTFOUND)).

简中的消息可能有:

无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”。此操作失败的原因是对 IID 为“{000208D5-0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 库没有注册。 (异常来自 HRESULT:0x8002801D (TYPE_E_LIBNOTREGISTERED))。

*上述在 TYPE_E_LIBNOTREGISTERED 前的 HRESULT 代码可能会有不太一样… 但可能都适用,因为最主要是 QueryInterface 调用失败 及 未登入程序库的因素

而过程中,找了很多数据,也参考很多,甚至连 PIA 都重新下载安装。

其参考的文章有:

Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))

C#与excel互操作的错误无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象

(转载)C#与excel互操作的错误:无法将类型为“Microsoft.Office.Interop.Excel.ApplicationClass”

如何解决编程中Excel不能读取的问题   << 最后这篇帮助了我!

当然,我也记录下来,希望其他人如果有机会也能参考到啰!


解决方法及步骤:

1. 下载官方的 PIA ,并重新安装登入。

下载点:

Microsoft Office 2010: Primary Interop Assemblies Redistributable

2. 删除 ( 备份 ) 下两个位置的注册表:

第一个: HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.7

第二个: HKEY_CLASSES_ROOTWow6432NodeCLSID{00020812-0000-0000-C000-000000000046}InprocServer3214.0.0.0

 

步骤 2-1. 开始  / 执行 / 输入 regedit  / 按下 Enter (确定)

SNAGHTMLdc15e4

 

 

步骤 2-2.  把 HKEY_CLASSES_ROOTTypeLib{00020813-0000-0000-C000-000000000046}1.7 目录删除或备份 (PS. 我是把上一层目录直接备份,让系统自己产生新的…即加上“ _backup ”  )

image

 

 

 

步骤 2-3. 把 HKEY_CLASSES_ROOTWow6432NodeCLSID{00020812-0000-0000-C000-000000000046}InprocServer3214.0.0.0 目录删除或备份 (PS. 我是把目录直接备份了…. 即加上“ _backup ” )

image

 

 

就这样………程序过来就能正常执行了!