检查应用程序是否已经 运行,如果关闭它 C#
Check if app is already running, and if kill it C#
我知道 Mutex
可以用来确定另一个应用程序实例是否是 运行,但是我可以从 Mutex
中找到另一个实例的 PID 或名称吗?如果不是来自 Mutex
,是否有另一种方法可以杀死 运行 的其他实例。这有点棘手,因为它也必须绑定到用户并且它不应该使用文件来完成这个技巧(我知道 Mutex
创建文件,但是 .NET 通过内部函数创建的文件是可以的)。
请注意,我需要获取其他实例的信息才能杀死它。
感谢阅读!
你应该做这样的事情:
static void Main(string[] args)
{
HashSet<string> targets = new HashSet<string>( args.Select( a => new FileInfo(a).FullName ) , StringComparer.OrdinalIgnoreCase ) ;
foreach ( Process p in Process.GetProcesses().Where( p => targets.Contains(p.MainModule.FileName) ) )
{
Console.WriteLine( "Killing process id '{0}' (pid={1}), main module: {2}" ,
p.ProcessName ,
p.Id ,
p.MainModule.FileName
) ;
try
{
p.Kill() ;
Console.WriteLine("...Killed");
}
catch ( Exception e )
{
Console.WriteLine( "...well, that was unexpected. Error: {1}" , e.Message ) ;
}
}
return;
}
我知道 Mutex
可以用来确定另一个应用程序实例是否是 运行,但是我可以从 Mutex
中找到另一个实例的 PID 或名称吗?如果不是来自 Mutex
,是否有另一种方法可以杀死 运行 的其他实例。这有点棘手,因为它也必须绑定到用户并且它不应该使用文件来完成这个技巧(我知道 Mutex
创建文件,但是 .NET 通过内部函数创建的文件是可以的)。
请注意,我需要获取其他实例的信息才能杀死它。
感谢阅读!
你应该做这样的事情:
static void Main(string[] args)
{
HashSet<string> targets = new HashSet<string>( args.Select( a => new FileInfo(a).FullName ) , StringComparer.OrdinalIgnoreCase ) ;
foreach ( Process p in Process.GetProcesses().Where( p => targets.Contains(p.MainModule.FileName) ) )
{
Console.WriteLine( "Killing process id '{0}' (pid={1}), main module: {2}" ,
p.ProcessName ,
p.Id ,
p.MainModule.FileName
) ;
try
{
p.Kill() ;
Console.WriteLine("...Killed");
}
catch ( Exception e )
{
Console.WriteLine( "...well, that was unexpected. Error: {1}" , e.Message ) ;
}
}
return;
}