Странные случайные исключения InvalidCastException в Excel - PullRequest
2 голосов
/ 30 августа 2010

Я разрабатываю довольно обширную надстройку для Excel, в которой используется множество операций.Возьмите рабочую книгу, сохраните ее под новым именем, примените действия (добавьте имена, измените формулы и т. Д.).

Обычно это работает нормально, но время от времени .Net создает исключение InvalidCastException практически для любого из моих типов CT.Когда я подтверждаю ошибку и снова запускаю код (без выхода из 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 to Excel.Range.В последнем случае я получаю объект в диапазоне, но CType to Excel.Range завершается ошибкой.Есть ли способ проверить объект на этом этапе?

Я действительно понятия не имею, почему однажды надстройка дает сбой, а другая завершается без ошибок, даже без перезагрузки Excel (или любой другой участвующей DLL).

Любая помощь будет принята с благодарностью!

PS: VS2010, .Net 3.5SP1, Excel 2007, Импорт Excel = Microsoft.Office.Interop.Excel

Ответы [ 2 ]

0 голосов
/ 12 июня 2013

Это, кажется, известная проблема, и, насколько я могу судить, официальный ответ от Microsoft - «Обновление до новой версии .NET».

См. this на форумах MSDN, который заканчивается тем, что Том Сюй [MSFT] заявляет:

эта проблема, кажется, была исправлена ​​в Visual Studio 2010. Я думаю, что это может быть ответом на проблему FerchoArg.

0 голосов
/ 31 августа 2010

Мартин, я не эксперт, но ты уверен, что тебе нужно так часто использовать 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
...