gpt4 book ai didi

vb.net - 在 VB6 代码中处理 VB.NET 事件

转载 作者:行者123 更新时间:2023-12-05 00:43:38 27 4
gpt4 key购买 nike

我有一些 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 方法的范围(这就是它存储在 Collection 中的原因)。另请注意 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_objectEventHandler 的实例时初始化被 build 。

引发事件的 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 是使用 Visual Studio 代码转换工具从 VB6 转换而来的(随后手动清理)。

最佳答案

我发现,如果您在 VB6(或任何其他 COM 环境)中编写用于消费的 .Net 组件,那么接口(interface)的使用绝对是至关重要的。

VStudio 开箱即用的 COM 模板还有很多不足之处,尤其是当您试图让事件工作时。

这是我用过的。

Imports System.Runtime.InteropServices
Imports System.ComponentModel

<InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(ClientAction.InterfaceId)> Public Interface IClientAction
<DispId(1), Description("Make the system raise the event")> sub SendMessage(ByVal theMessage As String)
End Interface


<InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid(ClientAction.EventsId)> Public Interface IClientActionEvents
<DispId(1)> Sub TestEvent(ByVal sender As Object, ByVal e As PacketArrivedEventArgs)
End Interface



<ComSourceInterfaces(GetType(IClientActionEvents)), Guid(ClientAction.ClassId), ClassInterface(ClassInterfaceType.None)> _
Public Class ClientAction
Implements IClientAction

Public Delegate Sub TestEventDelegate(ByVal sender As Object, ByVal e As PacketArrivedEventArgs)

Public Event TestEvent As TestEventDelegate

public sub New()
//Init etc
end sub

public sub SendMessage(theMessage as string) implements IClientAction.SendMessage
onSendMessage(theMessage)
end sub

Protected Sub onSendMessage(message as string)
If mRaiseEvents Then
RaiseEvent TestEvent(Me, New PacketArrivedEventArgs(theMessage))
End If
End Sub

end Class

我已经能够让程序集/组件的 COM 和 .Net 消费者与事件一起正常工作,并能够在组件内外进行调试。

希望这可以帮助。

关于vb.net - 在 VB6 代码中处理 VB.NET 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/851501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com