この特定の例外に言及しているさまざまな質問を見てきました(この質問には、私が訪れたそれらの多くがリストされています)。また、この投稿と同じ一般的な質問がありますが、文脈が異なるため、回答は役に立ちません。
コンテキスト
から派生したクラスがあり、AxWindowsMediaPlayer
というクラスによって所有されています。View
これは 内にありPanel
、 内にありWorkspace
ます。最近、この状況について質問しましたが、その質問は、この問題に対する私の回避策が大丈夫かどうかに向けられたものでした。その質問の背景は、ここで関連しています。
-----------------------。 |ワークスペース | |.--------. .--------. | | ||パネル1 | |パネル2 | | | ||.-----. | | |.-----. | | | | |||ビュー1| | | ||View2| | | | | ||'-----' || |'-----' | | | |'--------' '--------' | 「----------------------」
が破棄されると、呼び出されView
たメソッドSynchronize()
が残りのすべてのView
オブジェクトで呼び出されます。View
を含むに対して、をAxWindowsMediaPlayer
呼び出しますvideoPlayer.Error.clearErrorQueue()
。
問題
Dispose()
トップ レベル ( Workspace.Dispose()
) で呼び出したときに、別のオブジェクトView
が破棄さSynchronize()
れ、残りのView
オブジェクトで呼び出されると、View
そのクラスを含むAxWindowsMediaPlayer
クラスがその行で例外をスローし、次のvideoPlayer.Error.clearErrorQueue()
ように述べます。
InvalidComObjectException: 基になる RCW から分離された COM オブジェクトは使用できません。
が基礎となる RCW ( Runtime Callable WrapperAxWindowsMediaPlayer
)からどのように分離されているのか、私は戸惑っています。この例外と呼び出しの危険性について説明しているこの記事を読みました。このメソッドを明示的に呼び出しているわけではありません。andおよび(から派生) クラスのメソッドにブレークポイントを配置しましたが、例外が発生する前にそれらのいずれにもヒットしません。Marshal.ReleaseComObject()
Dispose
Panel
View
VideoPlayerControl
AxWindowsMediaPlayer
私の回避策はView
、メディア プレーヤーの が常に最初に破棄されるようにすることです。これが前回の質問の動機でした。しかし、これがどのように起こっているのかを理解したいので、これを修正する必要があるかどうかを確認できます. 親クラスで呼び出される前に、誰がAxWindowsMediaPlayer
RCW から分離させているのでしょうか?Dispose
私の推測では、AxWindowsMediaPlayer
ファイナライザーが GC によって呼び出されていると思いますが、何がそれを引き起こしているのかわかりません。Dispose
どういうわけか、より高いレベルで呼び出すMarshal.ReleaseComObject
と、床下で呼び出されるようになります。誰かが私を啓発できますか?