我正在尝试运行用C#
编写的桌面程序。
我在同一台计算机上创建了多个用户,可以从Remote Desktop.
我可以从同一用户的角度成功启动多个实例,但我的目标是允许多个用户从他们自己的角度执行多个可执行文件。
我还为每个用户的桌面上的每个可执行文件创建了不同的文件夹。
我可以从第一个用户的角度成功启动可执行文件。但是不能从第二个用户的角度执行相同的可执行文件,反之亦然。
可执行文件在第二次执行时停止工作。 日志如下:
<ProblemSignatures>
<EventType>CLR20r3</EventType>
<Parameter0>MyExecutable.exe</Parameter0>
<Parameter1>1.0.3.30</Parameter1>
<Parameter2>56e6a1d2</Parameter2>
<Parameter3>mscorlib</Parameter3>
<Parameter4>4.6.1055.0</Parameter4>
<Parameter5>563c0eac</Parameter5>
<Parameter6>157f</Parameter6>
<Parameter7>12e</Parameter7>
<Parameter8>System.UnauthorizedAccess</Parameter8>
</ProblemSignatures>
答案 0 :(得分:0)
我想我找到了答案。 问题是我的代码使用互斥锁来阻止启动另一个实例。 当从单个用户的角度启动时,通过发出无法创建另一个实例的消息,它看起来像这样并且按预期工作:
public class BaseViewModel
{
public string AllProperties => GetType().GetProperties().Aggregate(string.Empty, (current, prop) => prop.PropertyType == typeof(string) ? current + (string)prop.GetValue(this, null) : current);
}
public class ChildViewModel : BaseViewModel
{
public string prop1 { get; set; }
public string prop2 { get; set; }
}
但即使CheckAnotherInstance变量为false,它也无法从第二个用户的角度重新启动时给出预期的消息。
我已经重新安排了以下代码,现在当CheckAnotherInstance为false时,它正在按预期工作。 代码是这样的:
private static string appGuid = "39E8A84A-A531-4399-9B55-B480CB1C9B1D";
//test
[STAThread]
static void Main()
{
using (Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
bool CheckAnotherInstance = true;
if (CheckAnotherInstance && !mutex.WaitOne(0, false))
{
MessageBox.Show("Only one executable can be run at the same time");
return;
}
RunProgram();
}
}
答案 1 :(得分:0)
您可以阻止单个用户运行多个实例,但仍允许多个用户分别运行单个实例。这是在没有太多额外努力的情况下实现的。
以下代码段将当前用户名附加到您要获取的互斥锁的名称上。
string userName = System.Threading.Thread.CurrentPrincipal.Identity.Name;
using (Mutex mutex = new Mutex(false, "Global\\" + appGuid + userName))
{
// do your things
}
答案 2 :(得分:0)
如果要停止从多个实例(独立于Windows用户)运行exe,也可以使用以下代码
Dim ProcessName() As Process = Process.GetProcessesByName("MyExe")
If ProcessName.Length > 1 Then
Messagebox.show "Exe is already running on another instance"
End
End If
答案 3 :(得分:-1)