PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET Url Handler und and laufendes Programm schicken


PatkIllA
2010-08-13, 17:57:00
Ich möchte ähnlich eines Browser meine .NET Anwendung per Links "steuern können". Den Handler für das protokoll zu installieren ist ja noch ganz einfach, aber wie kriegt man die Nachricht am besten zu einer evtl schon laufenden Anwendung? Idealerweise sollte man festellen sollen, ob ein bestimmtes Projekt geladen ist.

Monger
2010-08-13, 20:47:22
Sorry, ich verstehs noch nicht ganz: willst du dein Programm so im Browser registrieren, dass bestimmte Links zu deiner Applikation geroutet werden?

Edit: und wenn ja, könntest du mir sagen wie genau du das mit .NET gemacht hast? Würde mich nämlich auch interessieren! :ugly:

PatkIllA
2010-08-13, 20:51:20
ja genau. Der Teil ist ganz einfach. Da muss man sich nur in der registry registrieren und dann wird eine exe mit dem link gestartet.
Jetzt kann es aber sein, dass die Anwendung schon läuft und dann will ich der schon laufenden den Link übergeben. Es kann auch sein, dass die Anwendung mehrfach läuft und dann muss ich der "richtigen" Instanz schicken.

Gnafoo
2010-08-13, 23:19:43
D. h. der Anwendung wird der Link als Argument übergeben?

Das ist dann doch eigentlich ganz normales IPC, z. B. über Named Pipes (entweder über die Named-Pipe-Klassen (http://msdn.microsoft.com/en-us/library/system.io.pipes.aspx) ab .NET 3.5 oder über WCF, aber das ist evtl. Overkill). Die neue Instanz versucht zur alten zu Verbinden und den Link zu übergeben und beendet sich wieder. Evtl. auch mit einem getrennten Handler-Programm. Aber du könntest auch folgendes probieren:

http://stackoverflow.com/questions/424368/opening-a-known-file-type-into-running-instance-of-custom-app-net

Die erste Antwort hat eine schöne Lösung parat (auch wenn Microsoft.VisualBasic z. B. in C# evtl. etwas komisch anmutet, aber es gehört zum Standard-Framework, also was solls).

Edit: wenn ich es recht in Erinnerung habe konnte man einen benannten System-Mutex verwenden um schnell rauszubekommen ob schon eine Instanz der Anwendung läuft (für die IPC-Variante).

PatkIllA
2010-08-13, 23:28:30
Bei WPF gibt es das nicht mehr. Die Anwendung hat auch mehrere gleichberechtigte Fenster.

Gnafoo
2010-08-13, 23:49:55
Hm Google sagt, dass sich das auch mit WPF kombinieren lässt. Ob das jetzt besonders schön ist, musst du selber entscheiden ^^. Vermutlich ist es aber relativ schnell mal implementiert auf die Weise.

http://www.switchonthecode.com/tutorials/wpf-writing-a-single-instance-application

Eventuell hat ja auch noch jemand anderes eine gute Idee.

][immy
2010-08-14, 00:08:40
ich hab zwar jetzt immernoch nicht ganz verstanden was du machen willst, aber bei interprozesskommunikation bleiben dir nicht all zu viele wege.
neben dem schon erwähnten mit named pipes, wäre noch die kommunikation über tcp möglich. dann wäre es auch möglich das die anwendung auf einem anderen server läuft (falls dies überhaupt gewünscht ist). hier wäre es dann natürlich gut, wenn du eine komponente hättest die anwendungs-anmeldungen entgegen nimmt, so das die requests von hier aus weitergerouted werden können.

Monger
2010-08-14, 10:00:31
Ich kanns grad nicht nachstellen... aber erst einmal: deine Application läuft ja als Singleton, d.h. es kann immer nur eine Instanz gleichzeitig laufen, richtig?

Weil an welches von mehreren sollte denn der URL Aufruf geroutet werden? An alle!? Normalerweise wenn du auf einen Link klickst, wird dieser an eine neue Programminstanz geroutet (z.B. an Word, was sich daraufhin öffnet), und nicht an bestehende.

Du müsstest also erstmal ein Single Instance Konzept für WPF implementieren (siehe hier (http://www.switchonthecode.com/tutorials/wpf-writing-a-single-instance-application)), und dann hast du natürlich auch Zugriff auf die Programm Instanz, und kannst sie entsprechend manipulieren - ganz ohne Interprozess Kommunikation.

PatkIllA
2010-08-14, 10:05:27
Die Application kann auch mehrfach laufen.
Welche die richtige ist ergibt sich aus dem Link, notfalls könnte es auch an alle gehen und die anderen ignorieren das.
Die IPC würde sich als auf das austauschen einiger strings beschränken.

Monger
2010-08-14, 10:13:09
Wenn du wirklich getrennte Prozesse hast, brauchst du einen Proxy. Dann registrierst du eben deinen Link Handler nicht an deiner Applikation, sondern geschickterweise an einem Service, der dann per WCF o.ä. entsprechende Aufrufe in der jeweiligen Programminstanz macht.

PatkIllA
2010-08-14, 10:15:06
an einen Service?
Das muss doch eine Exe sein.

Monger
2010-08-14, 10:46:20
Kannst natürlich auch gegen eine normale Exe laufen lassen. So rein von der Funktion her ist es halt im Prinzip ein Service.

PatkIllA
2010-08-15, 17:17:36
Ich hab jetzt mit WCF einen Service gebaut, der ein Named Pipe benutzt und sich allgeim zum steuern des Programms benutzen lässt.
Das lässt sich dann ja mit wenigen Zeilen machen.