Mehrere Instanzen eines Programms erkennen



  • Hallo zusammen,

    ich möchte mehrere Instanzen eines Programms erkennen können.
    Mehrere Instanzen müssen erlaubt sein - allerdings nur dann, wenn sie unter verschiedenen Benutzern laufen.

    Zunächst muss also erkannt werden, ob Instanzen eines Programms laufen.
    Nur wie macht man das am Besten(bzw. sichersten)?

    Eine Idee war alle Prozesse aufzulisten und dann die "Titel" zu durchsuchen. Ich frage mich aber, ob es da nicht zu unerwünschten Ausnahmefällen/Fehlern kommt.

    Hat jemand eine bessere Idee?

    Kann man den Zusammenhang zwischen Dateipfad einer Anwendung und PID feststellen?

    Danke und Gruß



  • Mit einem Mutex kriegt man sowas hin.

    using System;
    using System.Threading;
    
    namespace InstanceCount
    {
        class Program
        {
            static void Main(string[] args)
            {
                string uniqueUserName;
                uniqueUserName = Console.ReadLine();
    
                using (Mutex mutex = new Mutex(false, uniqueUserName))
                {
                    if (!mutex.WaitOne(0, false))
                    {
                        Console.WriteLine("Eine Programminstanz für Benutzer {0} läuft bereits. Programm wird beendet", uniqueUserName);
                        Console.ReadKey(true);
                        return;
                    }
    
                    StartProgram(uniqueUserName);
                }
    
            }
    
            private static void StartProgram(string uniqueUserName)
            {
                Console.WriteLine("Programminstanz für Benutzer {0} wird nun ausgeführt", uniqueUserName);
                Console.ReadKey(true);
            }
        }
    }
    

    Der string uniqueUserName wird als Name des benannten Mutex verwendet. Somit kann ein Benutzer nur einmal das Programm starten wobei es insgesamt aber beliebig viele Instanzen geben kann.
    Woher diese Benutzer-IDs kommen liegt bei Dir. Achte nur darauf, dass sie systemweit eindeutig sind und nicht mit Mutexen anderer Programme kollidieren (z.B. mit einer fest einkodierten GUID die immer an den Username angehängt wird)


Anmelden zum Antworten