C# Winform应用程序的单例,但是否提供参数?

C# Winform应用程序的单例,但是否提供参数?,c#,winforms,singleton,C#,Winforms,Singleton,我有一个webform(c#)应用程序,它应该只能在一个实例中运行。同样重要的是,如果应用程序再次启动(单击应用程序图标),则新参数应转发到当前实例,但现在应用程序将启动 我已经解决了这个问题,并发现: 到目前为止,我是这样设置的: public class MyApp : ApplicationContext { private static MyApp _instance; private static Mutex _mutex = new Mutex(tru

我有一个webform(c#)应用程序,它应该只能在一个实例中运行。同样重要的是,如果应用程序再次启动(单击应用程序图标),则新参数应转发到当前实例,但现在应用程序将启动

我已经解决了这个问题,并发现:

到目前为止,我是这样设置的:

public class MyApp : ApplicationContext
{
        private static MyApp _instance;
        private static Mutex _mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");

        [STAThread]
        public static void Main(string[] args)
        {
             MyParams params;

             params = ExtractParams(args);

             if (_mutex.WaitOne(TimeSpan.Zero, true))
             {
                  _instance = new MyAppp(params);
                  Application.Run(_instance);
             }
             else
             {
                  _instance.SetParameters(params);
             }
        }
}
问题是,当我第二次尝试启动程序时,我会在else中得到一个异常,即_实例为null


我在这里做错了什么?

Microsoft.VisualBasic.dll的.NET程序集
包含一个名为的类。这个函数也可以被C#应用程序使用,它有一个名为
IsSingleInstance
的属性,可以设置该属性以实现所需的行为

在第一次应用程序启动时,您可以注册一个事件处理程序,以便进一步启动应用程序。从事件参数中,可以提取每个附加启动的命令行参数


请参阅一个示例。

在本例中,它是进程间通信(IPC),因此\u实例没有意义。如果你想要IPC,有一些方法可以实现:套接字、命名管道、消息传递

我认为有两种方法是合适的:

  • 通过进程名->调用P/Invoke EnumWindows方法获取上一个进程,以获取主窗口句柄。发送ID为的消息之前已向RegisterWindowMessage注册,以传递参数
  • 创建namedpipe服务器以侦听新进程的参数

  • Stephan>谢谢,我已经读过这篇文章,我们选择了另一种方式(没有VisualBasic.dll),因为在c#应用程序中包含VisialBasic.dll文件是不对的?但也许我们已经没有选择了?+1个很好的例子,我以前从未发现过。但话说回来,我从来没有实现过一个单一的应用实例lol@SnowJim:那么您的方法是一个良好的开端,您需要找到一种方法将参数传递给正在运行的实例。@Stephan>但是这个示例似乎绑定到一个MainForm?在我们的例子中,第一个表单是一个登录表单,并不总是显示这个表单。事实上,我们有一个主控制器(singelton),它处理表单中的所有内容,如果打开新表单,则会联系主控制器。那么这与您的建议解决方案有什么关系呢?如果我没记错的话,您必须确保始终有一个表单集作为应用程序的主表单。当主窗体关闭时,应用程序退出。但是你可以在运行时切换主窗体。我将使用sugestions 2,到目前为止它似乎工作得很好。