Excel互操作中偶尔出现奇怪的InvalidCastException错误

时间:2010-08-30 14:51:51

标签: vb.net excel interop vsto

我正在开发一个相当全面的Excel加载项,应用了很多操作。获取工作簿,以新名称保存,应用操作(添加名称,更改公式等)。

通常它工作正常,但有时.Net几乎在我的任何CType上都会抛出InvalidCastException。当我确认错误并在完全相同的Excel工作簿上再次运行代码(不退出Excel)时,不会发生错误。 InvalidCastException可能发生在所有尝试的40%中,否则加载项会成功。

最近,我不得不从C#转换为VB.Net。我一直使用CType,比如Dim interior = CType(cl.Interior, Excel.Interior)(其中一个失败的语句)。错误不会发生在同一个地方,但在我的程序中,也在转换范围时,For Each r As Excel.Range In largerRange以及我在Object中使用For Each和CType到Excel时都不会发生错误。范围。在后一种情况下,我在Range中获取了一个Object,但是Excel.Range的CType失败了。有没有办法在这一点上检查对象?

我真的不知道为什么加载项失败了一次而另一个加载完成没有错误,即使没有重新加载Excel(或任何其他参与的DLL)。

非常感谢任何帮助!

PS:VS2010,.Net 3.5SP1,Excel 2007,Imports Excel = Microsoft.Office.Interop.Excel

2 个答案:

答案 0 :(得分:0)

马丁,我不是专家,但你确定你需要经常使用CType吗?例如,这是一个简单的VSTO插件,它可以操作你提到的一些对象而不需要强制转换。它的目标是Excel 2010和.Net 4。

    Public Class ThisAddIn
        Private Sub ThisAddIn_Startup() Handles Me.Startup
            test()
        End Sub
    End Class

Module Module1
    Sub test()
        Dim appExcel As Excel.Application
        Dim wb As Excel.Workbook
        Dim ws As Excel.Worksheet
        Dim intr As Excel.Interior

        appExcel = Globals.ThisAddIn.Application
        With appExcel
            .Visible = True
            appExcel.ActiveWorkbook.Close(SaveChanges:=False)
            wb = appExcel.Workbooks.Add
            ws = wb.Worksheets(1)
            For Each cell As Excel.Range In ws.Range("A1:B2")
                intr = cell.Interior
                intr.ColorIndex = cell.Row + cell.Column
            Next
        End With
    End Sub
End Module

答案 1 :(得分:0)

这似乎是一个众所周知的问题,据我所知,微软的官方回应是“升级到更新版本的.NET”。

请参阅MSDN论坛上的this主题,最后以Tom Xu [MSFT]声明:

  

此问题似乎已在Visual Studio 2010中得到修复。我认为它可以解决FerchoArg的问题。