Задача следущая.
Необходимо в .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 -объекта