私はこれを達成するためにStackOverflowで少なくとも3つの異なるメソッドを見てきました。
MUTEXの使用: これに対する受け入れられた回答SO質問
Microsoft.VisualBasicライブラリのWindowsFormsApplicationBaseの使用: これに対する2番目に投票された回答SO質問
Process.GetProcessNamesを使用して、アプリケーションが実行されているかどうかを確認します。 ここのメソッド これに対する回答として投稿されました SOの質問
これを行う方法は他にもあると思います。
これらのいずれかが好ましいかどうか、そして「間違った」ものを選択した場合の結果はどうなるのか、私は単に疑問に思っています。
疑わしい場合は、常に。NETフレームワークに含まれている実装を優先します。このような実装は数十万人のプログラマーによってテストされ、セキュリティと使いやすさについて慎重に検討されており、今後数年間維持されることを期待できます。
ミューテックスアプローチは簡単に始めることができます。ただし、かなり深刻なセキュリティ問題が発生します。 サービス拒否攻撃は非常に簡単に実行できます。ミューテックスの名前を秘密にしておくことはできず、誰でも同じ名前のミューテックスを簡単に作成して、プログラムが起動しないようにすることができます。
同じ理由で、プロセス名のアプローチには大きな欠陥があります。プロセス名が一意であるという保証はありません。悪用するのは簡単なだけでなく、偶然に簡単に引き起こされます。
WindowsFormsApplicationBaseには、C#プログラマーの目には画像の問題があります。彼らは名前空間名で窒息し、彼らのプログラムがどういうわけかvb-ismsに感染するだろうと思い込んでいます。それはナンセンスです、それはどんな言語でも使用できる単なる.NETクラスです。
なぜ誰もカチカチ音をたてることに言及しなかった このチェックボックス ?
それは本当に好みの問題ですが、VisualBasicライブラリへの依存を必要としないという理由だけで、Mutex
アプローチを好みます。また、Process.GetProcessNames
の使用は理想的ではないソリューションです(前述のように、プロセス名前は、必ずしもあなたが思うものにマップされるとは限りません)