TargetInvocationException при обработке события COM - PullRequest
1 голос
/ 31 августа 2010

Я разрабатываю библиотеку COM dll, и у меня есть небольшое приложение vb.net (vs 2005) для его тестирования.

Мой объект объявлен в приложении как

Private m_VarName As MyLib.CMyComClass

Пока все хорошо.

Но теперь мне нужно событие, чтобы сообщить приложению о некоторых вещах, поэтому я реализовал такое событиев COM dll и изменил объявление на

Private WithEvents m_VarName As MyLib.CMyComClass

Пока все хорошо, снова.Но если я добавлю Sub для обработки моего события:

Private Sub m_VarName_OnCaptureStop () Обрабатывает m_VarName.MyEvent

...

End Sub

В первый раз, когда я создаю объект, ничего плохого не происходит, но если я его заново создаю

Если (не m_VarName - ничего), то ReleaseComObject (m_VarName)

m_VarName= New MyLib.CMyComClass

, тогда я получаю загадочное исключение TargetInvocationException, которое, по-видимому, связано с отражением (которое, AFAIK, я не использую).

Если я уберу «Обрабатывает m_VarName».MyEvent "часть, кажется, все работает.В случае, если это имеет значение, я не стреляю никаким событием, пока.Есть идеи о том, почему это происходит?

1 Ответ

2 голосов
/ 31 августа 2010

Причина, по которой это связано с реализацией WithEvents и Handles в VB.Net.Когда вы объявляете поле с модификатором WithEvents в VB.net, оно будет сгенерировано как свойство.

Всякий раз, когда это свойство обновляется с помощью операции присваивания, установщик свойства отписывается от старого обработчика событий, а затем подписывается на обработчик событий для нового значения.По сути это выглядит так:

Property m_VarName as SomeType 
  Set   
    if _m_VarName isNot Nothing Then
      RemoveHandler _m_VarName.SomeEVent,m_VarName_OnCaptureStop
    End If
    _m_VarName = Value
    AddHandler _m_VarName.SomeEvent,m_VarName_OnCaptureStop
  End Set 
End Property

Если вы считаете, что в контексте вашего кода по сути происходит следующееCOM-объект, который уже выпущен.Следовательно это бросает Exception.

Исправить несложно, не звоните ReleaseComObject.Количество ситуаций, когда вам действительно нужно вызвать этот метод, очень мало и почти наверняка не применимо к этой ситуации.Вместо этого просто позвольте GC собрать это как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...