Запутанный указатель вне границ в коллекции фигур - PullRequest
3 голосов
/ 06 июня 2019

Я пытаюсь исправить несовместимую проблему в некотором коде 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

Есть несколько вопросов, которые могут помочь мне решить эту проблему:

  1. Почему это не происходит каждый раз?
  2. Является ли базовый метод moveNext в трассировке, вызываемый в последней безусловной строке цикла вместо строк «для каждой» или «следующей» (добавление еще одной строки между iShp + = 1 и End If заставляет его вместо этого на этой линии)?
  3. Есть ли что-то необычное в циклах VB foreach (мой опыт - больше в C / Java) или в коллекциях взаимодействий, которые могут привести к тому, что он попытается выполнить итерацию после окончания коллекции фигур?

Любое понимание того, что может происходить здесь, приветствуется.

1 Ответ

0 голосов
/ 14 июня 2019

Кажется, что время от времени vb / word interop произвольно отходит от конца коллекции фигур.Приведенный ниже код, заменяющий «для каждого» на «от x до y», успешно выполнялся статистически значимое количество раз (около 50) в нескольких средах.Я знаю, что это не очень хороший ответ и до сих пор не отвечает на вопрос, почему это происходит, но действительно решает проблему, поэтому публикация в качестве ответа на случай, если пример поможет кому-то другому:

    Dim MyDoc As Word.Document = usrdoc.Document
    Dim NoteBoxes As New Collections.Generic.SortedDictionary(Of Integer, Word.TextFrame)
    Dim iShp As Integer = 1
    Dim loopLength As Integer = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes.Count
    Dim shp As Word.Shape = Nothing
    For i As Integer = 1 To loopLength '1-indexed
        shp = MyDoc.Sections.First.Headers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Shapes(i)
        If Not shp.TextFrame.Next Is Nothing Then
            NoteBoxes.Add(iShp, shp.TextFrame)
            iShp += 1
        End If
    Next
...