2011-08-16 106 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); 
}