Script dynamisch nachladen

Problemstellung

Vielleicht schon bekanntes Problem: Es lassen Klassen bei EPlan nicht auf verschiedene C#-Dateien aufteilen und EPlan lädt dann einfach munter beim ersten Benutzen der Klasse die passende Datei nach. So bin ich es zumindest schon früher in ANSI C, C#, Java und anderen Sprachen gewohnt. Meist muss man eine gewisse Konvention beim Dateinamen berücksichtigen, aber dann kann man sich munter austoben.

Problemlösung

Dafür kann man das hinten herum mit etwas Selbstmanagement auch hin bekommen, mit RegisterScript und Rückwärts auch mit UnregisterScript. Ich habe mir da noch eine Extramethode gegönnt um nur mit der Angabe des Scripts einfach dieses Still zu laden. Dann wird der Nutzer nicht mit der Meldung behelligt, die beim Laden eines Scriptes kommt. Kann es nicht geladen werden, passiert halt nichts, oder schon aufgebaute Menüs bleiben eben ausgegraut.

using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

public class scriptloader {
  [DeclareAction("loadscript")]
  public void loadscriptsilent(string scriptpath) {
      loadscript(scriptpath);
  }
  public void loadscript(string scriptpath, Boolean silent=true) {
      // Define Params for execute
      ActionCallingContext acc = new ActionCallingContext();
      acc.AddParameter("ScriptFile", scriptpath);
      acc.AddParameter("RegisterAgain", "true");
      acc.AddParameter("ShowDecider", (silent?"false":"true"));

      // Execute Command
      CommandLineInterpreter cli = new CommandLineInterpreter();
      cli.Execute("RegisterScript", acc);
      return;
  }
  [DeclareAction("unloadscript")]
  public void unloadscript(string scriptpath) {
      // Define Params for execute
      ActionCallingContext acc = new ActionCallingContext();
      acc.AddParameter("ScriptFile", scriptpath);

      // Execute Command
      CommandLineInterpreter cli = new CommandLineInterpreter();
      cli.Execute("UnregisterScript", acc);
      return;
  }
}

Wie funktioniert das nun? Die Funktionen werden aufgerufen und bekommen das zu ladende Script mit Pfadangabe übergeben. Das Funktioniert übrigens auch als Funktionsaufruf:

// Im Menü
"loadscript /scriptpath: <pfad zum Script>"
// aus dem Code heraus
new scriptloader().loadscriptsilent("<pfad zum Script>");

Das lässt sich auch schön für dynamisch generierte Menüs nutzen: Jede Funktion hat eine Beschreibung, Tooltips, eine Funktion und eben auch ein Script, welches geladen sein sollte. Dies lässt sich für jede(n) Nutzer(gruppe) spezifisch aufbauen und es lädt eben auch nur die Funktionen, die eben zur Nutzung freigegeben sind.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert