Тема: Как в VB.NET подписаться на событие при позднем связывании?

Коллеги, доброго времени суток!

Имеется проект на VB/NET, который работает с различными версиями AutoCAD. В проекте широко используются API COM и конечно позднее связывание. Встала задача по доработке его функционала, связанного с обработкой событий.

Покопался в Интернет, но пока ничего внятного не нашел как  на VB.NET при позднем связывании подписаться на события объектов Application (ApplicationEvents) и Document (DocumentEvents).

Помогите, пожалуйста, с решением данного вопроса. Буду благодарен за ссылку на материал или пример кода, как подписаться на событие при позднем связывании.

Заранее благодарю за помощь.

С уважением,
Андрей

(изменено: Hwd, 30 октября 2013г. 12:48:39)

Re: Как в VB.NET подписаться на событие при позднем связывании?

Глянул в COM API (через Interop) - вижу возможность регистрации событий. Подозреваю, что код регистрации событий идентичен и при раннем и при позднем связывании... Так же подозреваю, что ты просто не те интерфейсы смотришь:

// Смотрю, чего там доступно через COM по части событий...
using System;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Int = Autodesk.AutoCAD.Interop;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rtm = Autodesk.AutoCAD.Runtime;

namespace ClassLibrary2 {

    public class Class1 {
        [Rtm.CommandMethod("test", Rtm.CommandFlags.Modal)]
        public void Test() {
            // В этом интерфейсе приложения события отсутствуют: 
            Int.IAcadApplication iapp = cad.AcadApplication as Int.IAcadApplication;

            // А в этом реализованы:
            Int._DAcadApplicationEvents_Event iapp_events = cad.AcadApplication as Int._DAcadApplicationEvents_Event;

            if (iapp_events != null) {
                // тут основной код, например регистрация событий:
                iapp_events.BeginCommand += app_BeginCommand;
            }

            // Аналогичная ситуация и с интерфейсом документа (IAcadDocument):

            // В этом интерфейсе событий документа нет:
            Int.IAcadDocument idoc = iapp.ActiveDocument as Int.IAcadDocument;

            // А в этом есть:
            Int._DAcadDocumentEvents_Event idoc_events = iapp.ActiveDocument as Int._DAcadDocumentEvents_Event;
            if (idoc_events != null) {
                idoc_events.BeginLisp += doc_BeginLisp;
            }
        }

        void app_BeginCommand(string CommandName) {
            //throw new NotImplementedException();
        }

        void doc_BeginLisp(string FirstLine) {
            //throw new NotImplementedException();
        }
    }
}