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

Posted

技术标签:

【中文标题】使用 NUnit+Reflection,在我的 ActiveX 控件上找不到任何事件【英文标题】:Using NUnit+Reflection, can't find any events on my ActiveX control 【发布时间】:2012-01-25 19:33:51 【问题描述】:

我正在使用 NUnit 和 C# 对老式 COM/ActiveX 控件进行单元测试。 我动态地做所有事情,没有引用或编译时类型信息,因为我正在测试的控件主要来自 javascript - 当然,它动态地做所有事情。我想连接一些事件处理程序并确保事件被适当地触发,但我无法find这些事件!我使用 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(); );

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 NUnit+Reflection,在我的 ActiveX 控件上找不到任何事件的主要内容,如果未能解决你的问题,请参考以下文章

使用参数并行运行 nunit 测试 (nunit 3.8.x)

Windows 7/64 上的 NUnit“丢失”GPSVC.DLL

对 NUnit 测试使用 RunImpersonated 进行 HttpClient 调用失败,但在控制台中有效

使用测试影响分析的 TFS 2013 和 VS 2013 能否与 NUnit 一起使用

如何从 Visual Studio 以调试模式运行 NUnit?

system.reflection.targetinvocationexception SQLite