Migration

Excel 自動化 .Net 程式碼在新伺服器上出現來自 Interop 的“災難性故障”錯誤

  • December 15, 2016

我正在從帶有 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 中某些新安全功能的簡單問題,但顯然不是那麼簡單。

有兩個失敗點:

呼叫Interop.Excel.ApplicationClass.Calculate()觸發了工作簿中需要 VBAProject 模組*“Microsoft Windows Common Controls 6.0 (SP6)"*的內容。通過在新伺服器上執行它,我能夠將其從舊伺服器上帶過來:

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

第二次崩潰需要更改 C# 原始碼。它試圖記錄Interop.Excel.ApplicationClass.Hinstance拋出異常的值。我不知道究竟Hinstance是什麼或為什麼它消失了,但由於程式碼除了記錄值之外什麼也沒做,因此刪除它可以解決這個問題。

引用自:https://serverfault.com/questions/820339