COM-события имеют другой модальный режим, у вас нет одного обработчика на событие, у вас есть объект приемника событий, который перехватывает каждое событие, которое COM-сервер планирует вызвать. Если вы просто подключите события ActiveX к делегатам, будут созданы RCW-файлы приемника событий , которые могут позже вызвать сбой , поэтому я предполагаю, что вы создаете свой собственный класс приемников событий.
Поскольку у вас есть свой собственный класс приемников событий, вы должны следовать подписи событий издателя событий. Подписи не имеют аргумента отправителя, поскольку сервер COM предполагает, что у вас есть ссылка на отправителя, поэтому нет необходимости отправлять его снова каждый раз, когда возникает событие.
Вы можете кэшировать ссылку на сервер в свой объект приемника событий для дальнейшего использования. Ваш объект приемника событий может объявить свою собственную версию управляемых событий с параметром отправителя и передать кэшированный COM-сервер в качестве аргумента отправителя, когда он вызывает события.
Что-то вроде
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[TypeLibType(TypeLibTypeFlags.FHidden)]
[Guid("eventGuid")]
[CLSCompliant(false)]
public interface IEvent
{
[DispId(123)]
void control_connected(int status, string description);
}
public class EventSink:IEvent
{
object control;
public EventSink (object control)
{
this.control=control;
}
public event EventHandler<ControlConnectedEventArgs> ControlConnected;
void control_connected(int status, string description);
{
EventHandler<ControlConnectedEventArgs> temp=this.ControlConnected;
if(temp!=null)
temp(this.control, new ControlConnectedEventArgs(status,description));
}
}
Если у вас есть массив COM-серверов, просто объявите массив приемников событий, присоедините каждый приемник к каждому COM-серверу с помощью ConnectionPointCookie и подключите обработчики событий из приемника событий вместо COM-серверов. .