1

我正在尝试构建一个将由多个客户端使用的 COM DLL。

为此,我有 2 个客户。

  1. 控制台应用程序(订阅者)
  2. WPF 应用程序(发布者)

WPF 应用程序将调用 COM DLL 的 Publish 方法,该方法又会引发一个事件,订阅此事件的控制台应用程序将响应。
事件是静态的。

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();
}

当前状态是 COM DLL 中 Publish() 方法中的 Ack() 为空...

4

1 回答 1

0

您正在尝试处理从另一个应用程序触发的事件。我认为您必须使用以下协议之一:

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。

于 2019-08-16T16:57:29.973 回答