Как события из DLL C#. NET могут обрабатываться формой VB6 - PullRequest
0 голосов
/ 10 января 2020

Здесь, на работе, у нас есть старое приложение VB6, которое мне нужно научить новым трюкам. Первое, что мне нужно было сделать - это вызвать методы из. Net COM-видимой DLL, написанной на C#. У меня это работает. Теперь мне нужно, чтобы он обрабатывал входящие события уведомления о прогрессе из той же DLL. Вот код C#:

namespace NewTricksDLL
{
   [ComVisible(true)]
   [ComSourceInterfaces(typeof(IManagedEventsToCOM))]
   public class NewTricks
   {
        public delegate void NotificationEventHandler(string Message);
        public event NotificationEventHandler NotifyEvent = null;

        public string SomeMethod(string message)
        {
            return Notify(message);
        }

        private string Notify(string message)
        {
            if (NotifyEvent != null)
                NotifyEvent("Notification Event Raised.");
            return message;
        }
   }

    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    interface IManagedEventsToCOM
    {
        [DispId(1)]
        void NotifyEvent(string Message);
    }
}

А вот как я пытаюсь использовать его в форме VB6

Option Explicit

Public WithEvents newTricks as NewTricksDLL.NewTricks

Private Sub Command1_Click()
    Dim response as String
    Set newTricks = New NewTricksDLL.NewTricks
    AddHandler newTricks.NotifyEvent, AddressOf NotifyEventHandler
    response = newTricks.SomeMethod("Please send an event...")

End Sub

Private Sub NotifyEventHandler()
    'Nothing
End Sub

Моя проблема в том, что при попытке запустить VB6 Я получаю Compile error: Object does not source automation events.

Если я удаляю WithEvents Sub Command1_Click Sub работает, а response содержит "Please send an event...", поэтому я знаю, что метод вызывается через COM.

Где я ошибаюсь с реализацией мероприятия?

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вы объявили объект как WithEvents, поэтому объект должен появиться в раскрывающемся меню слева в окне кода в Visual Studio (VB6 IDE). Как только вы выберете свой объект, newTricks в вашем случае, в правом выпадающем списке отобразятся доступные события. Нажмите на нужное событие, и среда IDE сгенерирует для вас обработчик события, но вы также можете ввести его вручную:

Private Sub newTricks_NotifyEvent()
    ' handle your event here
End Sub
0 голосов
/ 13 января 2020

Проблема оказалась в отсутствии должного оформления классов и интерфейсов. Этот код C# позволяет IDE VB6 видеть доступные события и генерировать шаблоны обработчиков для событий, но попытка создания экземпляра класса в VB6 приводит к Object or class does not support the set of events. Я открыл новый вопрос для этой проблемы.

{
    [ComVisible(true)]
    [Guid("16fb3de9-3ffd-4efa-ab9b-0f4117259c75")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ITransfer
    {
        string SendAnEvent();
    }

    [ComVisible(true)]
    [Guid("16fb3de9-3ffd-4efa-ab9b-0f4117259c74")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IManagedEventsToCOM
    {
        [DispId(1)]
        void NotificationEvent();

    }

    [ComVisible(true)]
    [Guid("dcf177ab-24a7-4145-b7cf-fa06e892ef21")]
    [ComSourceInterfaces(typeof(IManagedEventsToCOM))]
    [ProgId("ADUTransferCS.NewTricks")]
    public class NewTricks : ITransfer
    {
        public delegate void NotificationEventHandler();
        public event NotificationEventHandler NotifificationEvent;

        public string SendAnEvent()
        {
            if (NotifificationEvent != null)
                NotifificationEvent();           
        }
    }
}
...