【问题标题】:Is it possible to access a static property from a running executable?是否可以从正在运行的可执行文件访问静态属性?
【发布时间】:2011-12-12 00:27:16
【问题描述】:

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

执行 NServiceBus 控制台时,在我的启动类中设置了一个静态属性:

    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 应用程序中用于实例化消息对象并将消息发送到 NServiceBus 的 C# 代码:

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 之外启动这两个服务,以保持两个托管服务之间共享静态总线属性?

【问题讨论】:

  • 拥有另一个进程的原因是什么?您可以直接在 WPF 应用程序中托管 NSB。

标签: c# nservicebus


【解决方案1】:

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

【讨论】:

  • 我有兴趣了解更多有关引导方法的信息。它看起来像这样吗?使用 NServiceBus;命名空间 MyClient { public class ClientInit : IWantCustomInitialization { public void Init() { public static IBus Bus { get;私人套装; } public static void Init() { Bus = NServiceBus.Configure.With() .Log4Net() ..... .Start(); } } }
  • 对不起,讨厌回车,没做完。我的意思是这样的: public static IBus Bus { get;私人套装; } public static void Init() { Bus = NServiceBus.Configure.With() .Log4Net() ... .CreateBus() .Start();如果是这样,我将如何从 wpf 应用程序调用它来启动 NServiceBus.host.exe 并同时在 wpf 应用程序中设置 IBus Bus 静态属性?这个初始化文件是否存储在 NServiceBus 项目中并在我执行 NServiceBus.host.exe 时运行?你有示例代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2015-05-25
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多