Я тестирую модульный элемент управления COM / ActiveX старой школы, используя NUnit и C #.Я делаю все динамически, без ссылок или информации о типе времени компиляции, потому что проверяемый мной элемент управления используется в основном из 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");
Следующие все завершаются неудачно, возвращая нулевой или пустой массив или выбрасывая исключение «имя не найдено» в зависимости от ситуации:
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
Я просто предположил (хм), что я мог бы что-то сделать, используя ReflectionAPI, эквивалентный:
eztwain.AcquireDone += <event handler>;
, но я не могу понять, что это за эквивалентная вещь.РЕДАКТИРОВАТЬ: Я верю в это событие на этом элементе управления, потому что в Javascript это работает (и ловит события):
eztwain.attachEvent("AcquireDone", function() { me.onAcquireDone(); });