C# 检查exe是否已使用相同的参数c运行#
目前,如果exe已经在运行,我正在使用下面的函数停止我的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
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吗