2010-04-26 53 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