Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查exe是否已使用相同的参数c运行#_C#_Console Application - Fatal编程技术网

C# 检查exe是否已使用相同的参数c运行#

C# 检查exe是否已使用相同的参数c运行#,c#,console-application,C#,Console Application,目前,如果exe已经在运行,我正在使用下面的函数停止我的exe public static bool IsAlreadyRunning() { string strLoc = Assembly.GetExecutingAssembly().Location; FileSystemInfo fileInfo = new FileInfo(strLoc); string sExeName = fileInfo.Name; bool bCreatedNew;

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

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


那么,有没有一种方法可以从上述代码或任何指针获取参数来完成此操作?

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


nice和clean方法是将参数传递给该方法。quick&dirty方法用于获取整个命令行或仅获取参数

例如:

var args=String.Join("-",Environment.GetArguments());
var mutexName=$@"Global\{sExeName}-{args}";
var mutex = new Mutex(true, mutexName, out bCreatedNew);
更好的办法是先对参数进行散列,然后使用散列作为名称。使用散列方法,可以从连接的字符串计算参数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);

静态字符串GetSha256Hash(字符串输入)
{
var hasher=SHA256.Create();
byte[]data=hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
您可以使用参数生成互斥体名称。互斥体只需要有一个唯一的名称就可以工作,它不必包括可执行文件名


nice和clean方法是将参数传递给该方法。quick&dirty方法用于获取整个命令行或仅获取参数

例如:

var args=String.Join("-",Environment.GetArguments());
var mutexName=$@"Global\{sExeName}-{args}";
var mutex = new Mutex(true, mutexName, out bCreatedNew);
更好的办法是先对参数进行散列,然后使用散列作为名称。使用散列方法,可以从连接的字符串计算参数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);

静态字符串GetSha256Hash(字符串输入)
{
var hasher=SHA256.Create();
byte[]data=hasher.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
仅当使用参数生成互斥体名称时。互斥体只需要每个实例有一个唯一的名称。它不必包括可执行文件名或参数本身,而是由它们生成的哈希。参数被传递到
Main
方法,您可以检查它们。nice and clean方法将把参数传递给该方法。quick&dirty方法是使用`来获取整个命令行或仅获取参数。如果只是一个建议,您可以将进程状态信息存储在二进制文件中。每当用户尝试运行新的exe时,您都可以先检查此文件。如果存在冲突,可以通过其id(也可以存储在文档中)终止前一个进程,然后运行新进程。它不会阻止用户使用相同的参数运行相同的exe,因为程序应该首先启动以检查文件,但至少您可以使用这种方法阻止进程的其余部分。@ycansener互斥体就是这样的。即使进程崩溃,也必须删除和锁定文件(您建议的)只有在使用参数生成互斥体名称时才可以。互斥体只需要每个实例有一个唯一的名称。它不必包括可执行文件名或参数本身,而是由它们生成的哈希。参数被传递到
Main
方法,您可以检查它们。nice and clean方法将把参数传递给该方法。quick&dirty方法是使用`来获取整个命令行或仅获取参数。如果只是一个建议,您可以将进程状态信息存储在二进制文件中。每当用户尝试运行新的exe时,您都可以先检查此文件。如果存在冲突,可以通过其id(也可以存储在文档中)终止前一个进程,然后运行新进程。它不会阻止用户使用相同的参数运行相同的exe,因为程序应该首先启动以检查文件,但至少您可以使用这种方法阻止进程的其余部分。@ycansener互斥体就是这样的。当我运行两个VisualStudio实例进行检查时,即使进程Crassesit正在运行,也必须删除锁文件(您建议的)。但是,当我从两个命令提示调用exe时,它并没有识别是否有另一个exe实例使用相同的参数运行。知道这里有什么问题吗?@Pரதீப் 互斥体的实际名称是什么?两个实例的名称是否相同?除此之外,代码与您使用互斥体名称启动的代码相同-realtimefeed.exe-20191126 | |两个实例的名称是否相同-是的。我也尝试了hashcode版本,同样的问题,在Visual studio中工作,但在调用
exe
(取自bin\release文件夹)时无法工作。更不用说找到问题了。当我通过运行两个VisualStudio实例来检查它时,它正在工作。但是,当我从两个命令提示调用exe时,它并没有识别是否有另一个exe实例使用相同的参数运行。知道这里有什么问题吗?@Pரதீப் 互斥体的实际名称是什么?这些名字是s吗