I am writing an excel class and i want to release this unmanaged object automatically.
I’m using IDisposable pattern and write Dispose methods.
Example ;
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);
}
}
But i have classical error on exc.Quit().
“COM object that has been separated from its underlying RCW”.
Have any my mistake in code?
As explained in my answer to your other related question here, you should not be taking actions on reference types from within your finalizer. You enforce this by making use of the
bool disposingparameter of yourDisposed(bool)method, as you have done. You pass intrue, whenDisposed(bool)is called explicitly from thevoid Dispose()method, and pass infalsewhen called from your finalizer, which you have also done.However, you also need to protect your call to
excel.Quit()so that it is not called whenDisposed(bool)is called via the finalizer. That is, you should only callexcel.Quit()when thebool disposingargument istrue.Therefore, the code for your
Disposed(bool)method should look as follows:Once done, you could make use of your “MSExcel” class as follows:
By doing it this way, when your code gets to the closing bracket, “}”, of your using statement block, the Dispose method on your ‘MSExcel’ class will be called automatically, ensuring that
excel.Quit()is called deterministically, and not from a finalizer.Hope this helps…
Mike