2

我用 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

键入此电话。没有给我任何智能感知,但我已经习惯了,我的类中的其他方法没有智能感知,但我仍然可以在没有编译/运行时错误的情况下调用它们。

如下所示,我可以看到我想要处理的事件:

事件

但这是MySolution库的智能感知,而不是Phone类的实例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 时,我收到此错误:

错误

4

2 回答 2

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
于 2012-10-18T10:29:22.043 回答
1

提示:如果可能,请避免互操作。完全用 C# 编写 VB6 代码通常更容易。

您的 C# 必须有一个可共享的属性(设置为 true)和一个 GUID。建立一个界面IPhone,VB6需要这个。

您的 VB6 代码应如下所示:

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

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

于 2012-10-18T10:04:32.717 回答