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