Ошибка RPC появляется, когда «указатель» на COM-объект неправильно выводится из памяти, прежде чем код попытается использовать его повторно.Это достаточно распространенная проблема при автоматизации приложений Office вне самого приложения.Особенно при работе с .NET необходимо соблюдать особую осторожность.
Еще одна очень важная вещь, на которую следует обратить внимание, это то, что ключевое слово New
никогда не должно использоваться ни с одним объектом Office , кроме Application
.Хотя API допускают это, никогда не используйте New Document
с Word, поскольку это создает объект Document
, который не может быть корректно освобожден.
Из соображений эффективности запускайте приложение Word один раз должно быть достаточно - нет необходимости повторять это в цикле, если используемые им COM-объекты правильно освобождены (установлено значение Nothing
и сборка мусора).
Я бы написал код ввопрос следующим образом:
Private Sub LoopTemp()
Dim oDir As New DirectoryInfo(dPath)
Dim oFileArr As FileInfo() = oDir.GetFiles()
Dim oFile As FileInfo
Dim oVar As Variable = Nothing
Dim oWord As Application = NOthing
Dim oDoc As Document = Nothing
oWord = New Word.Application
oWord.Visible = False
For Each oFile In oFileArr
oDoc = oWord.Documents.Open(oFile.FullName)
For Each oVar In oDoc.Variables
MsgBox(oVar.Name)
Next
oVar = Nothing
oDoc.Close(SaveChanges:=WdSaveOptions.wdSaveChanges)
oDoc = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
Next
oWord.Quit()
oWord = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub