2011-08-16 107 views
5

我需要能够处理VB6中的.net事件。到目前为止,我已经通过让我可见的c#类COM来设置它。我的VB6对象可以调用它的方法,但现在我需要一些方法从.net到VB进行通信。如果我将事件添加到我的c#类中,.net包装器似乎添加了add_EventName和remove_EventName,我假设这是订阅和取消订阅该事件。但是,当我谈到VB6时,我仍然是新手,所以我不确定如何使用它。订阅VB6中的C#.net事件

add_EventName似乎需要一个EventNameEventHadler,但是我给了它什么?我试过了,但是这给我一个运行时错误。任何人都知道如何使用它?这里是我有什么

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

哦和oHost是我的COM可见.NET对象 –

回答

4

你可以试试将WithEvents添加到您的声明oHost

Private WithEvents oHost As HostService.IHost 

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

声明:我已经用了很多次来处理来自COM对象的事件。我从来没有尝试过通过互操作处理.Net对象的事件,但我认为你必须这样做。

+0

还有什么你需要做的.NET对象?当我尝试编译 –

+0

@ Nitro52时,我收到消息“Object does not source automation events”。我不知道,对不起(我从来没有真正将它用于互操作对象,你可以查看[this answer]( http://stackoverflow.com/questions/2766656/handling-events-exposed-on-a-net-class-via-com-in-vb6/2772558#2772558)? – MarkJ

1

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

oHost.add_EvalReceived AddressOf EvalReceivedEventHandler 
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); 
}