Laden...

mehrere Programminstanzen verhindern funktioniert nur im DEBUG-Modus

Erstellt von Anonymous Developer vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.590 Views
Hinweis von herbivore vor 13 Jahren

Abgeteilt von mehrere Programminstanzen verhindern?

A
Anonymous Developer Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren
mehrere Programminstanzen verhindern funktioniert nur im DEBUG-Modus

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

49.485 Beiträge seit 2005
vor 13 Jahren

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

691 Beiträge seit 2007
vor 13 Jahren

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

4.221 Beiträge seit 2005
vor 13 Jahren

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...

5.742 Beiträge seit 2007
vor 13 Jahren

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.

A
Anonymous Developer Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

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

309 Beiträge seit 2008
vor 13 Jahren

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));}}

A
Anonymous Developer Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren
Hinweis von herbivore vor 13 Jahren

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