在VB6中订阅C# .net事件

5
我需要能够在VB6中处理.NET事件。到目前为止,我已经通过使我的C#类COM可见来设置它。我的VB6对象可以很好地调用它的方法,但现在我需要一种从.NET到VB的通信方式。如果我在我的C#类中添加一个事件,.NET封装器似乎会添加add_EventName和remove_EventName,我假设这是订阅和取消订阅事件的方法。但是,当涉及到VB6和COM时,我还是个新手,不太确定如何使用它。

add_EventName似乎需要一个EventNameEventHandler,但是我该给它什么?我尝试了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这一行存在错误。

哦,而oHost是我可见的COM .net对象。 - Ryan Burnham
3个回答

4
您可以尝试在声明oHost时添加WithEvents
Private WithEvents oHost As HostService.IHost

然后,IDE 应该允许您在 oHost 上创建事件处理程序。就像创建您的 Form_Load 事件处理程序一样。代码窗口左上角的下拉菜单应允许您选择 oHost
免责声明:我已经多次使用此方法来处理来自 COM 对象的事件。我从未尝试通过互操作处理 .Net 对象的事件,但我认为您必须这样做。

你需要为 .net 对象做其他的事情吗?当我尝试编译时,会收到“对象不会引发自动化事件”的消息。 - Ryan Burnham
@Nitro52,抱歉我不知道 :( 我从未使用过这个与Interop对象。你可以查看这个答案? - MarkJ

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);
}

1
在VB6中,您可以使用AddressOf运算符隐式地创建委托:
oHost.add_EvalReceived AddressOf EvalReceivedEventHandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接