2012-05-07 99 views
3

我在.NET中使用C#。防止單個可執行文件的多個進程實例

我想防止同一個可執行文件的兩個實例同時運行,但我不想阻止從另一個文件夾運行的相同進程。

例如,我有一個可執行文件是在兩個不同的位置:

  • C:\ MyProject的\萬事達\的Program.exe

  • C:\ MyProject的\從屬\的Program.exe

這些是相同的.exe文件,但在兩個不同的位置。

我想允許一個從Master文件夾運行的Program.exe實例和一個來自Slave文件夾的實例,但沒有任何兩個實例。

我試圖通過檢查具有相同名稱(Process.GetProcessesByName)的進程數量來做到這一點,但後來我不能區分這兩者。

我發現的最接近的是從過程中獲取模塊。

列表中的第一個是exe的ProcessModule。但我不確定這是否會永遠是名單上的第一個。是否有任何保證,還是有解決問題的更好解決方案?要做到這一點

+1

我真的投票關閉這個重複的[this](http://stackoverflow.com/questions/819773/run-single-instance-of-an-application-using-mutex),當我意識到你給予的細微差別時。抱歉。但是,您仍然可以按照該方法進行操作,但是會將完整的路徑名編碼爲互斥體的名稱,從而允許每個目錄上的實例。 –

+0

沒問題。我甚至不知道我的解釋是否足夠清楚。 :) –

回答

1

的一種方式是,由其他服務也許,做這樣的事情:

Process[] processes = Process.GetProcessesByName("Program"); 

會給你程序的所有活動進程。

,那麼你可以從這個得到的目錄:

string fullPath = process.MainModule.FileName; 

比較所有實例的目錄,如果兩個具有相同的文件夾,其中有接近一個。

+0

模塊[0]是否始終是可執行的進程模塊?這可以保證嗎? –

+0

你也可以使用:System.AppDomain.CurrentDomain.FriendlyName 有當前的exe名稱 –

+0

我編輯它,而不是模塊[0] - MainModule。 – Mithir