4

NUnit と C# を使用して、昔ながらの COM/ActiveX コントロールの単体テストを行っています。私がテストしているコントロールは主に javascript から使用されているため、参照やコンパイル時の型情報はありません。もちろん、すべてを動的に実行します。いくつかのイベント ハンドラーを接続して、イベントが適切に発生していることを確認したいのですが、イベントが見つかりません。次のように、System.Activator.CreateInstance を使用してコントロールのインスタンスを動的に構築します (一部の詳細は省略 ;-):

Type T = Type.GetTypeFromCLSID(guid);
eztwain = System.Activator.CreateInstance(T);
EZTwainX = eztwain.GetType();

プロパティとメソッドのテストは、次のように正常に機能します。

EZTwainX.InvokeMember("Clear", BindingFlags.InvokeMethod, null, eztwain, null);
Assert.AreEqual(0, (int)EZTwainX.InvokeMember("ImageCount", BindingFlags.GetProperty, null, eztwain, null), "ImageCount");

以下はすべて失敗し、null または空の配列を返すか、必要に応じて「name not found」例外をスローします。

EZTwainX.GetEvent("AcquireDone");           // returns null
EZTwainX.GetEvents();                       // returns empty array
EZTwainX.GetEvents(BindingFlags.Public |    // returns empty array
            BindingFlags.NonPublic |
            BindingFlags.Static | BindingFlags.Instance);
PropertyInfo propertyInfo = EZTwainX.GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);      // returns null
MemberInfo[] mimfo = EZTwainX.GetMember("AcquireDone", MemberTypes.Event, BindingFlags.Public | BindingFlags.NonPublic);      // returns empty array

私は、Reflection API を使用して次のようなことができると思いました (エヘム)。

eztwain.AcquireDone += <event handler>;

しかし、その等価物が何であるかを理解できません。編集:Javascriptではこれが機能する(そしてイベントをキャッチする)ため、そのコントロールのそのイベントを信じています:

eztwain.attachEvent("AcquireDone", function() { me.onAcquireDone(); });
4

1 に答える 1

0

「方法: COM ソースによって発生したイベントを処理する」を参照してください。

また、イベント シグネチャを取得するために使用できるユーティリティ ( Ildasm.exe (IL 逆アセンブラー) ) にも注目してください。

于 2015-02-21T02:25:29.157 に答える