检查 exe 是否已经 运行 相同的参数 c#

check if exe is already running with same arguments c#

目前我正在使用下面的函数来停止我的 exe 如果 exe 已经 运行ning

public static bool IsAlreadyRunning()
{
    string strLoc = Assembly.GetExecutingAssembly().Location;
    FileSystemInfo fileInfo = new FileInfo(strLoc);
    string sExeName = fileInfo.Name;
    bool bCreatedNew;

    Mutex mutex = new Mutex(true, "Global\" + sExeName, out bCreatedNew);
    if (bCreatedNew)
        mutex.ReleaseMutex();

    return !bCreatedNew;
}

但是我的 exe 可以 运行 使用不同的参数,所以只有当我的 exe 运行 有另一个相同参数的实例时,我才需要停止 exe。

那么有没有办法从上面的代码或任何指针中获取参数来完成这项工作?

您可以使用参数生成互斥体名称。互斥体只需要有一个唯一的名字就可以工作,它不必包含可执行文件的名字。

简洁明了的方法是将参数传递给方法。快速而肮脏的方法是使用 Environment.CommandLine to grab the entire command line or GetCommandLineArgs 来获取参数。

例如:

var args=String.Join("-",Environment.GetArguments());
var mutexName=$@"Global\{sExeName}-{args}";
var mutex = new Mutex(true, mutexName, out bCreatedNew);

更好的办法是先对参数进行哈希处理,然后使用哈希作为名称。使用散列方法 like the one in this answer,您可以从连接的字符串中计算参数 has :

static string GetSha256Hash(string input)
{
    var hasher=SHA256.Create();
    byte[] data = hasher.ComputeHash(Encoding.UTF8.GetBytes(input));

    StringBuilder sBuilder = new StringBuilder();

    // Loop through each byte of the hashed data 
    // and format each one as a hexadecimal string.
    for (int i = 0; i < data.Length; i++)
    {
        sBuilder.Append(data[i].ToString("x2"));
    }

    // Return the hexadecimal string.
    return sBuilder.ToString();
}

...

var args=String.Join("-",Environment.GetArguments());
var argHash=GetSha256Hash(args);
var mutexName=$@"Global\{sExeName}-{argHash}";
var mutex = new Mutex(true, mutexName, out bCreatedNew);