如何发布Excel应用程序对象

时间:2011-02-18 04:27:35

标签: .net vb.net

我在下面的代码中有一个类,其中定义了一些类级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

2 个答案:

答案 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