Abgeteilt von mehrere Programminstanzen verhindern?
Hallo,
in meiner Anwendung habe ich den hier beschriebenen Beispiel-Code verwendet, um die Ausführung mehrerer Anwenungsinstanzen zu verhindern. Etwa so:
static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
// Single instance only allowed
bool firstInstance = false;
string mutexName = string.Format("{0} {1}", Application.ProductName, Application.ProductVersion);
Mutex mutex = new Mutex(false, mutexName, out firstInstance);
if (firstInstance)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new WlipperForm();
Application.Run();
}
else
{
MessageBox.Show(string.Format(Localization.INSTANCE_RUNNING, Application.ProductName, Application.ProductVersion), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Exit();
}
}
}
Allerdings funktioniert es bei mir nur, wenn ich die Anwendung mit der DEBUG-Konfiguration kompiliere. Und wenn ich diese mit der RELEASE-Konfiguration kompiliere, funktioniert es nicht und mehrere Instanzen werden zugelassen, wenn ich die Anwendung öfters ausführe. - Weiß vielleicht jemand Rat für mich, was hier falsch läuft?
Danke im Voraus.
MfG
Hallo Anonymous Developer,
da im Namen der Mutex Application.ProductName und Application.ProductVersion verwendet werden, haben Debug- und Release-Version unterschiedliche IDs. Du kannst also die Release-Version parallel starten, während die Debug-Version schon läuft und andersherum. Ich vermute, dass du irrtümlich genau diesem Phänomen aufgesessen bist.
herbivore
Hallo herbivore,
da [...] Application.ProductName und Application.ProductVersion verwendet werden, haben Debug- und Release-Version unterschiedliche IDs.
könntest du bitte genauer erläutern, was du mit unterschiedlichen IDs meinst? Für mich sind ProductName und ProductVersion zwei Assembly Attribute in der AssemblyInfo.cs, wobei ProductName ein String ist und die Version (MSDN) ebenfalls.
Inwiefern ändert sich hier was bei der Build-Konfiguration?
mit freundlichen Grüßen,
Tomot
Projekte: www.gesellschaftsspieler-gesucht.de
Hallo Zusammen
Nimm die Versionsnummer raus... macht doch keinen Sinn... ansonsten wird es möglich sein eine alte parallel zur neuen Version laufen zu lassen.... und das ist vermutlich eher nicht gewollt.
Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo Anonymous Developer,
generell bietet sich auch eine GUID als Bezeichnung für ein Mutex an.
Die ist einzigartig und man erkennt trotzdem sofort, welche Programme bzw. Programmteile bzw. Versionen sich dann ein Mutex teilen.
Hi,
also ich habe mal versucht die Versionsnummer aus dem Mutex-Namen wegzulassen, was aber auch nicht geholfen hat. Die Sache mit dem GUID habe ich noch nicht ausprobiert.
Jedenfalls verwende ich Visual Studio 10 falls das ein Anhaltspunkt sein könnte. Auch habe ich versucht die Zielplattform von .NET 2.0 bis 4.0 zu ändern, um auszuprobieren, ob sich die Anwendung dann anders verhält, was diese jedoch nicht tat.
Es ist nach wie vor so, dass ich das Relese-Kompilat mehrfach ausführen kann, das Debug-Kompilat verweigert jedoch die mehrfache Ausführung.
Ich habe hier drei System auf denen ich das getestet habe (XP, 2003, 7). Eventuell möchte jemand interessiertes das Projekt selbst bei sich kompilieren und sich von dem Problem überzeugen? Das Projekt ist für Jedermann frei zugänglich @ http://sourceforge.net/projects/wlipper/files/Wlipper/Version%203.5.7.5/Wlipper_3575_src.zip/download
MfG
Hallo,
ich hab mir mal deinen Code herunter geladen.
Also, wenn ich deinen Code aus dem ersten Post in ein neues (WinForms)-Projekt einfüge, funktioniert er einwandfrei auch in der Release-Version.
In deinem Projekt funktioniert er auch bei hier auf dem FH-Rechner (VS2010, Win XP) nicht in der Release-Version.
Er funktioniert aber wenn ich nach der if-Abfrage nochmal auf das mutex-Objekt zugreife, z.B. mit mutex.GetType()
Warum ist mir aber auch ein Rätsel, vorallem weil er in einem anderen Projekt einwandfrei funktioniert, ich hab auch versucht soweit die Einstellungen in das Test-Projekt zu übernhemen, erfolglos. In deinem Code läuft das erst wenn ich nochmal auf das mutex-Objekt zugreife.
Der GC ist wohl schuldlos ein GC.KeepAlive(mutex) hilft auch nicht.
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Die Frage gab es schon einmal: mehrere Programminstanzen verhindern funktioniert nur im DebugMode
Lösung also laut Link Mutex reagiert nur im debugmodus :
Beitrag hierher verschoben.
Hallo alle zusammen,
die Lösung mit using (mehrere Programminstanzen verhindern?) gefällt mir sehr gut. Diese habe ich in meinem o.g. Code eingebaut und es funktioniert nun wie es sollte: Der Release-Build lässt sich nur noch ein mal ausführen.
Vielen Dank euch allen für eure Hilfe.
MfG