2016-05-26 12 views
2

私の小さなアプリケーションに深刻な問題があります。基本的に理解するのが非常に簡単です:同じアプリケーションの別のインスタンスに引数を渡す

私のソフトウェアは、開かれたとき、それはものですか?

私は別のインスタンスを開くことに集中したいと思います(また、.exeをもう一度開くことを意味します)、既に開いているかどうかを確認してください。単純にアプリケーションを起動するのではなく、すでに実行中の場合(2番目以上のインスタンス)には、入力引数(args文字列配列)を最初のインスタンスに渡すだけで適切に処理されます。ここで

は、それがすでにそれがメインインスタンスには何も通信できない(オフコース)開かれたが、だ場合にのみ(ミューテックスを)認識して、私のProgram.cs

static class Program 
{ 
    static Mutex mutex = new Mutex(true, "{blabla}"); 

    [STAThread] 
    static void Main(String[] args) 
    { 
     if (mutex.WaitOne(TimeSpan.Zero, true)) 
     { 
      //First Instance! 

      try 
      { 
       Application.EnableVisualStyles(); 
       Application.SetCompatibleTextRenderingDefault(false); 

       CALL A MY STATIC METHOD, DO SOME THINGS 

       Application.Run(new Form1()); 
      } 
      finally 
      { 
       mutex.ReleaseMutex(); 
      } 
     } 
     else 
     { 
      //Not-so-first instance! 
      CALL A STATIC METHOD, 
      DO OTHER THINGS LIKE COMUNICATE WITH FIRST INSTANCE 

      SIMPLY CLOSE. 
     } 
    } 
} 

です。

私は多くのことを試しましたが、うまく動作しません。

私はthisを試しましたが、私は「最初の時間」のコードと「既に実行中の」コードをどのように入れておくのが大したことではありません。

も試してみましたが、MSMQでも試してみました。

誰かお手伝いできますか?非常に基本的なことをする基本的なソフトウェアですが、私はそれを私が望むように動作させるために過ごしました!

+0

2番目のインスタンスが別のプロセスで実行されています。何らかの通信メカニズム(MSMQ、ソケットを介したシリアル化など)を実装する必要があります。「静的」なものを作成することはできません。同じ実行可能ファイルの複数のコピーを実行しているという事実は、異なるアプリケーション間の通信よりも問題を単純化するものではありません。 –

+0

不幸にも、同じ実行可能プログラムであっても、別のプログラムとのやりとりが容易ではないということを今日学んだことがあります。私は、すべてのものを静的にするよりも、異なるコピーを別に管理しなければならないことを理解しています静的メソッドは、私はそれを別の.csファイルの中に書いて、それは私のプログラムのロジックで使用されています:質問にはあまり関係はありません:) –

答えて

0

一つ。 2番目のインスタンスはPostMessageを使用してメッセージを送信し、最初のインスタンスはForm1のWndProcメソッドをオーバーライドしてメッセージを処理します。

例はここにあります: Send message to a Windows process (not its main window)

その質問には、通信のためのパイプ(とWCF)を使用して答えを持っています。

プロセス間通信には多くの形式があります。どのメッセージを使用するかはニーズに応じて異なります。たとえば、メッセージは大量の情報を伝えることはできませんが、パイプはデータを非常に高速にストリームできます。

更新 単純な代替方法はIPCChannelです。これにより、第2のインスタンスによって呼び出されることができる第1のインスタンス内にオブジェクトを作成することが可能になる。そのオブジェクトに対してメソッドを作成し、データを引数として渡すことができます

+0

私はキッチャの最終的な解決策を試してきた。 PostMessageを使ってメインインスタンスに 'input'を送信し、そこから関数や操作を開始することができます。問題は、PostMessageがIntパラメータのみを許可することです。私は何らかの構造化データ(配列やオブジェクトのようなもの)を送りたいが、可能かどうかは分からない。あなたは何を言っていますか?私は何かを試すことができますか? –

+0

さらにデータを送信する必要がある場合は、より高度な形式のプロセス間通信が必要です。 MSMQは行く1つの方法ですが、あなたはそれに問題があるようです。簡単な代替方法はhttps://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.ipc.ipcipannel.aspxです。これにより、第2のインスタンスによって呼び出されることができる第1のインスタンス内にオブジェクトを作成することが可能になる。そのオブジェクトに対してメソッドを作成し、データを引数として渡すことができます –

+0

感謝!それは私の問題を解決しました!私はいくつかの小さなマイナーな問題がありました(私は2番目のインスタンスからすべてを呼び出すことはできません:FolderBrowserDialogのようないくつかのメソッドは、少なくとも私のケースではうまくいきません。デバッガも私には外から呼び出すことはできないと言ってきましたが)これは私の問題を解決しましたので、IpcChannelをInteropMessage(Chitzaソリューション)と組み合わせました。ソフトウェア:) –

1

Mutexを使用してください。

あなたがミューテックスを解放する必要があるプログラムの終了時に
// Generate your GUID and put it here 
    private const string ProgramRunningGuid = "BD2023EE-F7B3-47B8-8C76-32668196E4D3"; 
    private Mutex _mutex; 

    private bool IsProgramRunning() 
    { 
     bool createdNew; 
     // It returns a bool value determining if a Mutex that created is new 
     // If the program is already running mutex wouldn't be new 
     _mutex = new Mutex(true, ProgramRunningGuid, out createdNew); 
     return !createdNew; 
    } 

_needlesRunningMutex.ReleaseMutex(); 

そして、あなたはあなたのアプリケーションの既に実行中のインスタンスを集中したい場合は、ここに解決策を働いて私の答えを確認することができます。https://stackoverflow.com/a/35018042/3731444

bool引数を共有するだけで、項目をオンまたはオフにするかどうかを判断することができれば、それぞれにMutexesを使用することができます。

あなたはそれがこの質問をチェック始めているとき、あなたの.exeファイルにパラメータを渡す必要がある場合:あなたは、実行中のアプリの2つのインスタンス間でcontinious通信を行うために必要なMSMQとそれを維持する場合は

を。質問があればお手伝いします。ここでMSMQを使用する方法

チェックA:最初のインスタンスに2つ目のインスタンスからWindowsメッセージを送ることであろう通信する最も簡単な方法のhttps://github.com/IvanYurchenko/MSMQSample

+0

しかし、これは私の主な問題を解決しない:私のソフトウェアのインスタンスをメイン1。あなたのソリューションでは、それがすでに開始されているかどうかを理解することができますが、私はすでにコード内で行っています。または私はあなたの解決策を理解していないのですか? –

+0

回答を更新に追加しました。それがまだ不明な場合は教えてください。 –

+0

私はMSMQの初心者です(一般的にはC#に)。私は「元のインスタンス」と他のインスタンスとの間に一定の通信を必要としません。私は、新しいインスタンスがメインインスタンスにメッセージを送信し、それから単に閉じる必要があります。私はコードを読んでいますが、私はいくつかの新しいコンセプトを理解していません。プロジェクトにはSystem.Messagingのリファレンスが含まれていますが、Form.csファイルに "レシーバメッセージロジック"スキャンする 'というメッセージが表示されます。また、変数MessageAddress/QueueNameには何もできますか?文字列配列のみを転送できますか? –

関連する問題