Проверка работоспособности Office при использовании Office Automation

Есть ли способ проверить, зависает ли Microsoft Office (например, Word, Excel) при использовании Office Automation? Кроме того, если процесс зависает, есть ли способ его прервать?

Ответ 1

Позвольте мне начать говорить, что я не рекомендую делать это в службе на сервере, но я сделаю все возможное, чтобы ответить на вопросы.

Работа в качестве сервиса затрудняет очистку. Например, с тем, что у вас работает как служба, выжить, убивая подвешенное слово или преуспеть. Вы можете быть в состоянии убить службу. Будет ли ваше обслуживание остановлено, если слово или excel находится в этом состоянии.

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

Лучший способ определить, висел ли он, - попросить его сделать то, что он должен делать, и проверить результаты. Мне нужно узнать больше о том, что он на самом деле делает.

Вот несколько команд для использования в пакетном файле для очистки (оба должны быть в пути):

  • sc stop servicename - останавливает службу с именем servicename
  • sc start servicename - запускает службу с именем servicename
  • sc query servicename - запрашивает статус servicename

  • taskkill/F/IM excel.exe - завершает все экземпляры excel.exe

Ответ 2

Я помню, как это делалось несколько лет назад, поэтому я говорю о Office XP или 2003 днях, а не о 2007 году.

Очевидно, лучшим решением для автоматизации в наши дни является использование нового формата XML, который описывает docx и т.д., используя пространство имен System.IO.Packaging.

В то время я замечал, что всякий раз, когда MSWord пинал ведро и хватило, на машине работал процесс под названием "Доктор Уотсон". Это была моя первая подсказка, что Слово споткнулось и упало. Иногда я мог видеть более одного WINWORD.EXE, но мой код просто использовался для сканирования хорошего доктора. Как только я увидел это (в коде), я убил все WINWORD.EXE, обрабатывая самого хорошего доктора, и перезапустил процесс пыток Word: -)

Надеюсь, что вы получите некоторые подсказки относительно того, что искать.

Все самое лучшее,

Rob G

P.S. Я даже мог бы выкопать код в своих архивах, если вы не придете!

Ответ 3

Я могу ответить на вторую половину; если у вас есть ссылка на объект приложения в вашем коде, вы можете просто называть его "Quit":

private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();

Для проверки зависания процесса, я думаю, вы захотите попытаться получить некоторые данные из приложения и посмотреть, получите ли вы результаты в разумные сроки (проверьте таймер или другой поток или что-то еще). Вероятно, есть лучший способ.