我已经看过提到这个特定异常的各种问题(我访问过的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
在底线下被呼叫。有人能够启发我吗?