run-time подписка на события набора COM - объектов
От: PeterPan Россия  
Дата: 05.08.10 04:28
Оценка:
Задача следущая.
Необходимо в .Net создать обертку для набора COM-объектов, точнее некоторых их свойств, методов, событий.
Делаю так:
Я инстанцирую объект по ProgID(конфигурируемый)
Type tp = Type.GetTypeFromProgID(progID);
object COMObject = Activator.CreateInstance(tp);


Далее я могу обернуть методы
COMObject.GetType().InvokeMember(
    methodName, BindingFlags.InvokeMethod, null, COMObject, params)


также обернуть свойства

COMObject.GetType().InvokeMember(
         propertyName, BindingFlags.SetProperty, null, COMObject, params);

COMObject.GetType().InvokeMember(
         propertyName, BindingFlags.GetProperty, null, COMObject, params);


А вот с событиями кажется проблема.
Если бы COM-Объект был один и тот-же, а не набор, то, как описывается здесь, через oleview я бы подсмотрел GUID интерфеса событий,
объявил бы в design-time свой интерфес приемника (IMySinkEvents),реализовал IMySinkEvents в классе-приемнике событий и связал бы COM-объект с моим приемником событий как то так:

IConnectionPointContainer icpc = (IConnectionPointContainer)COMObject;
IConnectionPoint connectionPoint;
int cookie = 0;
Guid g = typeof(IMySinkEvents).GUID;
icpc.FindConnectionPoint(ref g, out connectionPoint);
connectionPoint.Advise(MySinkEventsInstance, out cookie);


В моем случае GUID у COM-объектов разные и видимо приходится искать способ как в run-time "исследовать" COM-объект, чтобы найти по списку названий событий GUID интерфейса, в котором определены эти события.
Также в run-time объявить интерфейс приемника событий, реализовать его в своем классе-приемникеи как и в первом случае связать его с COM-объектом.

Как динамически объявлять типы и создавать объекты я представляю, а вот как "исследовать" COM-объект в run-time идей пока нет
и google молчит (м.б. не так спросил).

Интересуюсь, я на правильном пути? Если, да то как добраться до GUID и описания интрерфейса событий у COM -объекта
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.