C# 如何使用IDisposable界面发布excel对象
我正在编写一个excel类,我想自动释放这个非托管对象。 我正在使用IDisposable模式和write-Dispose方法。 榜样C# 如何使用IDisposable界面发布excel对象,c#,excel,release,idisposable,C#,Excel,Release,Idisposable,我正在编写一个excel类,我想自动释放这个非托管对象。 我正在使用IDisposable模式和write-Dispose方法。 榜样 class MSExcel : IDisposable { ApplicationClass excel; bool disposed; public MSExcel() { disposed = false; excel = new ApplicationClass(); }
class MSExcel : IDisposable
{
ApplicationClass excel;
bool disposed;
public MSExcel()
{
disposed = false;
excel = new ApplicationClass();
}
public void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
}
excel.Quit();
disposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MSExcel()
{
Dispose(false);
}
}
但是我在exc.Quit()上有一个经典错误。
“已与其基础RCW分离的COM对象”。
在代码中有任何错误吗?正如我在回答您的其他相关问题时所解释的,您不应该在终结器中对引用类型采取操作。您可以通过使用
Disposed(bool)
方法的bool disposing
参数来实现这一点。当从void Dispose()
方法显式调用Disposed(bool)
时,传入true
,当从终结器调用时传入false
,您也完成了此操作
但是,您还需要保护对excel.Quit()
的调用,以便在通过终结器调用Disposed(bool)
时不会调用它。也就是说,只有当bool-disposing
参数为true
时,才应该调用excel.Quit()
因此,Disposed(bool)
方法的代码应如下所示:
public void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
excel.Quit();
}
disposed = true;
}
}
using (MSExcel msExcel = new MSExcel)
{
// The code calling your 'MSExcel' object goes here.
}
完成后,您可以按如下方式使用“MSExcel”类:
public void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
excel.Quit();
}
disposed = true;
}
}
using (MSExcel msExcel = new MSExcel)
{
// The code calling your 'MSExcel' object goes here.
}
通过这种方式,当代码到达块的右括号“}”时,“MSExcel”类上的Dispose方法将被自动调用,从而确保以确定方式调用excel.Quit()
,而不是从终结器调用
希望这有助于
Mike“Dispose”用于释放对象,但您将其用于应用程序逻辑,即退出Excel。将quit方法移到其他位置,不要依赖Dispose为您退出Excel,您应该自己完成。假设有人在处理Excel。应用程序类的quit方法为第一个参数(SaveChanges)提供真值,可防止在关闭过程中出现挂起更改的情况。当Excel.Application的Visible属性设置为False时,这应该是一个主要问题,这主要发生在自动化过程中。