Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IDisposable界面发布excel对象_C#_Excel_Release_Idisposable - Fatal编程技术网

C# 如何使用IDisposable界面发布excel对象

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(); }

我正在编写一个excel类,我想自动释放这个非托管对象。 我正在使用IDisposable模式和write-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对象”。
在代码中有任何错误吗?

正如我在回答您的其他相关问题时所解释的,您不应该在终结器中对引用类型采取操作。您可以通过使用
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时,这应该是一个主要问题,这主要发生在自动化过程中。