我在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,但我仍然可以在没有编译的情况下调用它们/运行时错误。
如下图所示,我可以看到我想要使用的事件:
但这是 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时,我收到此错误:
答案 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
然后,如果接口公开它,您就可以访问事件处理程序。