У меня есть некоторый код VB6, который создает экземпляр класса, который обрабатывает события, которые возникают из компонента VB.NET. VB6 довольно прост:
private m_eventHandler as new Collection
...
public sub InitSomething()
dim handler as EventHandler
set handler = new EventHandler
m_eventHandler.Add handler
...
m_engine.Start
end sub
Обратите внимание, что объект обработчика событий должен находиться за пределами области действия метода init (именно поэтому он хранится в коллекции). Также обратите внимание, что m_engine.Start
указывает точку в программе, где компонент VB.NET начинает вызывать события.
Фактический обработчик события (по запросу):
Private WithEvents m_SomeClass As SomeClass
Private m_object as Object
...
Private Sub m_SomeClass_SomeEvent(obj As Variant)
Set obj = m_object
End Sub
Обратите внимание, что m_object
инициализируется при создании экземпляра EventHandler
.
Код VB.NET, который вызывает событие, еще проще:
Public ReadOnly Property SomeProp() As Object
Get
Dim obj As Object
obj = Nothing
RaiseEvent SomeEvent(obj)
SomeProp = obj
End Get
End Property
Моя проблема в том, что когда я отлаживаю программу VB6, при первом вызове InitSomething
событие не будет обработано (обработчик события VB6 никогда не вводится) , Последующие звонки на InitSomething
действительно работают.
Все работает так, как я ожидал, когда запускаю программу вне отладчика. На данный момент я даже не уверен, стоит ли беспокоиться об этом.
Это может иметь или не иметь значение, но VB.NET был преобразован из VB6 с использованием инструмента преобразования кода Visual Studio (и впоследствии очищен вручную).