两个应用程序实例之间的简单通信

时间:2010-12-27 19:51:11

标签: c# communication single-instance

我有一个WPF应用程序可以使用一些可选的命令行参数。

此应用程序也是单实例应用程序(使用互斥锁关闭任何已打开的实例)。

我想做的事情是,如果某些东西试图用一些cmd行args打开应用程序,那么应用程序将执行它想要做的事情(在我的应用程序中它会根据cmd打开不同的对话框)线)。

实现这一目标的最简单方法是什么?

在psedo代码中,这里是我正在寻找的

protected override void OnStartup(StartupEventArgs e)
{
     bool mutexIsNew;
     using (System.Threading.Mutex m = 
            new System.Threading.Mutex(true, "MyApplication", out mutexIsNew))
     {
         //if this is not the first instance of the app
         if (!mutexIsNew)
         {
              //if there is some cmd line args  
              if (e.Args.Length > 0)
              {
                   //send the args to the older instance so it can handle them
                   SendToOtherInstance(e.Args);
                   //shutdown this new instance
                   Application.Current.Shutdown();
               }

         }
     }
     base.OnStartup(e);
}

4 个答案:

答案 0 :(得分:3)

Code Project上有很多单实例应用程序的实现,实际上有很多这样的应用很难决定你想要哪一个......

我尝试了几种解决方案,我非常喜欢this one。它可以很容易地拦截传递给第二个实例的命令行参数。

答案 1 :(得分:1)

为什么不直接在WM_USER范围内发送Windows消息。您需要对信息进行一些编组,但您可以很容易地使用GlobalAlloc,GlobalLock等进行编组。

答案 2 :(得分:0)

您可能希望考虑颠倒逻辑,即。关闭已经运行的实例并使用新参数重新启动。

答案 3 :(得分:0)

如果您使用的是.net 4,则可以考虑使用内存映射文件进行进程间通信。第二个实例可以将一些数据写入共享内存,设置系统互斥锁以通知原始实例,然后关闭。请参阅此overview内存映射文件。

或者,更简单的是,将命令行参数写入始终由原始实例监视的文件夹中的简单文本文件。原始实例看到新文件,处理它,然后删除它。这种方法适用于任何版本的.net,更容易测试/调试。