[Nachfolgend habe ich Beispielcode für Konsolen- und WPF-Anwendungen bereitgestellt.]
Sie müssen nur den Wert des Parameters createdNew
Variable (Beispiel unten!), nachdem Sie die benannte Mutex-Instanz erstellt haben.
Der boolesche createdNew
wird zurückgegeben falsch:
wenn die Mutex-Instanz mit dem Namen "YourApplicationNameHere" bereits irgendwo auf dem System erstellt wurde
Der boolesche createdNew
wird zurückgegeben wahr:
wenn dies der erste Mutex mit dem Namen "YourApplicationNameHere" auf dem System ist System ist.
Konsolenanwendung - Beispiel:
static Mutex m = null;
static void Main(string[] args)
{
const string mutexName = "YourApplicationNameHere";
bool createdNew = false;
try
{
// Initializes a new instance of the Mutex class with a Boolean value that indicates
// whether the calling thread should have initial ownership of the mutex, a string that is the name of the mutex,
// and a Boolean value that, when the method returns, indicates whether the calling thread was granted initial ownership of the mutex.
using (m = new Mutex(true, mutexName, out createdNew))
{
if (!createdNew)
{
Console.WriteLine("instance is alreday running... shutting down !!!");
Console.Read();
return; // Exit the application
}
// Run your windows forms app here
Console.WriteLine("Single instance app is running!");
Console.ReadLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
WPF-Beispiel:
public partial class App : Application
{
static Mutex m = null;
protected override void OnStartup(StartupEventArgs e)
{
const string mutexName = "YourApplicationNameHere";
bool createdNew = false;
try
{
// Initializes a new instance of the Mutex class with a Boolean value that indicates
// whether the calling thread should have initial ownership of the mutex, a string that is the name of the mutex,
// and a Boolean value that, when the method returns, indicates whether the calling thread was granted initial ownership of the mutex.
m = new Mutex(true, mutexName, out createdNew);
if (!createdNew)
{
Current.Shutdown(); // Exit the application
}
}
catch (Exception)
{
throw;
}
base.OnStartup(e);
}
protected override void OnExit(ExitEventArgs e)
{
if (m != null)
{
m.Dispose();
}
base.OnExit(e);
}
}
17 Stimmen
Gibt die CLR nicht automatisch alle nicht freigegebenen Mutexe frei, wenn die Anwendung ohnehin beendet wird?
2 Stimmen
@Cocowalla: Der Finalisierer sollte die nicht verwalteten Mutexe entsorgen, es sei denn, er kann nicht wissen, ob die Mutex von der verwalteten Anwendung erstellt oder an eine bestehende angehängt wurde.
1 Stimmen
Es ist sinnvoll, nur eine Instanz Ihrer Anwendung zu haben. Aber die Übergabe von Argumenten an eine bereits existierende Anwendung erscheint mir ein wenig albern. Ich kann keinen Grund dafür sehen, dies zu tun. Wenn Sie eine Anwendung mit einer Dateierweiterung verknüpfen, sollten Sie so viele Anwendungen öffnen, wie Benutzer Dokumente öffnen wollen. Das ist das Standardverhalten, das jeder Benutzer erwarten würde.
1 Stimmen
Ich möchte nur eine Korrektur meiner vorherigen Aussage vornehmen. Die Übergabe von Argumenten an eine bestehende Anwendung bedeutet, dass Sie eine MDI (Multi-Document-Interface) durchführen wollen. Ich dachte, dass MDI war eine Art, die Microsoft war drängen aus (Word und Excel sind jetzt SDI). Aber ich habe festgestellt, dass Chrome und IE beide MDI sind. Vielleicht sind wir in Jahren, in denen MDI zurück ist? (Aber ich bevorzuge immer noch SDI gegenüber MDI)
13 Stimmen
@Cocowalla Die CLR verwaltet keine nativen Ressourcen. Wenn ein Prozess jedoch beendet wird, werden alle Handles vom System (dem Betriebssystem, nicht der CLR) freigegeben.
2 Stimmen
Ich bevorzuge die Antwort von @huseyint. Sie verwendet die Microsoft-eigene Klasse 'SingleInstance.cs', so dass man sich keine Gedanken über Mutexe und IntPtrs machen muss. Außerdem besteht keine Abhängigkeit von VisualBasic (igitt). Siehe codereview.stackexchange.com/questions/20871/ für mehr...
1 Stimmen
Ich verwende SingleInstanceApp nuget. nuget.org/packages/SingleInstanceApp Funktioniert perfekt. Benötigt keine Microsoft.VisualBasic-Referenz. Hängt nicht von der App-Version ab (in Microsoft.VisualBasic schon). Die App wird nur durch eine eindeutige Zeichenfolge identifiziert.
0 Stimmen
Es sieht so aus, als ob diese Frage und die Antworten eine Fülle von Informationen enthalten - eine wahre Goldgrube!