Laden...

Prüfen ob ein IPC-Kanal bereits vorhanden ist

Erstellt von lukasS vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.011 Views
lukasS Themenstarter:in
65 Beiträge seit 2009
vor 11 Jahren
Prüfen ob ein IPC-Kanal bereits vorhanden ist

Hallo,

ich erzeuge in einer Applikation einen IPC-Kanal. Sobald aber eine zweite Instanz von dieser Applikation gestartet wird, kriege ich einen Exception-Meldung mir > Fehlermeldung:

"Fehler beim Erstellen eines IPC-Ports: Zugriff verweigert".

Nun wollte ich auch abfragen ob der Kanal bereits existiert. Leider liefert mir "ChannelServices.GetChannel" in der 2. Instanz kein Ergebnis. Ich kriege dort nur die Kanäle aus der eigenen Instanz.
Was mache ich falsch oder habe ich etwas missverstanden? Ich weiß, dass ein Kanal nur einmal vorkommen kann, aber wie kann ich das abfragen?


         IDictionary properties = new Hashtable();
         properties.Add("name", "MyTestChannel");
         properties.Add("portName", "PortXYZ");

         try
         {
            IpcChannel getChannel = (IpcChannel)ChannelServices.GetChannel("MyTestChannel");//liefert in der 2. Instanz immer null
            if (getChannel == null)
            {
               IpcChannel myChannel = new IpcChannel(properties, null, null); //Exception da Kanal schon existiert
               ChannelServices.RegisterChannel(myChannel, false);
            }
         }
         catch (Exception ex)
         {
            Console.WriteLine(ex.Message);
         }

Danke schon mal!

Lukas

1.696 Beiträge seit 2006
vor 11 Jahren

Hallo,

vielleicht hilft dir das: IPC-Kanal

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

lukasS Themenstarter:in
65 Beiträge seit 2009
vor 11 Jahren

Hallo vbprogger,

danke für die Hilfe, den Beitrag kenne ich schon, hilft mir leider nicht wirklich weiter, da ich keine zeitl. Probleme habe, sondern einfach mit einer 2. Instanz.

Lukas

W
872 Beiträge seit 2005
vor 11 Jahren

Ich vermute mal, dass Du entweder "name" entsprechend MS-Konventionen gross schreiben muss oder dass es ChannelName statt name heisst.
Was gibt Dir denn

myChannel.ChannelName

zurueck? Alternativ kannst Du auch ueber die URI gehen.

3.728 Beiträge seit 2005
vor 11 Jahren
IPC-Kanalnamen

Hallo LukasS,

jede Instanz Deiner Applikation ist ein eigener Windows-Prozess. ChannelServices.GetChannel kann nur Channels über den Namen abrufen, die im aktuellen Prozess existieren. Dein Ansatz, einen Channel, der in Prozess A erzeugt wurde und in dessen Speicherbereich existiert von Prozess B aus abrufen zu wollen, kann nicht funktionieren.

Du kannst das Probelm aber umgehen, indem Du in jeder Instanz Deiner Anwendung einen eindeutigen Kanalnamen verwendest. Häng einfach einen GUID hinter den Namen.

Beispiel:


// Eindeutigen Kanalnamen erzeugen 
string channelName = "MyTestChannel" + Guid.NewGuid().ToString();

IDictionary properties = new Hashtable();
properties.Add("name", channelName);
properties.Add("portName", "PortXYZ");

So kommen sich Deine Anwendungsinstanzen nicht in die Quere.

Gruß

Rainbird

lukasS Themenstarter:in
65 Beiträge seit 2009
vor 11 Jahren

Hallo Rainbird,

wenn Portname gleich ist, erhalte ich die selbe Fehlermeldung, so mit müsste ich den Portnamen für jeden Prozess ändern. Den Kanalnamen eindeutig zu machen hilft hier bei leider nicht.
Problem beim Ändern des Portnamens ist, dass eine ganz andere Applikation den Namen nicht kennt.
Werde das wohl weiter mit Try-Catch abfangen müssen.

Trotzdem Danke!

Lukas