订阅VB6中的C#.net事件

时间:2011-08-16 08:30:52

标签: .net com vb6

我需要能够在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行错了

3 个答案:

答案 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