Есть ли способ вызвать делегат C # из COM Interop? - PullRequest
2 голосов
/ 03 ноября 2010

Я портирую библиотеку C # на COM и с трудом пытаюсь перевести некоторых делегатов.Библиотека C # работает с некоторыми обратными вызовами (с использованием делегатов).Обычно я хотел бы перевести это на события, которые будут использоваться COM-клиентами, но библиотека создает только открытые интерфейсы, поэтому я не могу использовать ComSourceInterfaces.

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

[ComVisible(false)]
public delegate void ReceivedCOMMessageHandler (MessageCOM^ message);

[ComSourceInterfaces("ReceivedMessageEventInterface")]
public interface class IChannelCOM
{
    bool PushMessage (MessageCOM^ message);
    bool RegisterEventHandler (ReceivedCOMMessageHandler^ handler, FilterCOM^ filter);
    bool UnRegisterEventHandler (ReceivedCOMMessageHandler^ handler);
    property String^ Name;
    event ReceivedCOMMessageHandler^ ReceivedMessage;
};

[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[Guid("D4D2A638-303E-41d4-8925-07A2A60B17F3")]
public interface class ReceivedMessageEventInterface
{
    [DispId(1)] void ReceivedMessage(MessageCOM^ message);
};

Я не могу этого сделать, потому что событие объявляется в интерфейсе, а ComSourceInterface может быть объявлен только в классе.

Есть ли какие-либо советы о том, что можно сделать, чтобы решить эту проблему?

РЕДАКТИРОВАТЬ: Другой способ сказать то же самое.Есть ли способ объявить события в интерфейсах, а не в классах в COM?

Заранее спасибо.

1 Ответ

0 голосов
/ 04 ноября 2010

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

...