我在下面的代码中有一个类,其中定义了一些类级Excel对象。 当我从另一个类调用excelModule.Test时 所有这些Excel对象都已创建,我可以在任务管理器中看到Excel实例。
我们是否有类的卸载事件来释放这些对象?
Module excelModule
Public myRange As Excel.Range
Public mySheet As Excel.Worksheet
Public wb As Excel.Workbook
Public ex As New Excel.Application
Public Sub Test()
End Sub
End Module
答案 0 :(得分:4)
虽然Robert建议调用Quit可能有效,但它也存在缺陷,因为如果用户在应用程序创建Application对象之前打开Excel,则调用Quit将退出其打开的Excel实例。
问题是COM应用程序不知道您已完成对Excel Application对象的引用。即使它超出范围并且有资格进行垃圾收集/完成,也不会立即进行最终确定。
在极少数情况下,有必要在COM对象上调用Marshal.FinalReleaseComObject,但大多数情况下这不是必需的。
因此,虽然显式触发垃圾收集几乎总是不受欢迎,但实际情况是,它有时需要在.NET / COM互操作中使用。试试这个(在确保你不再持有任何对Excel对象的引用之后......)
GC.Collect();
GC.WaitForPendingFinalizers();
答案 1 :(得分:1)
因为您正在使用非托管资源,所以应该将模块更改为类,并让该类实现IDisposable接口。在Dispose方法中,请确保正确处理Excel对象。
然后当您使用excel包装类时,请在Using
块中执行此操作:
Using e as New ExcelWrapper()
e.Test()
End Using