2

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をクリックすると、次のエラーが発生します。

エラー

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

ヒント: 可能であれば相互運用を避けてください。多くの場合、VB6 コードを完全に C# で記述する方が簡単です。

C# には、comvisible 属性 (true に設定) と GUID が必要です。インターフェイスを構築しますIPhone。VB6 にはこれが必要です。

VB6 コードは次のようになります。

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

インターフェイスがイベント ハンドラーを公開している場合は、イベント ハンドラーにアクセスできます。

于 2012-10-18T10:04:32.717 に答える