Я перехожу с компьютера 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
был точно или почему он исчез, но поскольку код ничего не делал с ним, кроме регистрации значения, его стирание устранило эту проблему.