2014-02-27 80 views
1

我有下面的代碼塊:使用C#互操作不關閉Excel進程執行之後

Excel.Application xlApp = new Excel.Application(); 
    Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(this.pathToFile); 
    Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; 
    Excel.Range xlRange = xlWorksheet.UsedRange; 

我推xlRange到一個數組:

someArray = (System.Object[,])xlRange.Value2; 

然後我嘗試清理用:

Marshal.ReleaseComObject(xlRange); 
    Marshal.ReleaseComObject(xlWorksheet); 

    xlWorkbook.Close(); 
    Marshal.ReleaseComObject(xlWorkbook); 
    xlApp.Quit(); 
    Marshal.ReleaseComObject(xlApp); 

但是,即使所有四個excel對象都以Marshal發佈,該進程保持打開狀態並阻止文件再次打開。

有關如何正確清理excel對象的任何想法?

+3

海一看[在回答這個問題(http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects?rq=1)您的問題是您正在使用Workbook.Open,請嘗試Excel.Workbooks xlWorkbooks = xlApp.Workbooks,Excel.Worbook = xlWorkbooks.Open(this,pathtofile);然後確保添加發布工作簿,並將null設置爲空並運行垃圾收集器。與您的工作表和工作表相同。使用com對象從不在右側有2個點。 – user2140261

+2

我想這是一個類似的問題http://stackoverflow.com/questions/6960693/excel-process-doesnt-get-closed。 你有沒有嘗試在那裏建議的解決方案? – Uroboros

回答

0

我有一個類似的問題,並設法關閉該過程後的應用程序;

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

Marshal.FinalReleaseComObject(xlRange); 
Marshal.FinalReleaseComObject(xlWorksheet); 

xlWorkbook.Close(false, Type.Missing, Type.Missing); 
Marshal.FinalReleaseComObject(xlWorkbook); 

xlApp.Quit(); 
Marshal.FinalReleaseComObject(xlApp);