web-dev-qa-db-ja.com

単一インスタンスアプリケーションを実装するための正しい.NET方法

私はこれを達成するためにStackOverflowで少なくとも3つの異なるメソッドを見てきました。

  1. MUTEXの使用: これに対する受け入れられた回答SO質問

  2. Microsoft.VisualBasicライブラリのWindowsFormsApplicationBaseの使用: これに対する2番目に投票された回答SO質問

  3. Process.GetProcessNamesを使用して、アプリケーションが実行されているかどうかを確認します。 ここのメソッド これに対する回答として投稿されました SOの質問

これを行う方法は他にもあると思います。

これらのいずれかが好ましいかどうか、そして「間違った」ものを選択した場合の結果はどうなるのか、私は単に疑問に思っています。

17
Michael Mankus

疑わしい場合は、常に。NETフレームワークに含まれている実装を優先します。このような実装は数十万人のプログラマーによってテストされ、セキュリティと使いやすさについて慎重に検討されており、今後数年間維持されることを期待できます。

ミューテックスアプローチは簡単に始めることができます。ただし、かなり深刻なセキュリティ問題が発生します。 サービス拒否攻撃は非常に簡単に実行できます。ミューテックスの名前を秘密にしておくことはできず、誰でも同じ名前のミューテックスを簡単に作成して、プログラムが起動しないようにすることができます。

同じ理由で、プロセス名のアプローチには大きな欠陥があります。プロセス名が一意であるという保証はありません。悪用するのは簡単なだけでなく、偶然に簡単に引き起こされます。

WindowsFormsApplicationBaseには、C#プログラマーの目には画像の問題があります。彼らは名前空間名で窒息し、彼らのプログラムがどういうわけかvb-ismsに感染するだろうと思い込んでいます。それはナンセンスです、それはどんな言語でも使用できる単なる.NETクラスです。

17
Hans Passant

なぜ誰もカチカチ音をたてることに言及しなかった このチェックボックス

enter image description here

5
Neolisk

それは本当に好みの問題ですが、VisualBasicライブラリへの依存を必要としないという理由だけで、Mutexアプローチを好みます。また、Process.GetProcessNamesの使用は理想的ではないソリューションです(前述のように、プロセス名前は、必ずしもあなたが思うものにマップされるとは限りません)

0
JerKimball