我在C#(ApplicationClass)中使用Excel互操作,并在我的finally子句中放置了以下代码:
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
虽然这种工作,Excel.exe即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.
我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?
在我的公司中,发布Excel Interop Objects的常用方法是使用IDisposable,方法如下:
Public Sub Dispose() Implements IDisposable.Dispose
If Not bolDisposed Then
Finalize()
System.GC.SuppressFinalize(Me)
End If
End Sub
Protected Overrides Sub Finalize()
_xlApp = Nothing
bolDisposed = True
MyBase.Finalize()
End Sub
Run Code Online (Sandbox Code Playgroud)
在IDisposable构造函数中以下列方式创建的位置:
Try
_xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)
Catch e As Exception
_xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
End Try
Run Code Online (Sandbox Code Playgroud)
并且客户端使用_xlApp执行有关excel互操作对象的代码.
我们完全避免使用双点规则.现在我开始研究如何重新发布(Excel)互操作对象以及我发现的几乎所有关于它的讨论如何正确清理excel互操作对象或释放Excel对象主要使用Marshal.ReleaseComObject(),它们都没有使用IDisposable接口.
我的问题是:使用IDisposable Interace释放excel互操作对象有什么缺点吗?如果是这样,这些不利因素是什么.
在Microsoft Office AddIn中,我们在事件中传递COM对象.举一个特定的情况,当Word打开一个文档时,我们被调用并传递一个Document对象.那么我们什么时候需要调用Marshal.ReleaseComObject()?
如果我们错过了发布会怎么样?我们持有的任何COM对象在不确定的时间内包含在我们的类中,并且实现了IDisposable.我们完成后调用Dispose().但是处理这个问题的一些代码很复杂,我猜我们偶尔会遇到一个不调用Dispose的情况.
我们最好有一个终结器,然后为这些对象的每个实例增加开销(很多!)?或者我们最好使用少量从未发布的Word COM对象?
谢谢 - 戴夫