У меня есть (устаревшее VB.Net) приложение, которое извлекает данные из некоторых таблиц, заполняет шаблон слова и объединяет этот шаблон с несколькими другими файлами.
На нескольких машинах это работает без проблем, но для одного клиента существует постоянная проблема, когда код Word Interop выдает Object reference not set to an instance of an object
при попытке открыть файл шаблона (который существует и не имеет проблем с разрешениями и т. д.).
Dim doc As Document
Dim msWord As Microsoft.Office.Interop.Word.Application
msWord = New Microsoft.Office.Interop.Word.Application
' next line throws "Object reference not set to an instance of an object"
doc = msWord.Documents.Add(verifiedTemplateName)
При работе в (ужасно реализованном) режиме отладки, который вызывает кучу модальных диалогов, которые запускают и останавливают выполнение, исключение не выдается.
Dim doc As Document
Dim msWord As Microsoft.Office.Interop.Word.Application
msWord = New Microsoft.Office.Interop.Word.Application
MsgBox("VooDoo coder at work")
' now no exception is thrown
doc = msWord.Documents.Add(verifiedTemplateName)
При работе в обычном режиме с задержкой в несколько секунд исключение не выбрасывается.
Dim doc As Document
Dim msWord As Microsoft.Office.Interop.Word.Application
msWord = New Microsoft.Office.Interop.Word.Application
Delay(5) ' function that pauses for one second
' now no exception is thrown
doc = msWord.Documents.Add(verifiedTemplateName)
Это говорит о том, что на некоторых машинах приложению Word.Application требуется некоторое время, чтобы «раскрутиться».
Но как лучше поймать это и продолжить, когда оно существует; или выдать ошибку, если сроки непристойны (как всегда, лучше решать в местной юрисдикции)?
Об этой проблеме также сообщают другие участники форумов MSDN @ Метод WordApplication.Documents.Add возвращает значение null?
Единственные предлагаемые решения, которые я видел, - это потенциальные бесконечные циклы:
Document nulldoc = null;
do
{
document = application.Documents.Add(template, newtemplate, documenttype, visible);
Thread.Sleep(100);
}
while (document == nulldoc);
Есть ли лучшее решение этой проблемы, чем глупые задержки или, возможно, бесконечные циклы проверки?
См. также: Ошибка при создании экземпляра Word в VB .net. Та же ошибка, аналогичный код; но решение заключалось в том, чтобы убедиться, что целевой файл существует (в моем случае это действительно так).