Einbindung und Auslieferung
Zuletzt geändert: 06.06.2026 13:32

Übersicht

Einbindung in EULANDA und Auslieferung #

Ein Plugin besteht aus drei Teilen: den headless Fachfunktionen, dem GUI-Einstieg und der cnreg-Action, die EULANDA den Aufruf als Menü- oder Kontextpunkt bekannt macht. Dazu kommt die Auslieferung (Modulpfad, Paket).

Headless-Einstieg (Caller-owns-Connection) #

Der öffentliche Einstieg ist parameter-gesteuert und damit headless lauffähig. Die GUI ruft ihn genauso wie ein Batch-Lauf.

function Show-MyPlugin {
  [CmdletBinding()]
  param([Parameter(Mandatory)][string]$Udl, [string]$Language = 'DE', $Task)
  # GUI: Dialog bauen und Fachfunktionen mit -Udl rufen (siehe WebView2-Seite).
}

function Invoke-MyReconciliation {
  [CmdletBinding()]
  param([__ComObject]$Conn, [string]$Udl, [string]$ConnStr)
  # Verbindung nach Caller-owns-Connection: -Conn (bleibt offen) ODER -Udl/-ConnStr
  # (selbst öffnen und am Ende schließen). Reine Fachlogik, keine GUI.
}

So ist jede Funktion einzeln test- und serverbar; die Oberfläche bleibt austauschbarer Komfort.

Die cnreg-Action #

EULANDA findet ein Plugin über einen Eintrag in der SQL-Registry. Beispiel (verallgemeinert aus EulandaXcel), eine Action im Datensatz-Kontext des Artikelstamms:

[\OBJECTS\DATAOBJECTS\Eulanda.Artikel\Actions\esol.Artikel.EulandaXcel]
".package"="esol.EulandaXcel"
".version"="{{Version}}"
"ActionClass"="Extradata"
"CommandText"="Show-EulXcelArticle -Udl $Env:EULANDA_UDLFILENAME"
"Context"=dword:00000002
"ContextMode"="hidden"
"Environment"="import CURRENT"
"IconUrl"=""
"NeedsAction"=dword:00000000
"Requirements"="{{Requirements}}"
"SafeForBatchProcessing"="0"
"Title"="Excel Im- und Export"
"Type"="PowershellPlugin"
"WaitMode"="Completed"

Die Properties #

PropertyBedeutung
TypeMuss wörtlich PowershellPlugin sein.
TitleAnzeigename im Menü.
CommandTextDie PowerShell-Befehlszeile. Kein Import-Module-Präfix nötig (Auto-Import über Requirements). Kontext via Umgebungsvariablen, z.B. -Udl $Env:EULANDA_UDLFILENAME.
ActionClassEinordnung im Menü. Nur Werte aus der festen CNAC_*-Liste (siehe unten). Für das Datensatz-Kontextmenü: Extradata. Freie Pfade wie Extras.Schnittstellen funktionieren nicht.
Contextdword:00000002 = die Action ist sichtbar.
ContextModehidden bei Datensatz-Actions - sonst erscheint sie überall ausgegraut.
RequirementsMehrzeilig, je Zeile MODULE <Name> minimum-version:<Version> (auch die letzte Zeile mit Zeilenumbruch). Der Worker importiert diese Module automatisch.
Environmentimport CURRENT übernimmt die System-Umgebungsvariablen (sonst fehlen PATH, USERPROFILE usw.).
WaitModeCompleted (warten bis fertig), InputIdle (freigeben, sobald der Dialog steht) oder FireAndForget.
PluginModuleNur für EULANDA-Lizenz-Slots. Bei 3rd-Party-Plugins weglassen, sonst Fehler “ungültiger Modulname”.
SafeForBatchProcessing1 = die Action erscheint auch in der Treffer-/Stapel-Aktionsliste.
.package / .versionPaket-Kennung und Version (beim Build als {{Version}} ersetzt).
IconUrlOptionales Icon.

Erlaubte ActionClass-Werte (CNAC_*) #

Die zulässigen Klassen sind in EULANDA fest definiert (EulandaLib/pas/elConsts.pas, CNAC_*). Häufig genutzt:

  • Extradata - Datensatz-Kontextmenü (der Normalfall für ein datensatzbezogenes Werkzeug).
  • Extras, Extras.Misc, Extras.Tools, Extras.Tools.Admin - allgemeine Werkzeuge.
  • Actions, Actions.Current, Actions.Workflow, Actions.All - Vorgangs-/Workflow-Aktionen.
  • Print, View, Edit, New, Help, Developer, Developer.Tools.

Andere als die definierten Werte werden nicht akzeptiert.

Umgebungsvariablen (Kontext aus EULANDA) #

Bei gesetztem Environment="import CURRENT" stehen u.a. bereit:

