Я рассмотрел различные вопросы, в которых упоминается это конкретное исключение ( в этом вопросе перечислены многие из них , которые я посетил). Кроме того, у меня тот же общий вопрос, что и в этом посте , но в другом контексте, поэтому ответ мне не поможет.
Контекст
У меня есть класс, производный от AxWindowsMediaPlayer
, который принадлежит классу с именем View
, который находится внутри Panel
, внутри Workspace
. Я недавно задал вопрос об этой ситуации, но этот вопрос был направлен на то, подходит ли мой обходной путь для этой проблемы. Фон из этого вопроса имеет отношение здесь:
.-----------------------.
|Workspace |
|.--------. .--------. |
||Panel1 | |Panel2 | |
||.-----. | |.-----. | |
|||View1| | ||View2| | |
||'-----' | |'-----' | |
|'--------' '--------' |
'-----------------------'
Когда утилизируется View
, метод с именем Synchronize()
будет вызываться для всех оставшихся View
объектов. Для View
, который содержит AxWindowsMediaPlayer
, он вызывает videoPlayer.Error.clearErrorQueue()
.
Проблема
Когда я вызываю Dispose()
на верхнем уровне (Workspace.Dispose()
), если другой View
удаляется, а затем вызывает Synchronize()
для остальных View
объектов, View
, содержащий AxWindowsMediaPlayer
класс создает исключение в строке videoPlayer.Error.clearErrorQueue()
, заявляя:
InvalidComObjectException: COM-объект, который был отделен от базового RCW, не может быть использован.
Я озадачен тем, как AxWindowsMediaPlayer
отделяется от лежащего в его основе RCW ( Runtime Callable Wrapper ). Я прочитал эту статью, в которой говорится об этом исключении и опасности вызова Marshal.ReleaseComObject()
. Я не вызываю этот метод явно. Я установил точки останова в Dispose
методах Panel
и View
и VideoPlayerControl
(производных от AxWindowsMediaPlayer
) классов, но ни один из них не получил удар до возникновения исключения.
Мой обходной путь - убедиться, что View
с медиаплеером всегда удаляется первым. Это было мотивом моего предыдущего вопроса. Но я хотел бы понять, как это происходит, чтобы понять, нужно ли это что-то исправить. Кто вызывает отделение AxWindowsMediaPlayer
от его RCW до вызова Dispose
родительского класса?
Мне кажется, что GC вызывает финализатор AxWindowsMediaPlayer
, но я не понимаю, что его вызывает. По какой-то причине при вызове Dispose
на более высоком уровне вызывается Marshal.ReleaseComObject
под полом. Может ли кто-нибудь просветить меня?