我正在使用 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 或空数组或适当地抛出“未找到名称”异常:
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
我只是假设(咳咳)我可以使用反射 API 做一些事情,相当于:
eztwain.AcquireDone += <event handler>;
但我不知道那个等价的东西是什么。编辑:我相信该控件上的那个事件,因为在 Javascript 中它可以工作(并捕获事件):
eztwain.attachEvent("AcquireDone", function() { me.onAcquireDone(); });