Wie kann in .NET am besten verhindert werden, dass mehrere Instanzen einer App gleichzeitig ausgeführt werden? Und wenn es keine "beste" Technik gibt, welche Einschränkungen sind bei jeder Lösung zu beachten?
123
Verwenden Sie Mutex. Eines der obigen Beispiele für die Verwendung von GetProcessByName weist viele Einschränkungen auf. Hier ist ein guter Artikel zu diesem Thema:
http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx
[STAThread]
static void Main()
{
using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
Application.Run(new Form1());
}
}
private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;
die die ausführende Assembly ist guid zu bekommenquelle
Hier ist der Code, den Sie benötigen, um sicherzustellen, dass nur eine Instanz ausgeführt wird. Dies ist die Methode zur Verwendung eines benannten Mutex.
quelle
Hanselman hat einen Beitrag zur Verwendung der WinFormsApplicationBase-Klasse aus der Microsoft.VisualBasic-Assembly, um dies zu tun.
quelle
Es hört sich so an, als ob bisher drei grundlegende Techniken vorgeschlagen wurden.
Irgendwelche Vorbehalte, die ich verpasst habe?
quelle
1 - Erstellen Sie eine Referenz in program.cs ->
2 -
void Main()
Als erste Codezeile eingeben ->Das ist es.
quelle
Mutex
? Gibt es einen Haken?Wenn Sie Visual Studio 2005 oder 2008 verwenden, um ein Projekt für eine ausführbare Datei zu erstellen, befindet sich in den Eigenschaftenfenstern im Bereich "Anwendung" ein Kontrollkästchen mit dem Namen "Einzelinstanzanwendung erstellen", das Sie aktivieren können, um die Anwendung in eine Einzelinstanzanwendung zu konvertieren .
Hier ist eine Aufnahme des Fensters, von dem ich spreche: Dies ist ein Windows Studio-Anwendungsprojekt von Visual Studio 2008.
quelle
Ich habe alle Lösungen hier ausprobiert und in meinem C # .net 4.0-Projekt hat nichts funktioniert. In der Hoffnung, hier jemandem die Lösung zu helfen, die für mich funktioniert hat:
Als Hauptklassenvariablen:
Wenn Sie überprüfen müssen, ob die App bereits ausgeführt wird:
Ich musste andere Stellen nur unter bestimmten Bedingungen schließen, dies funktionierte gut für meinen Zweck
quelle
http://en.csharp-online.net/Application_Architecture_in_Windows_Forms_2.0 - Single-Instance_Detection_and_Management
quelle
Nach dem Ausprobieren mehrerer Lösungen stelle ich die Frage. Am Ende habe ich das Beispiel für WPF hier verwendet: http://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/
In App.xaml:
quelle
In diesem Artikel wird lediglich erläutert, wie Sie eine Windows-Anwendung mit Kontrolle über die Anzahl ihrer Instanzen erstellen oder nur eine einzelne Instanz ausführen können. Dies ist ein sehr typischer Bedarf einer Geschäftsanwendung. Es gibt bereits viele andere mögliche Lösungen, um dies zu kontrollieren.
http://www.openwinforms.com/single_instance_application.html
quelle
Verwenden Sie VB.NET! Nicht wirklich ;)
Verwenden von Microsoft.VisualBasic.ApplicationServices;
Die WindowsFormsApplicationBase von VB.Net bietet Ihnen eine "SingleInstace" -Eigenschaft, die andere Instanzen ermittelt und nur eine Instanz ausführen lässt.
quelle
Dies ist der Code für VB.Net
Dies ist der Code für C #
quelle
http://www.codeproject.com/KB/cs/SingleInstancingWithIpc.aspx
quelle
Sie müssen System.Diagnostics.Process verwenden.
Überprüfen Sie heraus: http://www.devx.com/tips/Tip/20044
quelle
(Hinweis: Dies ist eine unterhaltsame Lösung! Sie funktioniert, verwendet jedoch schlechtes GDI + -Design, um dies zu erreichen.)
Fügen Sie ein Bild in Ihre App ein und laden Sie es beim Start. Halten Sie die Taste gedrückt, bis die App beendet wird. Der Benutzer kann keine zweite Instanz starten. (Natürlich ist die Mutex-Lösung viel sauberer)
quelle
Main()
Methode, die gegen die Funktionsweise von WPF verstößt.Von: Sicherstellen einer einzelnen Instanz von .NET Application
und: Single Instance Application Mutex
Gleiche Antwort wie @Smink und @Imjustpondering mit einem Twist:
Jon Skeets FAQ zu C # , um herauszufinden, warum GC.KeepAlive wichtig ist
quelle
Einfach mit a
StreamWriter
, wie wäre es damit?und
quelle
Normalerweise wird dies mit einem benannten Mutex durchgeführt (verwenden Sie einen neuen Mutex ("Ihr App-Name", true) und überprüfen Sie den Rückgabewert), aber es gibt auch einige Support-Klassen in Microsoft.VisualBasic.dll, die dies für Sie tun können .
quelle
Das hat bei mir in reinem C # funktioniert. Der Versuch / Fang ist, wenn möglicherweise ein Prozess in der Liste während Ihrer Schleife beendet wird.
quelle
Berücksichtigen Sie unbedingt die Sicherheit, wenn Sie eine Anwendung auf eine einzelne Instanz beschränken:
Vollständiger Artikel: https://blogs.msdn.microsoft.com/oldnewthing/20060620-13/?p=30813
...
...
Versuchen Sie, eine DACL für Ihren Mutex festzulegen. Gehen Sie dazu wie folgt vor: https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity(v=vs.110).aspx
quelle
Keine dieser Antworten funktionierte für mich, da ich diese brauchte, um unter Linux mit Monodevelop zu arbeiten. Das funktioniert gut für mich:
Nennen Sie diese Methode eine eindeutige ID
quelle