MS Word Interop C # RPC_E_SERVERCALL_RETRYLATER Ошибка - PullRequest
0 голосов
/ 16 октября 2011

Поэтому я продолжаю получать сообщение об ошибке RPC_E_SERVERCALL_RETRYLATER «Приложение занято» со следующим кодом. Стоит отметить, что этот точный код прекрасно работал с файлами Word 2003 и .doc. После обновления до 2007 года он больше не работает. Файл, в котором он получает счетчик разделов, является «.docx», и я убедился, что использовал правильную версию взаимодействия. Ошибка возникает в случайном месте в коде обычно.

 public int GetSectionsCount(string fileName) {
            wrdApp = new Application();
            Object file = fileName;
            Documents docs = wrdApp.Documents;
            wrdDoc = docs.Open(ref file, ref oMissing, ref oMissing,
                                                       ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                                                       ref oMissing,
                                                       ref oMissing,
                                                       ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                                                       ref oMissing,
                                                       ref oMissing,
                                                       ref oMissing);
            int count = wrdDoc.Sections.Count;
            wrdDoc.Close(ref oFalse, ref oMissing, ref oMissing);
            wrdApp.Quit(ref oFalse, ref oMissing, ref oMissing);
            Marshal.ReleaseComObject(docs);
            Marshal.ReleaseComObject(wrdDoc);
            Marshal.ReleaseComObject(wrdApp);
            wrdDoc = null;
            wrdApp = null;
            return count;
        }

Пример трассировки стека:

   at Microsoft.Office.Interop.Word.DocumentClass.get_Sections()
   at MyApplication.WordMerge.split(String fileToSplit, String whereToSave, String quarterExtension, Form1 pb) in\\Projects\\MyApplication\\WordMerge.cs:line 176
   at MyApplication.PMLettersManager.DoSplits() in \\Projects\\PyForms3\\PMLettersManager.cs:line 179
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

Код выполняется в своем собственном потоке, и никакой другой код автоматизации MS Word не запускается одновременно. Опять же, до обновления все работало нормально.

РЕДАКТИРОВАТЬ: Когда я сохранял рассматриваемый файл как .DOC вместо .DOCX, не было ошибок, и код работал нормально.

Ответы [ 2 ]

0 голосов
/ 28 октября 2011

Я нашел решение для этого. Когда я сохранил файл как .doc вместо .docx и попытался запустить код, он запустился без ошибок. По некоторым причинам наличие файла .docx вызывает серьезные проблемы с COM. Я не мог найти какой-либо другой способ, который работал (в том числе с помощью обработки ошибок COM и насос сообщений).

0 голосов
/ 16 октября 2011

IIRC, компонент Word COM является STA, поэтому любой вызов в него должен быть направлен в поток, который его создал.

Если по какой-то причине созданный поток не перекачивает сообщения, маршалинг не может произойти, и вы получаете сообщение об ошибке.

...