Использование COM-DLL от нескольких клиентов

Я пытаюсь создать COM-DLL, которая будет использоваться несколькими клиентами.

для этого у меня есть 2 клиента.

  1. Консольное приложение (подписка)
  2. Приложение WPF (издатель)

приложение WPF вызовет метод Publish COM-библиотеки DLL, который, в свою очередь, вызовет событие, а консольное приложение, подписанное на это событие, ответит.
событие статично.

COM-DLL

[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IComListen
{
    [DispId(2)]
    string Publish();

    [DispId(1)]
    string Version();
}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IListenerEvents
{
    void Ack();
}

public delegate void AckDelegate();

[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IListenerEvents))]
public class Listen : IComListen
{
    public static event AckDelegate Ack;

    public string Publish()
    {
        Ack();

        return "This message should be published";
    }

    public string Version()
    {
        return "0.050";
    }
}

приложение WPF:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var listener = new Listen();
    listener.Publish();
}

консольное приложение:

private static void Main(string[] args)
{
    Listen.Ack += Listen_Ack;
    while (true)
    {
    }
}

private static void Listen_Ack()
{
    throw new NotImplementedException();
}

текущее состояние заключается в том, что Ack() внутри метода Publish() в COM DLL имеет значение null...


person kaycee    schedule 16.08.2019    source источник


Ответы (1)


Вы пытаетесь обработать событие, которое было вызвано другим приложением. Я думаю, вы должны использовать один из этих протоколов:

AMQP
STOMP
MQTT
AMQP 1.0
HTTP

См. раздел Обработка событий из другого приложения.

и https://www.codeproject.com/Articles/5830/Using-MSMQ-from-C

и моя рекомендация: https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

RabbitMQ может использоваться и используется в корпоративных приложениях для обработки событий между микросервисами. Альтернативой этому будет Apache Kafka.

person Krur Schak    schedule 16.08.2019
comment
клиенты локальные, я не хочу иметь сетевые протоколы - person kaycee; 16.08.2019
comment
Как вы думаете отправить сообщение из одного приложения в другое? Над текстовыми файлами или потоками памяти? Вы должны использовать то, чем они делятся и могут читать/писать. Я всегда рекомендую использовать сетевой протокол в этой ситуации. - person Krur Schak; 16.08.2019