2012-03-31 17 views
1

ここでは、excel comオブジェクトを参照するときにダブルドットを使用しないことについて多くのスレッドを読んだので、私はそれを実装することにしました。excelプロセスを終了する

私のループでやるまでにはうまくいった。

ここは私のループです。私がこれをコメントアウトするとうまくいくことに注意してください:

 for (int i = 1; i < dgv.Columns.Count + 1; i++) 
     { 
      excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 

      var cell = excelWorkbook.Cells[1, i]; 
      var fontSetter = cell.Font; 
      fontSetter.Bold = true; //Bolds the header row 

      // Garbage collecting 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

      Marshal.FinalReleaseComObject(fontSetter); 
      Marshal.FinalReleaseComObject(cell); 
     } 

私のコードはそれらの変数を正しく処分してはいけませんか?私はHow do I properly clean up Excel interop objects?(第2の回答)での手順をオーバー従うことをしようとしています

[Code removed] 

答えて

1

それはこの権利を取得することは容易ではありません。

は、ここに私の完全なコードです。しかし、私は次のようにしてもコンパイル驚い:

excelWorkbook.Cells[1, i] = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

はおそらく、あなたは意味:私はあなたのポイントが表示されていない

var cell = excelWorkbook.Cells[1, i]; 
cell.Value = dgv.Columns[i - 1].HeaderText; 

:置き換えてください

excelWorkbook.Cells[1, i].Value = dgv.Columns[i - 1].HeaderText; 
var cell = excelWorkbook.Cells[1, i]; 

をとfontSetterの範囲外になるので、GC.CollectGC.WaitForPendingFinalizersがコールされます。

最後に、Marshal.FinalReleaseComObjectへの呼び出しは、おそらくfinallyブロック内にあるべきで、例外がスローされても実行されるはずです。

+0

私は試しに完全なループをputtngしてからやり直してみましたが、変数を見つけることはできませんでした。おそらく、ループで宣言されているからでしょうか? – TheGateKeeper

+0

はい、try/finallyはループ内になければなりません。見た目が変わるたびに、新しいセルとそのフォントを参照し、それらのすべてを解放する必要があります。 – Joe

+0

私は以下のように簡単な方法でそれをやった – TheGateKeeper

0

How do I properly clean up Excel interop objects?のナイトコーダーで指定された方法に従った。

あなたは何も参照する必要はなく、それらの中で最も混乱が少なく、そのIDでプロセスを終了します。探している人に役立つことを願っています。

関連する問題