如何用IDisposeable接口发布excel对象

我正在写一个Excel类,我想自动释放这个非托pipe对象。 我正在使用IDisposable模式并编写Dispose方法。 例子;

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对象”。 在代码中有我的错误吗?

正如我在这里回答你的其他相关问题所解释的那样,你不应该在你的终结器中对引用types采取行动。 你通过使用Disposed(bool)方法的bool disposing参数来强制执行,就像你所做的一样。 当Disposed(bool)void Dispose()方法中显式调用时,传入的是false ,并且在从终结器调用时也传入false ,这也是您已完成的。

但是,您还需要保护对excel.Quit()调用,以便在通过终结器调用Disposed(bool)调用它。 也就是说,当bool disposing excel.Quit()参数为true时,应该只调用excel.Quit()

因此, Disposed(bool)方法的代码应如下所示:

 public void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { excel.Quit(); } disposed = true; } } 

一旦完成,你可以使用你的“MSExcel”类如下:

 using (MSExcel msExcel = new MSExcel) { // The code calling your 'MSExcel' object goes here. } 

通过这样做,当代码到达使用语句块的右括号“}”时,“MSExcel”类中的Dispose方法将自动调用,确保excel.Quit()被确定性地调用,而不是从终结者。

希望这可以帮助…

麦克风