【问题标题】:Weird occasional InvalidCastException in Excel interopExcel 互操作中奇怪的偶尔 InvalidCastException
【发布时间】:2013-06-12 07:11:57
【问题描述】:

我正在开发一个相当全面的 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 以及当我在For Each 中使用Object 和CType 到Excel.Range 时也是如此。在后一种情况下,我在 Range 中获取了一个 Object,但 Excel.Range 的 CType 失败。此时有什么方法可以检查对象吗?

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

任何帮助将不胜感激!

PS:VS2010、.Net 3.5SP1、Excel 2007、导入 Excel = Microsoft.Office.Interop.Excel

【问题讨论】:

  • Martin,它是 VSTO 插件还是 Com?
  • Martin,如果你回到 SO,我很想知道你是否在这个项目中使用了版本控制。我有同样的问题,想知道它是否与git有关。

标签: vb.net excel interop vsto


【解决方案1】:

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

请参阅 MSDN 论坛上的 this 主题,该主题以 Tom Xu [MSFT] 结尾:

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

【讨论】:

    【解决方案2】:

    Martin,我不是专家,但你确定你需要经常使用 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
    

    【讨论】:

    • 好吧,正如我所说,对于 Excel.Range 的每个单元格也失败了...我不是在每种情况下都使用 CType,主要是在返回类型为 Object 时...不过,一个即使没有必要,CType 也不应该受到伤害,对吧?
    • 我不清楚您所说的 Excel.Range 是什么意思。我在类似的情况下看到过关于 CType 的编译器警告。我会说尝试消除它们。您可以尝试发布更多代码。我很难理解你在说什么。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2012-06-18
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    相关资源
    最近更新 更多