Excel 自动化 .Net 代码在新服务器上出现 Interop 的“灾难性故障”错误

Excel 自动化 .Net 代码在新服务器上出现 Interop 的“灾难性故障”错误

我正在从运行 Excel 2003 的 Windows Server 2008 R2 机箱迁移到运行 Excel 2013 的 Windows Server 2012 R2 的另一个机箱。

迁移的一部分是移动读取文本文件并通过在后台运行 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 和开发中的代码的帖子,但是我正在从命令行运行这个在其他环境中工作的 exe - 那些其他帖子似乎不适用。

如果您需要任何进一步的信息,请询问...

编辑-旧机器有.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 中某些新安全功能的简单问题,但显然并非那么简单。

答案1

失败之处有两点:

调用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具体是什么原因,也不知道它为什么消失了,但由于代码除了记录该值外没有做任何其他事情,因此删除它就可以解决这个问题。

相关内容