是否可以从正在运行的可执行文件中访问静态属性?

时间:2011-12-12 00:27:17

标签: c# nservicebus

我需要在控制台应用程序运行时从控制台应用程序(NServiceBus selfhost)访问静态属性。这可能吗?

执行NServiceBus控制台时,我的starup类中设置了静态属性:

    public static IBus Bus { get; private set; }

    public static void Init()
    {
        Bus = NServiceBus.Configure.With()
            .Log4Net()
            .DefaultBuilder()
            .XmlSerializer()
            .MsmqTransport()
                .IsTransactional(false)
                .PurgeOnStartup(false)
            .UnicastBus()
                .LoadMessageHandlers()
                .ImpersonateSender(false)
            .CreateBus()
            .Start();
    }

NServiceBus控制台应用程序中的另一个类调用静态总线属性。我只引用关联的控制台应用程序DLL来获取此消息对象。我创建此消息对象以调用它的公共方法“SendRouteMessageReceived”。但是,我需要将总线设置为在执行NServiceBus控制台期间实例化的总线(如上面的代码所示)。

public class OrderMessaging
{
    public IBus Bus { get; set; }

    public void SendRouteMessageReceived(LabRoutingUpdateMessage routingUpdateMessage)
    {
        Bus.Send(new RouteMessageReceived(routingUpdateMessage));
    }

}

来自我的WPF应用程序的C#代码实例化消息对象并将消息发送到NServiceBus:

MyBus.OrderManagement.OrderMessaging routeMessageReceived = new MyBus.OrderManagement.OrderMessaging();

我使用WPF应用程序中的以下代码启动NServiceBus(selfhost)控制台应用程序:

System.Diagnostics.Process.Start("MyApplication.exe");

有人可以提供示例代码,以便我如何在WPF应用程序中执行控制台应用程序并访问在控制台应用程序中实例化的静态属性?

更新:我必须添加Bus对象启动一个单独的主机控制台exe,同时我也通过此代码单独启动“Message”NServiceBus控制台:

System.Diagnostics.Process.Start("MyApplication.exe");(这是实例化总线的exe - 这是selfhost服务总线控制台应用程序)

System.Diagnostics.Process.Start("NServiceBus.Host.exe");(这是我的wpf应用程序中使用我的消息对象类的服务主机)

有没有更好的方法在visual studio外部启动这两项服务,以保持两个托管服务之间共享的静态总线属性?

1 个答案:

答案 0 :(得分:1)

我的建议:不要。您希望通过消息传递进程间通信(即通过NServiceBus和MSMQ)。不是通过windows api和其他复杂的东西。 在单独的程序集中定义消息。在共享程序集中定义Init函数(bootstrap方法),并为每个应用程序提供自己的静态IBus,在每个应用程序开始时通过Init函数初始化一次。 我怀疑你想要一个基本的发布者/订阅者构建。完成此任务的一个很好的例子是here