2013-06-26 81 views
0

RTD服務器崩潰我已經寫了一個基於C#RTD服務器關閉的Kenny Ker's Multiple Topics in C#C#Excel 2007中退出

他的設計之間的主要區別和我的是,我的數據來自一個WCF客戶端。我使用相同類型的計時器,並且每隔幾秒鐘撥打m_callback.UpdateNotify();。我的RefreshData方法使用主題值調用我的WCF客戶端中的函數,並將結果用作excel的值。這一切都很好。

問題出在我關閉excel。

當我關閉Excel我得到一個消息框,上面寫着「Microft的Excel已停止工作」

ServerTerminate()方法清除我的所有話題,調用close我的WCF客戶端和出口上沒有錯誤。

我想這個問題可能是一個COM問題,所以我已經嘗試添加

while (Marshal.ReleaseComObject(m_callback) > 0) ; 
m_callback = null; 

的彈出仍表現,所以我嘗試添加

GC.Collect(); 
GC.WaitForPendingFinalizers(); //SEHException thrown from this 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

加上幾行就拋出異常。如果我忽略excel關閉的異常而沒有任何問題,但是如果我在裝有Excel 2010的計算機上安裝RTD服務器,那麼彈出框仍然存在。

我有Excel 2007中(12.0.6665.5003)MSO SP3(12.0.6662.5000) 我使用Visual Studio 2008開發我的C#RTD服務器和我的項目有版本的Microsoft.Office.Interop.Excel一個12.0.0.0參考

+0

請您詳細介紹如何在刪除Excel程序集時使其工作。我試着複製完全相同的接口,相同的GUID,保持TypeLibType和DispId ID沒有運氣。按照Kenny Ker的建議(http://weblogs.asp.net/kennykerr/archive/2008/12/16/Rtd7.aspx)將這些接口與MarshalAs參數結合起來。它只在一開始就起作用,但當它連接到ConnectData()是因爲我看到了數據,但是在它開始刷新之後,得到了一個N​​/A,之後根本不會看到任何數據。如果你在這裏粘貼接口或發送 –

+0

,我不得不在互操作程序集上使用對象瀏覽器來正確使用它。但[這裏](https://gist.github.com/buchmoyerm/9001271)是我使用的文件。不過,我已經轉向使用ExcelDna,我強烈推薦它。 – MarkB42

回答

0

這個問題相當模糊,但那是因爲我真的不知道從哪裏開始。每件事似乎都在正常工作。

玩過代碼後,我發現我有一個實現IDisposable的對象,當我完成它時,我調用Dispose。該對象還有一個名爲Dispose的終結器。我改變它更像this與受保護的Dispose(bool)

我也刪除了Excel彙編每Kenny Ker again(但只是複製他的代碼無法正常工作,實際上我直接從excel互操作程序集複製了接口)。

這樣做後,我能夠擺脫我添加的上方(用於編組垃圾收集)上面和excel現在關閉沒有問題。