我想打開一個現有的實例,如果我的程序已經運行,只有當它運行相同的版本。我注意到這個問題只被要求存在名稱,但如果版本較舊,我只想通知用戶舊版本仍在運行,請在開始此版本之前刪除舊版本。如果用戶嘗試在相同版本的情況下打開新實例,那麼返回已打開的應用程序?
另一個鏈接是這一個: Return to an already open application when a user tries to open a new instance但他們不會談論如果檢測到舊版本或更新版本關閉實例。
我想打開一個現有的實例,如果我的程序已經運行,只有當它運行相同的版本。我注意到這個問題只被要求存在名稱,但如果版本較舊,我只想通知用戶舊版本仍在運行,請在開始此版本之前刪除舊版本。如果用戶嘗試在相同版本的情況下打開新實例,那麼返回已打開的應用程序?
另一個鏈接是這一個: Return to an already open application when a user tries to open a new instance但他們不會談論如果檢測到舊版本或更新版本關閉實例。
在最簡單的方法,使檢查這樣的:
foreach (var proc in Process.GetProcesses())
if (proc.MainModule.FileName == Process.GetCurrentProcess().MainModule.FileName)
//Shutdown your copy.
但更復雜的事情可能是這樣的:
foreach (var proc in Process.GetProcesses())
{
if (proc.Id == Process.GetCurrentProcess().Id) continue;
var currName = AssemblyName.GetAssemblyName(Process.GetCurrentProcess().MainModule.FileName);
var procName = AssemblyName.GetAssemblyName(proc.MainModule.FileName);
if (currName.FullName == procName.FullName && /*and other parameters*/)
return;
}
祝你好運!
P.S.:"但請注意 - 「GetAssemblyName」僅適用於託管代碼程序集,因此請使用try-catch wrap。「
感謝您的評論。如果更新的版本,當前版本和舊版本,是否有可能在決策樹上進行更深入的研究。我知道Windows安裝程序可以執行某些操作來檢測這一點。謝謝 – RetroCoder
獲取所有進程列表和foreach程序集名稱,版本等。如果找到相同的assemblyName和version - 關閉您的實例。 –
是否有可能將這兩者合併在一起......哎呀 – RetroCoder