2008-10-27 107 views
3

有誰知道如何讓MS Office 2007 .NET C#Interop庫與Vista一起工作?Vista,Office Interop不起作用

我有一個.NET C#應用程序,我已設置爲作爲Windows服務運行。該程序將根據情況打開Word或Excel模板並修改其內容,然後將文檔保存回去。當我在使用Office 2007的Windows Server 2003或XP計算機上執行此操作時,所有這些工作都非常順利。當我將所有內容移至Server 2008框時,所有內容都停止工作。例如,在Excel中,我得到一個COM異常,告訴我當文件顯然存在時,Excel文件無法打開,手動執行時可以打開它。 Windows服務使用與登錄到計算機相同的用戶帳戶運行,並且該帳戶是管理員。

有沒有人知道該怎麼做?

回答

1

您應該避免將Office客戶端作爲服務器端應用運行。考慮使用xml作爲文件格式(xlsx用於Office 2007,或者使用Excel工作簿xsd用於(某種程度上)舊版本)。然後,您將可以免於在服務器上使用Excel API。

0

您是否在服務器上安裝了主互操作程序集?這些通常位於GAC中,在構建程序時不包含在bin目錄中,因此需要在服務器上本地安裝。

+0

是的,Interops在GAC中。 – Rob 2008-11-07 19:15:23

1

我確實發現了一個來自微軟的interesting article,基本上說不要做Office自動化。

+0

是的,在Office 2007中,他們將文件格式重新映射到Office Open XML或其他東西,這使您可以直接操作文件的內容而無需啓動某個Office應用程序。啓動Word或Excel的唯一原因應該是現在打印。 – sliderhouserules 2008-11-11 20:12:06

0

這只是一個猜測,但它可能是UAC。我知道特權(管理員)應用程序和用戶應用程序無法以任何方式向對方發送消息或進行通信。您的服務以管理員身份運行,但桌面在UAC下仍以普通用戶身份運行,即使它們是同一用戶。我也希望Office能夠在啓動時啓動(預先加載)自己的部分內容,並且將以普通用戶身份運行。

嘗試關閉UAC並查看是否有幫助。如果是這樣,至少你知道它是什麼。

+0

我關閉了UAC並獲得了相同的結果 – Rob 2008-11-11 18:50:21

0

您是否讓帳戶登錄到本機? Office不是服務器端應用程序,如果您嘗試在沒有桌面環境的情況下啓動任何可執行文件,您將會收到隨機錯誤。

0

有些事情要記住Office。它僅適用於x86,所以如果您在x64中創建應用程序,您將無法訪問Office基礎COM對象。您需要在x86中編譯您的應用程序,然後才能運行。

您可以通過進入項目屬性並在Visual Studio的構建選項卡下選擇x86來實現。

這是假設您的應用程序正在開發/運行在x64的環境中。

2

在Vista和Windows Server 2008上,服務運行在名爲Session0的東西上。在Vista之前,常規程序會在Session0和服務中運行。

這意味着Session0已經變成了桌面少的荒地,您的服務甚至無法訪問explorer.exe。我很確定問題在於Office應用程序希望能夠訪問通常在桌面上的幾個組件。

自的Excel,Word等只能支持一個桌面版的會話,你只有幾個選擇:

  1. 設置在您的服務屬性的登錄選項卡桌面複選框,然後祈禱它安撫Office神。 (它可能不會。)
    • 嘗試1後,通過您的代碼,並嘗試刪除/解決任何導致它崩潰的任何東西。
  2. 使用遠程處理/ WCF使服務器執行互操作,並使您的服務與它通信。
    • 您需要登錄交互式用戶,並且用戶需要以某種方式啓動服務器應用程序。也許最好使用自動啓動。
    • 您可以嘗試啓用自動登錄。 http://support.microsoft.com/kb/324737
  3. 嘗試使用CreateProcessAsUser和朋友模擬登錄用戶。
    • 注意:我不知道這工作得如何,除非用戶實際登錄,所以它可能不會比上述2更有用,並且更難以實現。 (需要P/Invoke)
  4. 重寫您的程序以使用OpenXML sdk或使用類似SpreadsheetGear的東西。
相關問題