2014-01-23 66 views
10

我有一個處理excel的應用程序。最近我遇到了一個Excel對象創建速度很慢的問題。如何調試慢Office應用程序互操作構造函數?

我已經重新發行這個簡單的代碼:

Microsoft.Office.Interop.Excel.Application xlApp; 
xlApp = new Microsoft.Office.Interop.Excel.Application(); 

第二行導致的延遲。

爲了測量新對象分配所需的時間,上面的代碼已經用時間跟蹤解決方案進行了擴展,結果是確鑿的。在正常情況下,上述代碼在0.5s內執行,而在FAULTY-BEHAVIOR的情況下可能需要長達5分鐘。

沒有內存泄漏,並且正在釋放excel對象。我的解決方案全年24/7運行,沒有任何問題。我不確定它是否重要,但應用程序在20個單獨的用戶會話(服務器計算機)上運行。因此,此應用程序同時運行20個副本,並可能導致同時運行20個Excel副本。

第一次在2個月前發現問題,並已通過升級Office(2010 - > 2013)解決。這次我有更多的時間進行調查,可悲的結果並不樂觀。

事實:

  • 只有一臺機器,目前受此問題的影響(24個CPU核心,拉姆的24GB)
  • CPU完全不強調當 「延遲」 發生
  • 我試過使用「進程監視器」應用程序來驗證當我們「新的Excel.Application()」構造函數(看看是否有任何過多的磁盤/內存/ CPU使用)時會發生什麼情況 - 沒有資源限制的跡象。沒有與COM對象相關的日誌文件的標誌等。
  • 這裏唯一的問題是這幾分鐘的延遲。所有其他Excel Interop命令都照常工作。

主要問題:

  • 有沒有辦法調試此Microsoft.Office.Interop.Excel.Application()構造函數,看看哪些部分是一個問題嗎?

外部內容

編輯 - 額外的測試

的PowerPoint構造不受延遲

ppApp = new Microsoft.Office.Interop.PowerPoint.Application(); 
+2

據我所知,這個構造函數啓動Excel應用程序。你可以在這臺機器上手動啓動它並查看加載需要多長時間?也許它正在安裝插件? – Taosique

+0

我認爲Interop在Excel啓動時默認禁用插件。該應用程序是否在登錄用戶配置文件或服務帳戶下運行? –

+0

@Taosique - 可以毫不拖延地手動啓動Excel。 –

回答

7

我已經找到了解決方案。我會發布它,因爲別人可能會遇到類似的問題,並可以爲他節省數小時/天的調查時間。

我做了什麼來找到解決辦法?

我已經分析了測試應用程序與過程(其中正在創建新的Excel應用程序基本上只有一條線)監測,並沒有表現出任何重要的東西。然後我用新開始的Excel過程重複分析。它突出顯示了衆多Windows註冊表的內容

HKEY_USERS\S-1-5-21-2929665075-1795331740-364918325-1024\Software\Microsoft\Office\15.0\Excel\Resiliency\DocumentRecovery 

在上面的位置我發現了數以萬計的密鑰。它們都是由Excel的「自動恢復」功能創建的。由於數字的原因,在啓動新的Excel對象時加載它們需要大約40秒。這個數字還乘以另外10-20個同時加載的會話(我提到我的應用程序正在20個用戶會話上運行?)。

解決方案: 刪除「Resilency」註冊表樹是有用的。

爲什麼所有這些「自動恢復」條目都在第一位?我想我不會很好地處理Excel的關閉,它會「認爲」我定期崩潰並「嘗試」幫助。


現在剩下的就是防止它再次發生。我將仔細看看我的ExcelClose()函數。

感謝您的關注 - 阿德里安

+0

這是非常好的問答,舊的彈性註冊表鍵:) –

2

我不認爲問題出在這個構造函數上。嘗試動態創建對象:

var obj = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application")); 

然後將其轉換爲Microsoft.Office.Interop.Excel.Application

var xlApp = (Microsoft.Office.Interop.Excel.Application)obj; 
MessageBox.Show(xlApp.Name); 

我期望放緩移至Activator.CreateInstance通話。

無論如何,你可以嘗試把下列爲您app.config文件(more details)周圍的工作吧:

<runtime> 
    <generatePublisherEvidence enabled="false"/> 
</runtime> 

我也建議,以確保您使用的是最新VSTO Runtime和最新Office PIAs

相關問題