我正在构建一个派生自Stream
的类来包装COM IStream。但是我遇到了一个问题,我需要确定地释放COM IStream。
好的,只需在Marshal.ReleaseComObject
方法中使用Dispose
即可。但是我不确定那么简单。 Stream
基类已经有一个受保护的虚方法Dispose(boolean)
。这是我的第一个想法: -
~ComStreamWrapper()
{
if (!_Disposed)
{
iop.Marshal.FreeCoTaskMem(_Int64Ptr);
iop.Marshal.ReleaseComObject(_IStream);
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!_Disposed)
{
if (disposing)
{
iop.Marshal.FreeCoTaskMem(_Int64Ptr);
iop.Marshal.ReleaseComObject(_IStream);
}
_Disposed = true;
}
}
您会注意到Dispose()
本身没有实现。我目前正在假设Stream
上的现有实施完成了我需要的工作。这是致电Diposing(true)
和GC.SuppressFinalize
。这个假设是错误的吗?
我错过了什么吗?有更好的方法吗?您可以在此answer中看到更多基本类的问题。
答案 0 :(得分:3)
重写Disposing方法并从终结器中调用它将完成工作。请注意,您希望在两种情况下都释放资源。因此:
~ComStreamWrapper()
{
Dispose(false);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!_Disposed)
{
iop.Marshal.FreeCoTaskMem(_Int64Ptr);
iop.Marshal.ReleaseComObject(_IStream);
_Disposed = true;
}
}
答案 1 :(得分:2)
我目前正在做出假设 那个现有的实现 Stream做我需要的东西。那是 调用Diposing(true)和 GC.SuppressFinalize。这是 假设有错?
这正是它的作用。好吧,它调用Close,即:
public virtual void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
当你想要对某些标准类真正做的事情做出明确答案时的一般提示,在Reflector中打开它并查看它的C#反汇编。
答案 2 :(得分:0)
此配置方法:
protected virtual void Dispose(bool disposing)
是一种常见的模式。我假设框架中的每个Dispose方法都是这样的(只要可以派生类):
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}