どうも、あおです。
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
これでボタン押下後に
消えた!
無事解放されました。