C#の.Net / Mono Singleton(サービス/サーバー?)-.netアプリが既に実行されているかどうかを検出し、コマンドライン引数をそれに渡します

StackOverflow https://stackoverflow.com/questions/810181

  •  03-07-2019
  •  | 
  •  

質問

C#で単純なシングルトンコマンドラインアプリケーション(サービス?)を作成して、実行時に、既に実行されているかどうかを確認し、実行されている場合は、コマンドライン引数をすでにインスタンスを実行しており、自身を閉じました。これで、既に実行中のインスタンスでは、" delegate void Command(string [] args);"のようなイベントを通じてコマンドライン引数を受け取ります。などのように、イベントを介して1つのアプリケーションからコマンドラインを管理できます。

たとえば、Photoshopで最初に画像を開くと、新しいインスタンスphotoshopが読み込まれますが、2番目の画像を開くと、photoshopのインスタンスが既に実行されているかどうか、および実行されているかどうかが確認されます、既にロードされているphotoshopのインスタンスに写真を渡すので、photoshopのロード時間を再度回避できます...

またはWebブラウザで、新しい.htmlファイルを開くと、新しいウィンドウインスタンスではなく、新しいタブで開くように設定できます。

または多くのテキストエディターには、テキストエディターの1つのインスタンスのみを開くことができる設定があり、新しいファイルを開くと、新しいウィンドウではなく新しいタブに読み込まれます...

winampなどの多くの音楽プレーヤーもこれを行います...

最終的にはこれをサービスとして設定するため、後でコマンドライン引数を常にリッスンする必要がありますが、現時点では特定のタイプのファイルのオープンをまとめて管理できるようになっていますシングルトンアプリケーション、または他のアプリケーションに、開くファイルのコマンドライン引数を渡す...

また、常に実行されているサービスのイベントに渡されたすべてのコマンドライン引数を再ルーティングするためのより良い方法または.NetのAPIを知っている場合、私はそれで作業することができます...しかし私はまた、可能であれば、Linux / MacでMonoで実行できるように、このクロスプラットフォームを維持し、2つ以上のコードベースを管理する必要なく...

役に立ちましたか?

解決

これは、私が探している正確な機能を実装するために使用した記事です。コマンドライン引数も転送できます。

シングルインスタンスC#アプリケーション-.NET 2.0向け

他のヒント

1.0 / 1.1フレームワークで.netリモーティングを使用して非常に異なる目的で使用しましたが、類似の使用を行いました。基本的に、セマフォを使用して、実行中のインスタンスが1つだけであることを確認します。マシンごとに1つのインスタンスのみを使用する場合はグローバルネームスペースを、ユーザーセッションごとにインスタンスを使用する場合はローカルをターゲットにします(ターミナルサービスおよび高速ユーザー切り替えシナリオ)。

セムフォアをロックできる場合は、リモート処理をセットアップしてイベントのリッスンを開始し、コードを続行します。

ロックできない場合、別の実行中のインスタンスがあると想定できます。この場合、他のインスタンスへのリモーティングチャネルを開き、引数を渡してシャットダウンします。

名前付きミューテックスを使用してみてください(名前を付けると、システム全体に広がり、簡単に識別できます)。ミューテックスを使用すると、インスタンスを実行するか(名前のあるミューテックスが存在しない場合)、既存のインスタンスを開いてパラメータを渡すことができます。 コードサンプルがないことをおologiesび申し上げます。これは私の電話から書いています。

編集:nvrmnd。投稿を読み直してください。クロスプラットフォームに移行することでこれがうまくいくとは思いません。

Visual Basicにはこのビルトインがあります。ご覧ください:

Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase-パブリックイベントStartupNextInstance

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top