2010-04-26 47 views
1

我正在构建一个派生自Stream的类来包装COM IStream。然而,我遇到了一个问题,我需要毫不犹豫地发布COM IStream。实现对从流派生的类进行处理

好吧,这很容易,只需在Dispose方法中使用Marshal.ReleaseComObject即可。不过我不确定那很简单。 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中看到了更多的基础课程来解决一个更加棘手的问题。

回答

3

重写处置方法,并从终结调用它会完成这项工作。请注意,您将希望在两种情况下都释放资源。因此:

~ComStreamWrapper() 
{ 
    Dispose(false); 
} 

protected override void Dispose(bool disposing) 
{ 
    base.Dispose(disposing); 
    if (!_Disposed) 
    { 
     iop.Marshal.FreeCoTaskMem(_Int64Ptr); 
     iop.Marshal.ReleaseComObject(_IStream); 
     _Disposed = true; 
    } 
} 
+0

bas类已经有了一个析构函数(Finalizer)。 – 2010-04-26 14:07:42

+1

流类是抽象的,没有终结器。 – 2010-04-26 14:23:53

+0

看来你是对的,我的错误。 – 2010-04-26 15:16:42

2

我目前正在做假设 ,现有的执行 流做我需要它。这是 呼叫Diposing(true)和 GC.SuppressFinalize。这是 假设有缺陷吗?

这正是它所做的。那么,它调用关闭,这就是:

public virtual void Close() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize(this); 
} 

当你想要一个明确的答案是什么一些标准类确实,在反射器打开它,看看它的C#拆装一般的提示。

+0

这种一般性建议是否合理?如果CLR得到修补并且代码更改...? – mafu 2012-04-05 15:21:46

+0

@mafutrct - 那么你必须再次用Reflector来看它。这个提示是要找出类*真正*做的事情,而不是找出*记录的*行为(对于哪些信息您依赖于文档)。 – 2012-04-05 18:18:47

+0

MS文档明确指出您不应该重写关闭。 “对实现者的注意事项: 在派生类中,请勿重写Close方法,而应将所有Stream清理逻辑放入Dispose方法。有关更多信息,请参阅实现Dispose方法。 – bpeikes 2014-02-12 19:37:27

0

此dispose方法:

protected virtual void Dispose(bool disposing) 

是一种常见的图案。我会认为,在框架的每Dispose方法看起来像这样(每当类可以派生):

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 
+0

虽然我认为你是对的,但“假设”意味着不可靠,对于“正确”的程序来说不值得信任。 – mafu 2012-04-05 15:23:24