VariableInhalt
EULANDA_UDLFILENAMEPfad zur UDL-Datei (Datenbankverbindung) - der wichtigste Parameter.
EULANDA_CONNECTIONSTRINGADO-Connection-String.
EULANDA_DOCAktuelles DataObject, z.B. Eulanda.Rechnung.
EULANDA_CURRENT_IDID des angezeigten Datensatzes.
EULANDA_ALIAS, EULANDA_SERVERNAME, EULANDA_DATABASENAMEMandant/Server/DB.

WaitMode und nicht-blockierende Dialoge #

Ein WebView2-Dialog blockiert beim Anzeigen. Damit EULANDA nicht hängt, gibt das Plugin die Anwendung frei, sobald der Dialog steht: bei WaitMode="InputIdle" ruft es kurz vor dem Anzeigen $Task.InputIdle() (das -Task-Objekt wird vom Worker übergeben und an Show-EulWebView2Dialog durchgereicht). Completed eignet sich für kurze, nicht-interaktive Läufe (Exporte), FireAndForget für Hintergrundjobs.

Namenskonvention #

  • Hauspartner (EULANDA): Modul- und Funktionspräfix EulandaX<Name> (z.B. EulandaXcel, EulandaXbanc); Paket-Kennung esol.<Modul>.
  • 3rd-Party: eigener Anbieter-Präfix statt Eulanda, z.B. AcmeXinvoice mit Funktionen Show-AcmeXinvoice..., Paket-Kennung im eigenen Namensraum (acme.AcmeXinvoice). So gibt es keine Namenskollisionen, und der Anbieter bleibt eindeutig erkennbar. (Ein Präfix darf nicht mit einer Ziffer beginnen - der Anbietername ist gemeint, nicht die Zeichenfolge “3rdParty”.)

Modulpfad und Auslieferung #

Wo das Modul liegt #

EULANDA sucht das Modul im PowerShell-Modulpfad, vorrangig im Benutzerprofil (...\Documents\WindowsPowerShell\Modules\<Name>\<Version>\ bzw. unter PowerShell 7 ...\Documents\PowerShell\Modules\...), und nimmt die höchste vorhandene Version. Die Documents-Auflösung respektiert OneDrive-Umleitung.

Automatische Installation (Fallback-Kette) #

Fehlt ein Modul, zieht EULANDA es selbsttätig nach:

  1. ZIP neben der EXE (Offline), z.B. C:\Eulanda\<Modul>.zip.
  2. Online von https://files.eulanda.eu/<modul-kleingeschrieben>/ (version.txt + <modul>.zip).
  3. SQL-Registry-Blob als letzter Rückfall.

Worker und Requirements-Auto-Import #

Der persistente EulandaPluginHost liest die Requirements der Action und importiert die deklarierten Module automatisch (ab EulandaXtools 1.0.97). Deshalb braucht der CommandText keinen Import-Module-Präfix. Module werden einmal je Sitzung geladen, nicht pro Klick.

Paket für die Verteilung (cninst) #

Die Auslieferung erfolgt als esol.<Plugin>.cninst (ein ZIP mit eulanda.xml und der install_builder.cnreg). Das Datei-Handling übernimmt das Modul EulandaPlugin (Invoke-PluginBuild), das ein Builder-Skript im Plugin-Repo aufruft; die Platzhalter {{Version}} und {{Requirements}} in der install_builder.cnreg.template werden dabei gefüllt. Der PluginInstaller importiert die install_builder.cnreg in die SQL-Registry; fehlende Module zieht der Worker beim ersten Aufruf nach.

Pre-Setup für 3rd-Party #

Hostet ein Anbieter nicht über files.eulanda.eu, liefert er das Modul-ZIP entweder neben der EXE aus oder stellt sicher, dass es im Modulpfad liegt (eigenes Setup), und liefert die cnreg-Action mit. Im EULANDA Marketplace (siehe Übersicht) übernimmt EULANDA Hosting, Demo-Auslieferung und Lizenzaktivierung; der Anbieter liefert das saubere cninst-Paket.

Checkliste für ein neues Plugin #

  • Fachfunktionen headless mit -Udl/-ConnStr/-Conn (Caller-owns-Connection), einzeln testbar.
  • GUI-Einstieg Show-... als dünner Aufrufer über Show-EulWebView2Dialog.
  • Dialog nach Hausstil: eul-app mit Topbar (Verlauf/Sprache/About/Theme), Sidebar, Statusleiste; eul-*-Komponenten statt Eigenbau.
  • About-Box über Get-EulModuleAboutInfo; i18n über Get-EulPluginStrings.
  • Externe Links über _help, nie href.
  • cnreg-Action: Type=PowershellPlugin, ActionClass aus CNAC_* (Datensatz: Extradata), Context=dword:00000002, ContextMode=hidden, Environment="import CURRENT", Requirements mehrzeilig; PluginModule bei 3rd-Party weglassen.
  • Auslieferung als cninst (über EulandaPlugin), Modul im Modulpfad oder per Auto-Install.