C#中的.Net / Mono Singleton(服务/服务器?) - 检测我的.net应用程序是否已经运行并将命令行参数传递给它

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

我想在C#中创建一个简单的单例命令行应用程序(服务?),当它运行时,它检查它是否已经在运行,如果是,它将命令行args传递给已经运行实例并关闭自己。现在,在已经运行的实例中,它将通过诸如“delegate void Command(string [] args);”之类的事件接收命令行参数。或类似的东西,所以我可以通过事件管理一个应用程序的命令行。

例如在photoshop中,当您第一次打开图片时,它会加载一个新的实例photoshop,但是当您打开第二张图片时,它会检查一下photoshop的实例是否已经在运行,如果是,它将图片传递给已经加载的photoshop实例,这样就可以避免重新开发Photoshop的昂贵的加载时间......

或者在Web浏览器中,您可以设置它,这样如果您打开一个新的.html文件,它会在新选项卡中打开它,而不是新窗口实例。

或许多文本编辑器的设置只允许打开文本编辑器的一个实例,当打开新文件时,它会加载到新选项卡中,而不是新窗口...

许多像winamp这样的音乐播放器也这样做......

我最终会将其设置为一项服务,所以它应该在以后不断地监听命令行args,但是现在主要是因为我可以在一个管理中打开特定类型的文件单例应用程序,或让其他应用程序传递他们想要打开的文件的命令行参数...

另外,如果你知道更好的方法或.i中的API来重新通过所有传递的命令行args,对于一个始终运行的服务事件,我可以使用它......但是我d也希望保留这个跨平台,以便它可以在Mono上的Linux / Mac上运行,如果可能的话,无需管理两个或更多代码库......

有帮助吗?

解决方案

这是我用来实现您正在寻找的确切功能的文章,它也允许您传输命令行参数。

单实例C#应用程序 - 适用于.NET 2.0

其他提示

我们做了一些类似的东西,尽管在1.0 / 1.1框架上使用.net远程处理的目的非常不同。基本上我们使用信号量来确保我们是唯一运行的实例。如果您希望每台计算机只有一个实例,或者您希望每个用户会话只有一个实例(在终端服务和快速用户切换方案中),那么您将希望定位全局命名空间。

如果您可以锁定semphore,您将设置远程处理并开始侦听事件,然后继续使用您的代码。

如果你无法锁定,那么你可以假设你有另一个正在运行的实例,在这种情况下你将打开另一个实例的远程通道传递args并关闭。

您可以尝试使用命名的互斥锁(命名它将使其成为系统范围,并且易于识别)。使用互斥锁,您可以运行实例(如果不存在带名称的互斥锁),也可以打开现有实例并传入参数。 没有代码样本的道歉,从我的手机写下来。

编辑:nvrmnd。只是重新阅读帖子,我认为这不适合你跨平台。

Visual Basic内置了这个。看看:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase - Public Event StartupNextInstance

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top