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