2012-10-18 112 views
2

我在C#中編寫了一個類庫,我正嘗試在VBA(VB6)中使用它。如何在VB6中訂閱實例對象的事件?

所有創建我的類型庫,使用regasm在計算機上註冊類型庫,在VB6中創建.Net對象的實例,訪問屬性和調用方法都很好。

但我想訂閱一些事件,我的類型庫中的實例級對象引發。

下面是我的一個事件處理程序的例子(它們都是通用的事件處理程序)作爲我的C#類中聲明:

public event EventHandler<Events.NewCall> NewCall; 

Events.NewCall是從EventArgs的,看上去一類inhereting像這樣:

using System; 

namespace MySolution.Events 
{ 
    /// <summary> 
    /// A call has been created ready for use 
    /// </summary> 
    public class NewCall : EventArgs 
    { 
     /// <summary> 
     /// An automatic property 
     /// </summary> 
     public string AutoProperty { get; private set; } 

     public NewCall(string rawData) 
     { 
      //Some logic here 
      autoProperty = rawData; 
     } 
    } 
} 

我提出這個事件我的類中,像這樣:

var checkNewCall = NewCall; 
if (checkNewCall != null) { checkNewCall(this, new Events.NewCall("my raw data")); } 

在C#中,我可以實例我的電話對象和訂閱事件,像這樣:

MySolution.Phone _phone = new MySolution.Phone(); 
_phone.NewCall += AnEventHandler; 

事件處理程序是這樣的:

void AnEventHandler(object sender, Splicecom.Events.NewCall e) 
{ 
    //Do stuff with e 
} 

在VB6中,我可以實例我的電話的物體,像所以:

Dim thisPhone As New MySolution.Phone 

打字此電話。不給我任何intellisense,但我習慣了這一點,我沒有爲我的課內其他方法獲得智能感知,但我仍然可以在沒有編譯/運行時錯誤的情況下調用它們。

如下圖所示,我可以看到我想與之合作的事件:

Event

但是,這是因爲這是MySolution而不是在電話的實例庫的智能感知這個類是這個電話

在VB6中,我怎麼訂閱對MySolution.Phone對象的thisPhone實例新呼叫事件。

我已經試過這樣:

Option Compare Database 

Dim WithEvents thisPhone As MySolution.Phone 

Private Sub Command0_Click() 

    thisPhone = New MySolution.Phone 
    thisPhone.NewCall = MyFunction() 

End Sub 

Private Sub MyFunction() 

    'Do stuff 

End Sub 

當我點擊Command0,我得到這個錯誤:

Error

回答

1

一個小竅門:如果有可能避免的互操作。在VB中完全編寫VB6代碼通常更容易。

您的C#必須具有comvisible屬性(設置爲true)和GUID。 建立一個接口IPhone,VB6需要這個。

您VB6的代碼應該是這樣的:

Dim thisPhone As MySolution.IPhone 
Set thisPhone = new MySolution.Phone 

然後你就可以訪問你的事件處理程序,如果接口公開它。

+2

好的我會試着用一個名爲IPhone的接口,讓我們只希望我不會被起訴! – JMK

+0

@JMK你仍然需要在VB6中正確地「連線」事件 - 請參閱我的回答http://stackoverflow.com/a/12952577/15639 – MarkJ

2

VB6事件處理程序在編譯時綁定到事件,完全基於例程的名稱。試試這個吧:

Option Compare Database 

Dim WithEvents thisPhone As MySolution.Phone 

Private Sub Command0_Click() 

    thisPhone = New MySolution.Phone 

End Sub 

' Name of this routine is <withEventsVariableName>_<eventName> ' 
Private Sub thisPhone_NewCall() 

    ' Do stuff ' 

End Sub