網路上查到的資料大多是用Mutex
System.Threading.Mutex mutex = new System.Threading.Mutex(true, uniqueName, out bool createdNew)
但我在自己電腦測試並微調過幾種寫法,結果createdNew都為true,原因不明
在此紀錄檢查Process.MainModule.FileName & Process.Id的做法
(無論是利用Mutex或Process,都需要注意權限問題)
Process ps = Process.GetCurrentProcess();
foreach (Process other in Process.GetProcessesByName(ps.ProcessName))
{
try
{
//同路徑的進程只能存在一個實體
if (other.MainModule.FileName == ps.MainModule.FileName && other.Id != ps.Id)
{
Environment.Exit(0);
}
}
catch //有高權限進程存在時,低權限取高權限的MainModule會跳錯
{
//有高權限進程存在時,低權限不可執行,視需求調整
Environment.Exit(0);
}
}
//以上紀錄的是同路徑的進程只能存在一個實體,非作業系統全域只能存在一個實體,因此只要將整個專案資料夾複製更名,就能再啟動另一個實體