使用NUnit + Reflection,在我的ActiveX控件上找不到任何事件

时间:2012-01-25 19:33:52

标签: c# event-handling activex system.reflection

我正在使用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(); });

1 个答案:

答案 0 :(得分:0)

查看How to: Handle Events Raised by a COM Source

另外,请注意您可以使用(Ildasm.exe (IL Disassembler))获取事件签名的实用程序。