Я пытаюсь исправить несовместимую проблему в некотором коде VB NET, который использует библиотеки MS Office Interop. При использовании тех же файлов и данных следующий код выдает это исключение:
Индекс в указанной коллекции выходит за пределы.
в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo)
в System.Runtime.InteropServices.CustomMarshalers.EnumeratorViewOfEnumVariant.MoveNext ()
в myProject.TableNotePages (clsUsrDoc & usrdoc) в пути \ file.vb: строка 1454
...
Строка 1454 - это строка iShp + = 1
Dim MyDoc As Word.Document = usrdoc.Document
Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
Dim iShp As Integer = 1
For Each shp As Word.Shape In MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes
If Not shp.TextFrame.Next Is Nothing Then
NoteBoxes.Add(iShp, shp.TextFrame)
iShp += 1
End If
Next
Есть несколько вопросов, которые могут помочь мне решить эту проблему:
- Почему это не происходит каждый раз?
- Является ли базовый метод moveNext в трассировке, вызываемый в последней безусловной строке цикла вместо строк «для каждой» или «следующей» (добавление еще одной строки между iShp + = 1 и End If заставляет его вместо этого на этой линии)?
- Есть ли что-то необычное в циклах VB foreach (мой опыт - больше в C / Java) или в коллекциях взаимодействий, которые могут привести к тому, что он попытается выполнить итерацию после окончания коллекции фигур?
Любое понимание того, что может происходить здесь, приветствуется.