2012-01-16 1 views
1

同じフォルダーから起動するアプリケーションを禁止する必要がありますが、同じアプリケーションを他のフォルダーから実行する場合は許可する必要があります。特定の場所から.NETアプリケーションのインスタンスが実行されているかどうかを確認する方法はありますか。

問題は、アプリケーションが閉じても目に見えなくなりますが、内部ジョブを終了するためメモリに残っているという問題です。

古いインスタンスがまだメモリ内で終了すると、すぐに同じフォルダからこのアプリケーションを再起動する可能性があります。

しかし、このアプリケーションが他のフォルダから実行される場合、反対側から実行する必要があります。

どのようにC#でそれを行う手がかり?


UPDATES:実際のアプリケーションで

だけでなく、サブディレクトリ内のローカルファイルにして、ローカル・データベース・ファイルにいくつかのログを書き込みます。したがって、2つのインスタンスの間に矛盾が生じる可能性は非常に高いです。

Guid appGuid = Guid.Parse("305BACEA-4074-11E1-85E1-066E4854019B"); 

     public MainWindow() 
     { 
      InitializeComponent(); 


      using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) 
      { 

       if (!mutex.WaitOne(0, false)) 
       { 
        // MessageBox.Show("Instance already running"); 

        // Somehow here I have to get the path of the running instance. 
        // If the path the same as the current instance has I have do ban starting instance. 

        return; 
       } 

       GC.Collect();    
      } 
+3

を。アプリケーションパスに基づいて名前付きミューテックスを使用することができます。http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx http://stackoverflow.com/questions/819773/run-single-アプリケーション使用ミューテックスのインスタンス – Lloyd

+3

これは、暗黙の問題に対する不器用な解決策のようなものです。同じ理由から2つのインスタンスが同じフォルダから実行できない(または同じ実行可能ファイルから拡張子で起動される)理由を説明した場合は、おそらくより良い解決策を提案することができます。 –

+0

@Lloyd実行中のアプリケーションのパスを検出する方法は不明です。 –

答えて

2

ありがとうございます!最後に、このpostに基づいて

私は解決策が見つかりました:一般的な質問の繰り返しに近く

public partial class App : Application 
    { 
     private Mutex _instanceMutex = null; 

     protected override void OnStartup(StartupEventArgs e) 
     { 

      string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).Replace("\\", "."); 

      // check that there is only one instance of the control panel running... 
      bool createdNew; 
      _instanceMutex = new Mutex(true, path, out createdNew); 
      if (!createdNew) 
      { 
       _instanceMutex = null; 
       MessageBox.Show("Instance already running"); 
       Application.Current.Shutdown(); 
       return; 
      } 

      base.OnStartup(e); 
     } 

     protected override void OnExit(ExitEventArgs e) 
     { 
      if (_instanceMutex != null) 
       _instanceMutex.ReleaseMutex(); 
      base.OnExit(e); 
     } 

} 
0

あなたは、プログラムが既にフォルダ上で実行されていることを示すために、ロックファイルを使用することができます。

プログラムが起動すると、ディレクトリ内のファイルをチェックします。見つかった場合はシャットダウンし、終了していない場合は正常終了します。プログラムが終了したら、ファイルを削除する必要があります。

これはもちろん愚かな証拠ではありません。プログラムがクラッシュした場合、ファイルは削除されず、ユーザーはプログラムの実行中に初期チェックをバイパスしてファイルを削除することができます。

+0

ありがとう!はい、それを実装することは可能です。しかし、私は確かに、.netクラスによって起動しているアプリケーションのインスタンスパスを検出する方法があると確信しています... –

+0

なぜこれが投票されたのか分かりません。私が提示した解決策は、アプリケーションが私が指摘した問題に対処することができれば受け入れられます。 Luceneが検索ディレクトリをロックするのと同じ方法で、1つのインスタンスだけがディレクトリに書き込んでいることを確認します。 –

関連する問題