2017-07-10 2 views
-2

私はいくつかのコードを書いていますが、Application.Cellsを適切にリリースすることはできません。タスクマネージャで誰かがExcel.exeをリリースするのを助けることができる人はいますか?Application.Cellsを正しく解放する方法は?

using Excel = Microsoft.Office.Interop.Excel; 

Excel.Application app = null; 
Excel.Workbooks books = null; 
Excel.Workbook book = null; 
Excel.Sheets sheets = null; 

    for (int a = 0; a < dgrviRoute.RowCount; a++) 
    { 
     for (int b = 0; b < dgrviRoute.ColumnCount; b++) 
      { 
       DataGridViewRow row = dgrviRoute.Rows[a];          
       DataGridViewCell cell = row.Cells[b];          
       var value = cell.Value;                  
       app.Cells[a + 2, b + 1] = value; 
       /* 
       I still see the Excel.exe process in the Windows Task Managers’ 
       list of background processes. 

       This strange phenomenon occurs because in the above code, 
       Iam not releasing any COM objects and we’re also “chaining” 
       object references by using app.Cells[a + 2, b + 1]. 
       */ 

       /* 
       if (app.Cells[a + 2, b + 1] != null) Marshal.FinalReleaseComObject(app.Cells[a + 2, b + 1]); 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       */ 
      }      
    } 

私は、これは長い戦いでここHow to properly release Excel COM objects

答えて

1

でいくつかのチュートリアルをお読みください。私は自分のアプリのためにすべてを試しました。うまくいかなかった。 OpenXMLを使用すると、単純な書き込み関数の方が優れています。それはXML形式のExcelファイルを操作するだけでExcelアプリケーションを呼び出さない。この特定の状況では、すべてのExcelオブジェクトを処分するためにプロセス・キルを使用することができます。

System.Diagnostics.Process pro = ExcelProcess.GetExcelProcess(app); 
pro.Kill(); 

ExcelProcess.GetExcelProcess方法に

public class ExcelProcess 
{ 
    [DllImport("user32.dll")] 
    static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId); 

    public static System.Diagnostics.Process GetExcelProcess(oExcel.Application excelApp) 
    { 
     int id; 
     GetWindowThreadProcessId(excelApp.Hwnd, out id); 
     return System.Diagnostics.Process.GetProcessById(id); 
    } 
} 
を定義する必要があります
関連する問題