如何在VB6中订阅实例对象的事件?

时间:2012-10-18 09:51:14

标签: c# .net events vb6 com-interop

我在C#中编写了一个类库,我试图在VBA(VB6)中使用。

一切都很好创建我的类型库,使用regasm在计算机上注册类型库,在VB6中创建.Net对象的实例,访问属性和调用方法。

但我正在尝试订阅我的类型库中的实例级对象引发的一些事件。

以下是我的C#类中声明的一个事件处理程序(它们都是通用事件处理程序)的示例:

public event EventHandler<Events.NewCall> NewCall;

Events.NewCall 是一个来自EventArgs的类,如下所示:

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中,我可以实例化我的Phone对象:

Dim thisPhone As New MySolution.Phone

键入 thisPhone。并没有给我任何intellisense但是我习惯了这个,我没有得到我的类中其他方法的intellisense,但我仍然可以在没有编译的情况下调用它们/运行时错误。

如下图所示,我可以看到我想要使用的事件:

Event

但这是 MySolution 的库的智能感知,而不是此电话 thisPhone 的实例。

在VB6中,如何在 MySolution.Phone 对象的 thisPhone 实例上订阅 NewCall 事件。

我试过这个:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

小贴士:如果可以避免互操作。通常,用C#完全编写VB6代码会更容易。

您的C#必须具有comvisible属性(设置为true)和GUID。 构建一个接口IPhone,VB6需要这个。

你的VB6代码应如下所示:

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

然后,如果接口公开它,您就可以访问事件处理程序。