VB:加载类型库/ DLL时出错。 (来自HRESULT的异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY)

时间:2018-05-07 08:41:40

标签: excel vb.net office-interop

我正在开发一个需要从Excel导入数据的应用程序。

我的解决方案是使用Microsoft.office.Interop.Excel.

但是我在调​​试时遇到了这个错误:

  

Message =无法转换类型的COM对象   ' Microsoft.Office.Interop.Excel.ApplicationClass'到界面类型   ' Microsoft.Office.Interop.Excel._Application&#39 ;.此操作失败   因为QueryInterface调用COM组件的接口   与IID' {000208D5-0000-0000-C000-000000000046}'由于失败而失败   以下错误:加载类型库/ DLL时出错。 (例外   HRESULT:0x80029C4A(TYPE_E_CANTLOADLIBRARY))

以下是我的代码:

Imports Excel = Microsoft.office.Interop.Excel

Private Sub BExcel1_Click(sender As Object, e As EventArgs) Handles BExcel1.Click
    OpenFileDialog1.Filter = "Excel Files|*.xlsx; *.xls; *.xlsm"
    If (OpenFileDialog1.ShowDialog() = DialogResult.OK) Then
        ExcelPath1.Text = OpenFileDialog1.FileName
    End If

    Dim XlApp As New Excel.Application
    Dim XlWorkBook As Excel.Workbook
    Dim XlWorkSheet As Excel.Worksheet
    XlWorkBook = XlApp.Workbooks.Open(ExcelPath1.Text)

 End Sub

我已经google搜索了一些解决方案(如下所示),但它们没有成功:

  1. 我修复了Office
  2. 我修复了Visual Studio
  3. 我使用了注册表编辑器来检查Computer\HKEY_CLASSES_ROOT\TypeLib\,但在00020813-0000-0000-C000-000000000046下,我只有一个版本1.9,看起来不像两个版本之间的冲突?
  4. 有任何解决这个问题的想法吗?

    VS version:2017 community
    
    Excel version:2016
    
    Microsoft.Office.Interop.Excel version:15.0.0.0
    

2 个答案:

答案 0 :(得分:0)

如果为Office Interop程序集引用将Embed Interop Types属性设置为True(自.NET Framework 4.0起),并且将Specific Version属性设置为False以进行Office Interop程序集引用,则您的代码应该适用于任何版本的Excel。

但是,您必须以与Office相同的位编译代码。对于32位版本的Office,必须将代码编译为x86,否则在64位计算机上仍然会发生此异常!

答案 1 :(得分:-1)

首先,尝试使用/ResetUserData命令行参数运行Visual Studio。请在Error "Unable to cast COM object..." when exporting to Microsoft Excel from Team Explorer 2008文章中详细了解相关内容。

显然,您正在尝试连接错误的Excel版本。卸载旧版本的Office后,您似乎还有一些额外的Windows注册表项,反之亦然。无论如何,请查看描述完全相同问题的How to solve “Unable to cast COM object of type Microsoft.Office.Interop.Excel.ApplicationClass’ to interface type ‘Microsoft.Office.Interop.Excel._Application’”博客文章。基本上你需要在Windows注册表中找到一个错误的条目,然后删除它。

BTW当您向项目添加新的COM引用时,会自动生成错过的PIA(如果它不再存在)。所以,这是一种可能的方式。您也可以尝试将互操作类型嵌入到您自己的程序集中,如下面的屏幕截图所示:

enter image description here