どうも、あおです。
VB.NETでExcel操作をするとき、なぜかメモリが解放されずに
困ってしまうことがあります。
もちろん、Excel処理終了時には、
以下のようにReleaseComObjectは実施しています。
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsRange, Object)) System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsSheet, Object)) System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsSheets, Object)) xlsBook.Close(False) System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsBook, Object)) System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsBooks, Object)) xlsApplication.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsApplication, Object))
ループでExcelオブジェクトを使用している場合にも、
毎回解放する必要があります。
以下、サンプル
For Each row As DataRow In dt.Rows
For Each column As DataColumn In dt.Columns
xlsRange.NumberFormatLocal = "@"
xlsRange.Value = row(column)
System.Runtime.InteropServices.Marshal.ReleaseComObject(DirectCast(xlsRange, Object))
End If
Next
Next
それでも解放されずに、タスクマネージャーにExcel氏が
残ってしまう場合。なんでやねん!となります。
そこで、最終手段。
Excel処理を呼び出しているボタン押下処理の
「End Sub」手前行に「GC.Collect()」を記載します。
以下のように。
Public Class FormGc
Private Sub BtnGc_Click(sender As Object, e As EventArgs) Handles BtnGc.Click
'Excel処理・・・・
'メモリ解放
GC.Collect()
End Sub
End Class
これでボタン押下後に
消えた!
無事解放されました。

