Назад | Перейти на главную страницу

Код .Net, автоматизирующий Excel, имеет ошибку «Катастрофический сбой» из-за взаимодействия на новом сервере

Я перехожу с компьютера Windows Server 2008 R2 с Excel 2003 на другой компьютер с Windows Server 2012 R2 с Excel 2013.

Частью миграции является перемещение кода, который считывает текстовые файлы и выводит файлы Excel путем запуска Excel в фоновом режиме. Это программы .Net 2.0, написанные кем-то, кого сейчас нет (я мог бы связаться с автором, но у меня нет бюджета, чтобы попросить о помощи ... Я должен платить ты, Уважаемый читатель!)

Каталоги инструментов и файлов ввода одинаковы на обеих машинах, и когда я запускаю команду на старый сервер, он записывает файл Excel за несколько секунд. Когда я запускаю его на новый сервер, это дает мне эту ошибку:

Unhandled Exception: System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
   at Microsoft.Office.Interop.Excel.ApplicationClass.get_Hinstance()
   at Pareto_Reports_v10dot5.Pareto_Reports.Main(String[] args)

ProcessExplorer показывает новый процесс Excel - значит, инструмент дошел до его запуска - с помощью этой командной строки:

"C:\Program Files\Microsoft Office\Office15\EXCEL.EXE" /automation -Embedding

Когда я просматриваю сообщение об ошибке «Катастрофический сбой», я вижу сообщения о IIS и коде в разработке, но я запускаю исполняемый файл working-in-other-environment из командной строки - эти другие сообщения, похоже, неприменимы.

Если вам нужна дополнительная информация, просто спросите ...

Изменить - старый компьютер имеет версии .Net 2.0.50727.4927 и 3.0.30729.4926 и 3.5.30729.4926

У новинки есть версии 2.0.50727.4927 и 3.0.30729.4926 и 3.5.30729.4926 и 4.0.0.0 и 4.5.51641 (все версии просматриваются из regedit)

У меня нет исходного кода. Спросит о получении; если он все еще существует, то этот вопрос немного изменится.

Надеялся, что это простая проблема какой-то новой функции безопасности в Excel 2013 или Windows 2012, но, видимо, не все так просто.

Было две точки отказа:

Вызов Interop.Excel.ApplicationClass.Calculate() вызвало что-то в книге, что требовало модуля VBAProject «Общие элементы управления Microsoft Windows 6.0 (SP6)». Я смог перенести это со старого сервера, запустив это на новом сервере:

cd C:\Windows\SysWOW64
copy \\Old-server\C$\Windows\SysWOW64\MSCOMCTL.OCX .
regsvr32 MSCOMCTL.OCX

Второй сбой потребовал изменения исходного кода C #. Он пытался зарегистрировать значение Interop.Excel.ApplicationClass.Hinstance который вызывал исключение. Я не знаю что Hinstance был точно или почему он исчез, но поскольку код ничего не делал с ним, кроме регистрации значения, его стирание устранило эту проблему.