我需要能够在VB6中处理.net事件。到目前为止,我通过让我看到c#class COM来设置它。我的VB6对象可以很好地调用方法,但现在我需要一些方法来从.net到VB进行通信。如果我向我的c#类添加一个事件,.net包装器似乎添加了一个add_EventName和remove_EventName,我认为这是订阅和取消订阅该事件。但是对于VB6来说我仍然是新手,所以我不确定如何使用它。
add_EventName似乎采用了EventNameEventHadler,但是我给它了什么?我尝试了sub但这给了我一个运行时错误。谁知道如何使用它?这是我所拥有的一个例子
Private oHost As HostService.IHost
Private Sub Form_Load()
Set oHost = New HostService.Host
oHost.Start
oHost.add_EvalReceived EvalReceivedEventHandler
End Sub
Private Sub EvalReceivedEventHandler(ByVal sender As Variant, ByVal e As EvalReceivedEventArgs)
MsgBox "Eval Received in VB: " & e.Eval.TimeSent & ":" & e.Eval.FirstName & " " & e.Eval.LastName & " - " & e.Eval.Comments
End Sub
所以oHost.add_EvalReceived行错了
答案 0 :(得分:4)
您可以尝试将WithEvents
添加到oHost
Private WithEvents oHost As HostService.IHost
然后IDE应该允许您在oHost
上创建事件处理程序。这就像制作Form_Load
事件处理程序一样。代码窗口左上角的下拉列表可让您选择oHost
。
免责声明:我已经多次使用它来处理来自COM对象的事件。我从来没有尝试通过互操作来处理来自.Net对象的事件,但我认为你必须这样做。
答案 1 :(得分:4)
好的,我得到了MarkJ的帮助。我必须有一个代表COM事件的界面。所以他们最终看起来像这样
[ComSourceInterfaces(typeof(IHostEvents))]
[ClassInterface(ClassInterfaceType.None)]
[Guid("037CF765-4C30-4CF7-969C-1775E79844CE")]
public class Host : IHost
{
//IHost implementation
}
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("8C0C3F0E-5793-4E11-AB20-3A556C0B6790")]
public interface IHostEvents
{
[DispId(1)]
void EvalReceived(object sender, EvalReceivedEventArgs e);
}
答案 2 :(得分:1)
在VB6中,您可以使用AddressOf
运算符隐式创建委托:
oHost.add_EvalReceived AddressOf EvalReceivedEventHandler