Используя NUnit + Reflection, я не могу найти никаких событий в моем элементе управления ActiveX - PullRequest
4 голосов
/ 25 января 2012

Я тестирую модульный элемент управления 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(); });

1 Ответ

0 голосов
/ 21 февраля 2015

Посмотрите на Как: обрабатывать события, вызванные источником COM *

Также обратите внимание на утилиту, которую вы можете использовать ( Ildasm.exe (IL дизассемблер) * ) чтобы получить подписи к событию.

...