Client-Server Remoting: Unbekannten Code einspielen



  • Hallo.

    Ich habe eine Client-Server-Anwendung programmiert. Es gibt eine Server-
    und eine Client-Anwendung. Die Server-Anwendung laeuft als Windows-Service.
    Der Client kommuniziert mit dem Server per System.Runtime.Remoting und
    kann dann Befehle an diesen senden, z. B. permanent laufende Tasks aufsetzen,
    die unterschiedliche Aufgaben durchfuehren.

    Dabei stosse ich auf folgendes Problem: sobald sich der Code eines solchen Tasks
    aendert, muss die Server-Anwendung geupdatet werden (alten Service deinstallieren,
    neuen Service installieren).

    Da aber auf einem alten Service viele andere Tasks laufen und nicht unterbrochen
    werden duerfen, ist das Updaten des Serivce problematisch.

    Also habe ich versucht, nach einer Moeglichkeit zu finden, Tasks vom Client aus auf
    der Server-/Service-Anwendung zu installieren, ohne dass der Code der Tasks dem Service
    bekannt sein soll. Denn dann muesste ich den Service selbst nicht immer mit updaten,
    wenn sich ein Task in seinem Code veraendern sollte.

    Das hat leider so bisher nicht vollstaendig funktioniert. Ich bin bei meiner Suche auf
    die Erkenntnis gestossen, dass die Server-Anwendung keinen Code ausfuehren kann, solange
    ihr der Code nicht selbst bekannt ist (z.B. durch eine Referenz auf eine DLL "Tasks.dll").

    Es gibt aber eine limitierte Moeglichkeit, es zu bewerkstelligen: AppDomains zu benutzen.
    In einer Anwendung kann Code in eine separat erstellte AppDomain geladen, ausgefuehrt und
    spaeter wieder entladen werden. Das funktioniert folgendermassen:

    AppDomain hat eine Methode 'CreateInstance'. Sie erstellt Objekte in einer separaten
    AppDomain. Man uebergibt der Methode die Typinformationen ueber das zu erstellende Objekt.
    Zusaetzlich kann man der Methode noch eine DLL in Form von byte[] uebergeben, falls sich
    dort das zu erstellende Objekt befindet. Und genau so habe ich es gemacht:
    Der Service-Anwendung die Typinformationen und die 'TaskXYZ.dll' als byte[] uebergeben.
    So konnte ich einen speziellen Task bei dem Server mittels AppDomain registrieren,
    ausfuehren lassen und wieder unregistrieren, falls ein Update vorlag, ohne andere auf dem
    Service laufende Tasks zu beeintraechtigen.

    Diese Methode bringt aber viele Unannehmlichkeiten mit sich. Deswegen frage ich mich: Habe
    ich damals bei meiner Suche nach der Moeglichkeit, Code in der Server-Anwendung ausfuehren
    zu lassen, ohne dass diese dem Server bekannt ist, etwas uebersehen? Gibt es eine elegantere
    Moeglichkeit, dieses Problem zu loesen? Kann der Service wirklich keinen unbekannten Code
    ausfuheren? (Mein Plan war es, Task-Code in der Client-Anwendung zu definieren und ihn dann
    per Remoting vom Client an den Server zu schicken, sodass er dort ausgefuehrt wird.)

    Ich sehe noch eine weitere Moeglichkeit, diese AUfgabe zu bewerkstelligen: Per Scripting.
    Tasks in Form von Scripts koennten auf dem Server ausgefuehrt werden. Wenn ein Update vorliegt,
    wird nur das Script geaendert. Bei meiner Suche danach bin ich jedoch
    nur auf "CS-Script" gestossen, dass ich jedoch nicht benutzen kann/darf, da es sich bei
    meiner Client-Server Anwendung um gewerbliche Software handelt (CS-Script ist leider kein
    Teil von Microsoft).

    Weiss jemand vielleicht, wie ich das Problem mit dem unbekannten Code loesen kann? Ich bin
    fuer jede Idee dankbar.



  • Machs es doch mit Plugins. Jeder Task hat ein Plugin. Fehler bedeutet nur ausrauschen des Plugins.



  • Unix-Tom schrieb:

    Machs es doch mit Plugins. Jeder Task hat ein Plugin. Fehler bedeutet nur ausrauschen des Plugins.

    Hmm, ja das koennte bestimmt klappen. Ich probiers aus.

    Danke!


Anmelden zum Antworten