gpt4 book ai didi

c# - 如何使用 IDisposable 接口(interface)释放 excel 对象

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:10 24 4
gpt4 key购买 nike

我正在写一个 excel 类,我想自动释放这个非托管对象。我正在使用 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 对象”。我的代码有什么错误吗?

最佳答案

正如我在回答您的其他相关问题时所解释的那样 here ,您不应该在终结器中对引用类型执行操作。正如您所做的那样,您可以通过使用 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;
}
}

完成后,您可以按如下方式使用“MSExcel”类:

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

通过这种方式,当您的代码到达您的 using statement 的右括号“}”时 block ,将自动调用“MSExcel”类上的 Dispose 方法,确保确定性地调用 excel.Quit(),而不是从终结器调用。

希望这有助于...

迈克

关于c# - 如何使用 IDisposable 接口(interface)释放 excel 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2089318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com