COM-события от C # до VB6 («объект или класс не поддерживает набор событий») - PullRequest
4 голосов
/ 19 мая 2009

На самом деле тяну меня за волосы с этим ...

У меня есть проект C # с интерфейсом, определенным как:

/* Externally Accessible API */
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISerial
{
    [DispId(1)]
    bool Startup();

    [DispId(2)]
    bool Shutdown();

    [DispId(3)]
    bool UserInput_FloorButton(int floor_number);

    [DispId(4)]
    bool Initialize();
}

/* Externally Accesssible Event API */
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISerialEvent
{
    [DispId(5)]
    void DataEvent();
}

[ComSourceInterfaces(typeof(ISerialEvent), typeof(ISerial))]
[ClassInterface(ClassInterfaceType.None)]
public class SerialIface : ISerial
{
    public delegate void DataEvent();
    public event DataEvent dEvent;

    public bool Initialize()
    {
        //testing the event callback
        if (dEvent != null)
        {
            dEvent();
        }
    }
    ...
}

И код VB6 выглядит так:

Private WithEvents objSerial As SerialIface

Private Sub objSerial_DataEvent()
    'do something happy'
End Sub

Public Sub Class_Initialize()
    Set objSerial = New SerialIface  '<---this is the line that fails'
    Call objSerial.Initialize  '<--Initialize would trigger DataEvent, if it got this far'
End Sub

Что ж, нормальные функции типа API работают (если я объявляю objSerial без ключевого слова WithEvents), но я не могу заставить "DataEvent" работать. Сбой с сообщением «объект или класс не поддерживает набор событий».

Первоначально я объединил два интерфейса вместе, но затем C # пожаловался, что DataEvent не определен в классе. В настоящий момент я могу прекрасно просматривать все API и одно событие в объектном браузере VB6 - все выглядит так, будто оно есть ... Я просто не могу заставить его работать на самом деле!

Я уверен, что упускаю что-то очевидное или делаю что-то глупое - но я новичок во всем бизнесе взаимодействия, так что это просто ускользает от меня.

Помощь!

Ответы [ 2 ]

7 голосов
/ 19 мая 2009

Посмотрите на эту статью здесь .

В частности, похоже, что вы пропустили объявление, которое выглядит примерно так:

[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(DBCOM_Events))]
    public class DBCOM_Class : DBCOM_Interface
    {

У вас есть эта часть

// // Events interface Database_COMObjectEvents 
[Guid("47C976E0-C208-4740-AC42-41212D3C34F0"), 
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface DBCOM_Events 
{
}

Но без секунды vtable и typelib COM-объекта не имеют карт событий, необходимых для работы с VB6 (или другими COM-потребителями).

Вы можете использовать поисковый запрос Google "com event" c # и получить кучу других хороших результатов.

3 голосов
/ 21 мая 2009

Однако ваше сообщение привело меня к решению - спасибо!

Не удивительно, что это опечатка.

/* Externally Accesssible Event API */
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISerialEvent
{
    [DispId(5)]
    void DataEvent();
}

должно быть

/* Externally Accesssible Event API */
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISerialEvent
{
    [DispId(5)]
    void dEvent();
}

Я определял интерфейс, используя делегат вместо события

Еще раз спасибо за помощь!

...