在VB6中订阅C.net事件

在VB6中订阅C.net事件,.net,com,vb6,.net,Com,Vb6,我需要能够在VB6中处理.net事件。到目前为止,我已经通过使c类COM可见来设置它。我的VB6对象可以很好地调用它的方法,但现在我需要一些从.net到VB的通信方式。如果我将事件添加到我的c类中,.net包装器似乎会添加一个add_EventName和remove_EventName,我认为这是订阅和取消订阅事件。但是我还是一个VB6的新手,所以我不知道如何使用它 add_EventName似乎包含一个EventNameEventHadler,但是我应该给它什么呢?我尝试了sub,但这给了我一

我需要能够在VB6中处理.net事件。到目前为止,我已经通过使c类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行错误

在VB6中,可以使用AddressOf运算符隐式创建委托:

oHost.add_EvalReceived AddressOf EvalReceivedEventHandler
您可以尝试将WithEvents添加到oHost声明中

然后IDE应该允许您在oHost上创建事件处理程序。这就像让表单加载事件处理程序一样。代码窗口左上角的下拉列表应允许您选择oHost


免责声明:我已经多次使用它来处理来自COM对象的事件。实际上,我从未尝试过通过interop处理.Net对象中的事件,但我认为您必须这样做。

好的,我在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);
}

哦,oHost是我的COM可见.net对象。您还需要对.net对象执行其他操作吗?当我尝试创建自动化事件时,我得到的消息对象没有源自动化事件compile@Nitro52我不知道,抱歉:我从来没有在互操作对象中使用过这个。你可以退房吗?
[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);
}