启动相同exe的多个实例

时间:2016-03-14 13:06:47

标签: c#

我正在尝试运行用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>

4 个答案:

答案 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)