我已經看過提到這個特定異常的各種問題(我訪問過的this question lists many of them)。此外,我有相同的general question as this post,但在不同的上下文中,因此the answer對我沒有幫助。什麼導致InvalidComObjectException:「不能使用與其基礎RCW分離的COM對象。」?
上下文
我已經從由一個名爲View
類,這是一個Panel
內的國有AxWindowsMediaPlayer
派生的類,一個Workspace
內。我最近問這個情況a question,但是這個問題是針對我的這個問題的解決方法是否可以。從這個問題的背景是與此有關:
.-----------------------. |Workspace | |.--------. .--------. | ||Panel1 | |Panel2 | | ||.-----. | |.-----. | | |||View1| | ||View2| | | ||'-----' | |'-----' | | |'--------' '--------' | '-----------------------'
當View
得到處理,一種稱爲Synchronize()
將調用上的所有剩餘View
對象。對於包含AxWindowsMediaPlayer
的View
,它調用videoPlayer.Error.clearErrorQueue()
。
問題
當我調用Dispose()
在頂層(Workspace.Dispose()
),如果另一View
得到處理,然後使Synchronize()
要對其餘View
對象調用時,View
含有AxWindowsMediaPlayer
類引發videoPlayer.Error.clearErrorQueue()
行異常,說明:
InvalidComObjectException:已與其基礎RCW分離的COM對象不能b使用。
我對AxWindowsMediaPlayer
與底層RCW(Runtime Callable Wrapper)分離的方式感到困惑。我讀過this article that talks about this exception以及致電Marshal.ReleaseComObject()
的危險。我沒有明確地調用這個方法。我已經在Dispose
方法Panel
和View
和VideoPlayerControl
(來自AxWindowsMediaPlayer
)類中放置了斷點,但是在異常發生之前,這些方法都不會被觸發。
我的解決方法是確保帶有媒體播放器的View
總是首先被丟棄。這是我之前的問題背後的動機。但我想了解這是如何發生的,所以我可以看到這是我需要解決的問題。 在Dispose
在父類上被調用之前,誰導致AxWindowsMediaPlayer
與RCW分離?
我的猜測是AxWindowsMediaPlayer
終結器被GC調用,但我不明白是什麼觸發它。由於某種原因,在較高級別呼叫Dispose
正在導致Marshal.ReleaseComObject
在底線下被呼叫。有人能夠啓發我嗎?