VBA(VB6)で使用しようとしているクラスライブラリをC#で作成しました。
タイプライブラリの作成、regasmを使用したコンピュータへのタイプライブラリの登録、VB6での.Netオブジェクトのインスタンスの作成、プロパティへのアクセス、メソッドの呼び出しはすべて問題ありません。
しかし、タイプライブラリのインスタンスレベルオブジェクトが発生するいくつかのイベントをサブスクライブしようとしています。
以下は、C#クラスで宣言されたイベントハンドラーの1つの例です(これらはすべて汎用イベントハンドラーです)。
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と入力します。インテリセンスは得られませんが、これには慣れています。クラス内の他のメソッドのインテリセンスは得られませんが、コンパイル/実行時エラーなしで呼び出すことができます。
以下に示すように、私は一緒に働きたいイベントを見ることができます:
ただし、これは、thisPhoneであるPhoneクラスのインスタンスとは対照的に、MySolutionであるライブラリのインテリセンスです。
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をクリックすると、次のエラーが発生します。