Color scheme: Dark
You are here: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Bootstrapper » Referenz » Der Installer des Bootstrappers 2.0

Der Installer des Bootstrappers 2.0

Ab 2.0 installiert der Starter eine Anwendung für den Windows-Benutzer so, wie Windows Installer ein Paket je Benutzer installiert: aus einer Beschreibung ihrer Bestandteile, als eine Transaktion, die bei einem Fehler zurückgerollt wird, und mit jedem gemeinsam genutzten Teil gezählt – damit Update, Rückkehr zu einer früheren Version, Reparatur und Deinstallation genau den Zustand hinterlassen, den sie versprechen. Nichts davon braucht Administratorrechte.

Wann 2.0 installiert und wann 1.0 läuft

AuslieferungWeg
Eine Projektdatei im Format 2 (ein beliebiges Programm oder eine beliebige Datei; siehe Die Projektdatei)Installer von 2.0, allgemeines Projekt
Der Komponentenordner der Auslieferung enthält registration.json neben der DLL (Release-Pakete der WKL Forms Object Library ab 1.57), oder die Auslieferung bringt keine Komponenten mit (components leer)Installer von 2.0 (diese Seite)
Komponenten ohne registration.json ausgeliefert (Pakete bis 1.56.1)Wie 1.0

registration.json ist die Registrierung der DLL je Benutzer als Daten, geschrieben beim Bau des Pakets (tools\Export-Registration.ps1 der WKL Forms Object Library). Der Starter schreibt diese Schlüssel selbst, statt regsvr32 auszuführen; Windows Installer rät von der Selbstregistrierung ab, weil sie sich nicht zuverlässig zurückrollen lässt und verbirgt, was sie schreibt.

Was installiert wird und wo es verzeichnet ist

Jeder Teil einer installierten Version ist eine Komponente mit einem Schlüsselpfad; die Komponente gilt als installiert, wenn ihr Schlüsselpfad existiert. Jede Produktversion, die eine Komponente verwendet, ist einer ihrer Clients – das ist der Referenzzähler.

Komponente (ID)WasSchlüsselpfad
frontend/<product>/<version>Die Kopie der Anwendung in %LOCALAPPDATA%\WKL\<product>\Frontends\<version>, der ganze Ordner (auch Dateien, die Access oder die Anwendung dort hinterlassen), und die INI-Datei von iniDie Datenbankdatei
components/<release>/<bitness>Die WKL-Komponenten eines Release und einer Bitbreite in %LOCALAPPDATA%\WKL\Components\<release>\<bitness> und ihre Registrierung unter HKCU\Software\Classes (32-Bit-Ansicht für x86)Die DLL
odbc/<driver>/<release>/<bitness>Ein ODBC-Treiber, den die Auslieferung mitbringt, in %LOCALAPPDATA%\WKL\Drivers\<driver>\<release>\<bitness>, und seine Datenquelle für den Benutzer (siehe ODBC-Treiber)Die Treiber-DLL
trust/<product>Der vertrauenswürdige Speicherort WKL.<product> (siehe Was der Starter schreibt und meldet)Der Schlüssel
apps-entry/<product>Der Eintrag unter Windows-Einstellungen › Apps: HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\WKL.<product> mit DisplayName, DisplayVersion, Publisher, UninstallString ("<starter>" /uninstall), QuietUninstallString, DisplayIcon, InstallDate, NoModify, NoRepairDer Schlüssel

Verzeichnet wird alles in der Installer-Datenbank des Benutzers, %LOCALAPPDATA%\WKL\Installer\installer.db (SQLite, die Kopie von SQLite, die Windows mitbringt; eine Datenbank für alle Produkte des Benutzers). Ihre Tabellen:

TabelleInhalt
ProductProduktschlüssel, Anzeigename, Quelle
ProductVersionInstallierte Versionen, State (installed/removed), LastWorking (die zuletzt gestartete Version)
ComponentID, Art, Release, Bitbreite, Schlüsselpfad
ComponentClientWelche Produktversion welche Komponente verwendet
ResourceJede Datei, jeder Ordner, jeder Schlüssel und jeder Wert der Registrierungsdatenbank einer Komponente, mit Ownership: created (vom Starter angelegt; mit dem letzten Client entfernt) oder found (war vorher schon da; nie entfernt, auf Previous zurückgesetzt)
Txn, TxnStepDas Journal: jeder Vorgang, jeder Schritt mit seinen Angaben zum Rückgängigmachen

So prüfen Sie das von außen.

  • Wkl.Bootstrapper.exe /list gibt jede installierte Version und jede Komponente mit der Zahl ihrer Verwender aus; eine Komponente, deren Schlüsselpfad fehlt, ist mit MISSING (repair: /repair) markiert. /list /json gibt dasselbe als JSON aus (siehe Befehle und Exitcodes).
  • Die Datenbank lässt sich mit jedem SQLite-Werkzeug lesen, zum Beispiel SELECT * FROM ComponentClient. Nur lesen: Der Starter ist der einzige, der hineinschreibt.
  • Das Protokoll des Produkts (Logs\bootstrapper.log) hat eine Zeile je Schritt: Datum und Uhrzeit mit Millisekunden, die Prozess-ID, der Schritt auf 12 Zeichen aufgefüllt, dann der Text. Je Installation schreibt es eine Zeile mit dem Schritt install: für eine Auslieferung im Format 1 install <version> <copy>, gefolgt von components <release>, wenn Komponenten registriert wurden; für ein Projekt im Format 2 install <product> <version>: <n> entries, <n> registry keys. Eine Auslieferung, die eine vorhandene Registrierung verwendet, schreibt stattdessen components using the existing registration ....

Installieren und aktualisieren

Ein Start mit einer neuen Version (oder der erste Start) führt diese Schritte als eine Transaktion aus:

  1. Eine unterbrochene frühere Transaktion wird zuerst zurückgerollt (der PC wurde ausgeschaltet, der Prozess beendet).
  2. Beim ersten Kontakt mit dem Produkt wird übernommen, was der Starter 1.0 installiert hat (siehe unten).
  3. Die Version wird verzeichnet.
  4. Die Kopie wird abgelegt – sofern sie nicht existiert: kopiert, gegen Größe und SHA-256 aus app-manifest.json geprüft (Code 42 bei Abweichung), die Markierung „aus dem Internet“ entfernt; die INI-Datei geschrieben.
  5. Die Komponenten: Eine vorhandene Registrierung, die nicht vom Starter stammt (die der IT für den Computer, HKLM, oder die eigene des Release-Pakets für den Benutzer) und auf eine vorhandene DLL eines Release zeigt, das mindestens so hoch ist, wie die Anwendung verlangt (requires aus app-manifest.json), wird unverändert verwendet – erneutes Registrieren würde sie verdoppeln, und COM würde die Registrierung des Benutzers einer neueren des Computers vorziehen. Andernfalls entscheidet die Release-Regel; ein zu registrierender Release-Ordner wird kopiert (nur fehlende Dateien; eine verwendete DLL wird nie ersetzt) und die Registrierung aus registration.json geschrieben.
  6. Die ODBC-Treiber der Auslieferung, jeder mit seiner Datenquelle (siehe ODBC-Treiber).
  7. Der vertrauenswürdige Speicherort und der Eintrag unter „Apps“ werden geschrieben oder aktualisiert (DisplayVersion).
  8. Die Transaktion wird abgeschlossen.

Danach werden in einer eigenen Transaktion die Versionen über keepVersions hinaus entfernt (nie die Version, die gerade gestartet wird, und nie die zuletzt funktionierende), und dann startet Access. Eine erfolgreich gestartete Version wird zur zuletzt funktionierenden.

Bei einem Fehler wird jeder bis dahin ausgeführte Schritt in umgekehrter Reihenfolge rückgängig gemacht, der PC ist wie vor dem Start, und das Fenster meldet den Code:

CodeUrsache
11registration.json ist keine Registrierungstabelle
32Das ausgelieferte Release ist älter, als die Anwendung braucht (und es gibt keine ausreichende Registrierung)
41Eine Datei konnte nicht kopiert, verschoben oder entfernt werden; hält ein anderes Programm sie fest, nennt die Meldung es (zum Beispiel einen Virenscanner)
42Die Kopie stimmt nicht mit dem Manifest überein
50Eine Richtlinie verbietet vertrauenswürdige Speicherorte des Benutzers

Dateischritte warten kurz und versuchen es erneut, solange ein anderes Programm (ein Virenscanner, die Indizierung) eine Datei festhält.

Beispiel: Die IT hat die Komponenten für den Computer registriert. Die WKL Forms Object Library 1.56 ist unter HKLM registriert, mit der DLL in C:\Program Files (x86)\WKL\Access Components; die Anwendung verlangt 1.51, und die Auslieferung bringt 1.56.1 mit. Der Starter registriert nichts, kopiert keine Komponenten und verzeichnet keine Komponente components/...; das Protokoll enthält die Zeile components using the existing registration 1.56 for the computer: C:\Program Files (x86)\WKL\Access Components\Wkl.Access.Components.dll. Wäre die Registrierung für den Computer 1.48, würde das ausgelieferte 1.56.1 für den Benutzer registriert, und die Registrierung des Benutzers hätte von da an Vorrang vor der des Computers.

Welches Release registriert wird

Je Benutzer und Bitbreite ist jeweils ein Release der WKL Forms Object Library registriert: Die Klassenschlüssel sind in jedem Release dieselben, daher entscheidet die letzte Registrierung für jede Anwendung des Benutzers. Jede Produktversion verzeichnet das Release, das ihre Anwendung verlangt (requires in app-manifest.json). Der Starter registriert das ausgelieferte Release, sofern er damit keinem anderen Produkt ein Release wegnimmt:

Ausgeliefertes ReleaseRegistriertes Release (vom Starter)Ergebnis
Niedriger, als die Anwendung verlangtBeliebigCode 32; nichts ändert sich
Mindestens das, was die Anwendung verlangtKeines oder niedriger, als die Anwendung verlangtDas ausgelieferte Release wird registriert
Höher als das registrierte ReleaseMindestens das, was die Anwendung verlangtDas ausgelieferte Release wird registriert
Dasselbe wie das registrierte ReleaseDasselbeNichts ändert sich; die Produktversion wird ein weiterer Client
Niedriger als das registrierte ReleaseMindestens das, was die Anwendung verlangtDas ausgelieferte Release wird registriert, wenn keine installierte Version eines anderen Produkts mehr verlangt; andernfalls bleibt das registrierte Release, und die Produktversion wird ein weiterer Client davon

Nur andere Produkte zählen. Versionen desselben Produkts, die neben der gestarteten aufbewahrt werden (keepVersions), zählen nicht: Die Rückkehr zu einer früheren Version innerhalb eines Produkts registriert das Release, mit dem diese Version ausgeliefert wurde, und der Schritt nach vorn registriert wieder das neuere. Beispiel: Produkt A 1.4.0 verlangt 1.56 und wurde mit 1.56.1 ausgeliefert, A 1.5.0 verlangt 1.57 und wurde mit 1.57.0 ausgeliefert.

StartDanach registriert
A 1.5.01.57.0
A 1.4.0 (Rückkehr), kein anderes Produkt installiert1.56.1
A 1.5.0 erneut1.57.0
A 1.4.0, während Produkt B 1.0.0 installiert ist, das 1.57 verlangt1.57.0 bleibt

Zwei Produkte mit verschiedenen Releases laufen deshalb beide auf dem höheren: Ein laufendes Access behält die DLL, die es geladen hat, wenn sich die Registrierung ändert, und danach gestartete Access-Prozesse laden das neu registrierte Release.

Das Release einer Auslieferung ist das release ihrer registration.json, das Export-Registration.ps1 aus der Produktversion von Wkl.Forms.ObjectLibrary.Managed.dll übernimmt (bis Release 1.68: Wkl.Access.Components.Managed.dll; zum Beispiel 1.56.1). Die Versionsressource des nativen Startmoduls (Wkl.Forms.ObjectLibrary.dll, bis 1.68 Wkl.Access.Components.dll) trägt nur Haupt- und Nebenversion (1.56.0 in 1.56.1) und wird nicht verwendet; der Starter 1.0 hat sie verwendet, daher können seine Ordner unterhalb von Components diese Nummer tragen.

ODBC-Treiber

Eine Auslieferung kann ODBC-Treiber für den Benutzer mitbringen, sodass kein Administrator sie installieren muss. Jeder Treiber liegt in der Auslieferung als odbc\<driver>\x86 und odbc\<driver>\x64 und wird in bootstrapper.json genannt:

{
  "format": 1,
  "product": "Kunden",
  "source": "\\\\server\\apps\\kunden\\production",
  "components": "components",
  "odbcDataSources": [ "WklGateway" ],
  "odbc": [
    { "driver": "Wkl OData", "folder": "odbc\\Wkl OData", "dll": "Wkl.Data.OData.Odbc.dll", "dataSource": "WklGateway" }
  ]
}
FeldBedeutung
driverDer Name des Treibers; zugleich der Ordner unterhalb von %LOCALAPPDATA%\WKL\Drivers und der Wert unter ODBC Data Sources
folderDer Ordner des Treibers in der Auslieferung, relativ zu source; der Starter nimmt den Unterordner der Bitbreite von Access
dllDie Treiber-DLL in diesem Unterordner
dataSourceDie Benutzerdatenquelle, über die sich die Anwendung verbindet

Der Starter kopiert den Unterordner nach %LOCALAPPDATA%\WKL\Drivers\<driver>\<release>\<bitness>, wobei <release> die Produktversion der DLL ohne Build-Kennung ist, und schreibt die Datenquelle für den Benutzer (32-Bit-Ansicht der Registrierungsdatenbank für x86):

SchlüsselWertDaten
HKCU\Software\ODBC\ODBC.INI\<dataSource>DriverDer vollständige Pfad der kopierten DLL
Description<driver> (Wkl.Bootstrapper)
HKCU\Software\ODBC\ODBC.INI\ODBC Data Sources<dataSource><driver>

Ein Eintrag unter ODBCINST.INI wird nicht geschrieben; Access öffnet verknüpfte Tabellen und Pass-Through-Abfragen über eine Datenquelle, deren Driver der Pfad der DLL ist. Alles andere – die Adresse des Dienstes, die Datenbank – gehört in die Verbindungszeichenfolge der Verknüpfungen der Anwendung, nicht in die Datenquelle. Eine in odbc genannte Datenquelle muss vor dem Start nicht existieren, anders als die übrigen Einträge von odbcDataSources.

Der Treiber ist eine gezählte Komponente wie die WKL-Komponenten: Ein später ausgeliefertes neueres Release wird neben das alte gelegt, und die Datenquelle zeigt darauf; eine Deinstallation entfernt den Release-Ordner und die Datenquelle mit der letzten Produktversion, die sie verwendet. Eine Datenquelle dieses Namens, die schon existierte, bevor der Starter sie schrieb, wird auf ihre vorherigen Werte zurückgesetzt.

Anders als für die WKL-Komponenten gilt für die Datenquelle keine Release-Regel: Jeder Start schreibt sie für die gestartete Version. Die Rückkehr zu einer Version, die mit einem älteren Treiber-Release ausgeliefert wurde, lässt die Datenquelle wieder auf dieses ältere Release zeigen. Liefern zwei Produkte dieselbe dataSource mit verschiedenen Treiber-Releases aus, entscheidet das zuletzt gestartete Produkt; es wird kein Code gemeldet, und beide Release-Ordner bleiben, solange eine Version sie verwendet. Geben Sie jedem Produkt eine eigene dataSource, wenn sie sich kein Treiber-Release teilen dürfen.

Rückkehr zu einer früheren Version

Der Start einer älteren Version – eine Quelle, die wieder eine niedrigere Version ausliefert – installiert diese Version erneut: ihre Kopie (falls noch vorhanden), ihre Treiber (die Datenquelle zeigt wieder auf das ältere Treiber-Release) und ihr Komponenten-Release nach der Release-Regel. Neuere Versionen bleiben, bis keepVersions oder die Deinstallation sie entfernt, sodass der Benutzer wieder nach vorn wechseln kann.

Mit deliveryKey in der Projektdatei liefert eine Quelle eine niedrigere Version nur aus, wenn der Herausgeber die höhere in der signierten Auslieferung zurückgezogen hat (/publish /withdraw); sonst behält der Starter die installierte Version und meldet Code 52. Siehe Signierte Auslieferung veröffentlichen.

Zurück, während die Quelle bereits eine neuere Version ausliefert, geht es über das Einstellungsfenster (Wkl.Bootstrapper.exe /settings). Seine drei Aktionen arbeiten über den Installer, jede als eine Transaktion mit ihrem Rollback:

AktionWas sie tut
Diese Version startenRegistriert erneut, worauf die gewählte Version lief: ihr Release der WKL-Komponenten (aus dem installierten Release-Ordner, nach der Release-Regel) und ihre Datenquellen. Dann startet sie Access mit der Kopie dieser Version und markiert sie als zuletzt funktionierende Version, die das Aufräumen behält. Aus der Quelle wird nichts kopiert.
Neu kopierenEntfernt die gewählte Version mit jeder Komponente, die nur sie verwendet hat. Der nächste Start installiert die Version, die die Quelle ausliefert, erneut. Wird sofort abgelehnt, solange Access die Kopie geöffnet hat.
Alte Versionen entfernenEntfernt die Versionen über keepVersions hinaus, wie es ein Start tut. Die Version, die die Quelle ausliefert, und die zuletzt funktionierende Version entfernt sie nie.

Diese Version starten bringt das Komponenten-Release zurück, das die Version verwendet hat, nicht das, das ihre Auslieferung enthielt. Eine Version, die auf einem neueren Release blieb, weil ein anderes Produkt es brauchte, bleibt auf diesem neueren Release.

Ein Produkt, das nur der Bootstrapper 1.0 abgelegt hat, behält für seine Ordner die Aktionen von 1.0, bis sein nächster Start es übernimmt.

Reparieren

Wkl.Bootstrapper.exe /repair führt die Installation der aktuellen Version aus, ohne Access zu starten: Was fehlt, wird aus der Auslieferung wiederhergestellt – die Kopie, falls gelöscht, Dateien der Komponenten, gelöschte oder geänderte Werte in der Registrierungsdatenbank, der vertrauenswürdige Speicherort, der Eintrag unter „Apps“. Was vorhanden ist, bleibt unberührt; eine vorhandene Kopie behält die Daten des Benutzers.

Deinstallieren

Wkl.Bootstrapper.exe /uninstall (auch der Befehl, den Windows unter Einstellungen › Apps ausführt) entfernt als eine Transaktion:

  • jede Version des Produkts: die Versionsordner mit allem, was darin liegt;
  • jede Komponente, die keine andere Produktversion des Benutzers mehr verwendet: Dateien, Ordner sowie Schlüssel und Werte der Registrierungsdatenbank, die der Starter angelegt hat;
  • Werte der Registrierungsdatenbank, die schon existierten, bevor der Starter sie schrieb, werden auf ihren vorherigen Inhalt zurückgesetzt, nie gelöscht;
  • den vertrauenswürdigen Speicherort und den Eintrag unter „Apps“.

Komponenten, die ein anderes Produkt des Benutzers noch verwendet, bleiben, und mit ihnen die Klassenschlüssel, die sie gemeinsam haben; hat das entfernte Produkt das registrierte Release verwendet, wird das neueste verbleibende Release derselben Bitbreite wieder registriert. Ist eine Kopie in Access geöffnet, wird nichts entfernt, und der Code ist 41 mit dem genannten Programm; schließen Sie Access und führen Sie den Befehl erneut aus.

Die Verknüpfungen der Liste shortcuts des Projekts werden mit dem Produkt entfernt, auch die, deren Ziel der Starter selbst ist.

Unberührt bleiben: der Ordner, aus dem der Starter läuft, mit seiner bootstrapper.json, Verknüpfungen, die nicht aus dem Projekt stammen, die Installer-Datenbank selbst und die Protokolle unterhalb von %LOCALAPPDATA%\WKL\<product>\Logs.

Befehle und Exitcodes

BefehlWirkungExitcode
(keiner)Installiert oder aktualisiert, startet dann AccessDer Code des Laufs; 0, wenn Access gestartet wurde
/quietDasselbe ohne jedes FensterWie oben
/repairInstalliert, was fehlt, startet Access nichtDer Code des Laufs; 0, wenn vollständig
/uninstall [/quiet]Entfernt das Produkt der bootstrapper.json neben der EXE-Datei. Ohne /quiet (der Eintrag unter „Apps“ von Windows) fragt der Starter zuerst in seinem Fenster nach, in der Sprache und im Farbschema des Projekts; Abbrechen ist die Standardschaltfläche, sodass die Eingabetaste, Esc und das Schließen des Fensters alles erhalten. Mit /quiet (Skripte, QuietUninstallString) entfernt er ohne Rückfrage0 entfernt; 1602 abgebrochen, nichts entfernt (der Code von msiexec); 10 bootstrapper.json fehlt; 41 in Verwendung oder fehlgeschlagen (zurückgerollt); 43 eine beforeUninstall-Aktion ist fehlgeschlagen (nichts entfernt)
/listGibt die installierten Versionen und Komponenten aus0
/list /jsonDasselbe als JSON0
/RUNCFG <file> mit jedem BefehlVerwendet <file> (eine .json-Datei im Ordner des Starters, ein bloßer Dateiname) statt bootstrapper.json: mehrere Anwendungen neben einem Starter. Der Eintrag unter „Apps“ deinstalliert mit demselben Schalter.Wie der Befehl; 10 für einen Namen mit Pfad
/new-key <name>Erzeugt den Lieferschlüssel des Herausgebers im Windows-Schlüsselspeicher des Benutzers und gibt seinen öffentlichen Teil für deliveryKey aus0; 10 der Name existiert
/publish [/key <name>] [/withdraw <version>[,<version>]]Schreibt delivery.json (und mit einem Schlüssel delivery.json.sig) in die Quelle der Projektdatei; /withdraw nennt die höheren Versionen, die diese Auslieferung ersetzt; siehe Signierte Auslieferung veröffentlichen0; 11 eine zurückgezogene Version ist keine höhere Version; 12 Quelle nicht erreichbar; 51 Schlüssel fehlt oder ist nicht der des Projekts
/whatif <file> [/json]Ein Probelauf der Projektdatei: jede Prüfung eines Starts und der Plan, was er wohin installieren würde, ohne etwas zu ändern; siehe Was der Starter schreibt und meldetWie /diagnose: 0, wenn ein Start gelingen würde, sonst der Fehlercode
/check <file> [/json]Prüft eine Projektdatei gegen ihre Regeln und gibt jedes Problem aus; mit /json ein Objekt mit valid, format und problems. Liest nur die Projektdatei: Ob die Auslieferung enthält, was sie nennt (zum Beispiel registration.json der Komponenten), prüft /whatif. Ab 2.3.0 wird eine Datei, die auf .msi.json endet, als Installer-Einstellungen geprüft, einschließlich der Dateien, die sie nennen0 gültig; 10 Datei nicht gefunden; 11 Probleme
/msi-sources <project file> /out <folder> [/starter <exe>] [/version <x.y.z>]Ab Version 2.3.0: schreibt die WiX-Quellen des Pakets des Starters aus der <name>.msi.json neben der Projektdatei (oder die des Pakets ohne Dialoge, wenn es keine gibt) und gibt als JSON die zu bauenden Pakete aus (builds mit scope, culture, output, sources, localization; images zum Umwandeln aus PNG). Verwendet von tools\New-StarterMsi.ps1; braucht kein WiX Toolset0 geschrieben; 10 Projektdatei, Ordner oder Starter fehlt; 11 eine Regel verletzt oder eine Seite, die nicht passt
/import-reg <file.reg> [/json]Liest eine .reg-Datei des Registrierungs-Editors in Einträge der Registrierungsdatenbank eines Projekts ein (nur unterhalb von HKEY_CURRENT_USER; HKEY_CLASSES_ROOT wird zu Software\Classes des Benutzers, WOW6432Node zur 32-Bit-Ansicht) und listet auf, was ausgelassen wurde (Schlüssel des Computers, Binärwerte, Löschungen). Schreibt nichts; mit /json die Liste registry des Projekts und notes, nur ASCII0 gelesen; 10 Datei nicht gefunden; 11 keine .reg-Datei
/new-project <file> /template <names> [/json]Schreibt eine neue Projektdatei im Format 2 aus Vorlagen; <names> ist eine durch Kommas getrennte Liste aus access (die Anwendung aus der app-manifest.json des Build-Werkzeugs, gestartet, wie diese es angibt, mit der Bedingung Microsoft Access), components (WKL Forms Object Library aus components\x86 und components\x64 des Auslieferungsordners, für den Benutzer registriert, mit der Bedingung .NET 10 Desktop Runtime), odbc (ein Beispiel-ODBC-Treiber mit einer Datenquelle des Benutzers je Bitbreite, durch den ausgelieferten zu ersetzen) und json (WKL Office JSON aus json\x86 und json\x64) und dotnet (eine private .NET-Runtime aus dotnet\x86 und dotnet\x64, je Release unterhalb von [WklRoot]\Dotnet vorgehalten und dem gestarteten Programm als DOTNET_ROOT(x86) oder DOTNET_ROOT übergeben; sie ersetzt die Bedingung .NET 10 Desktop Runtime von components, aber nur für Programme, die der Starter startet); ohne Vorlage entsteht ein Projekt, das noch nichts startet. Der Produktschlüssel ist der Name des Ordners der Datei, der Auslieferungsordner deploy neben dem Starter. Listet auf, was noch zu tun ist; mit /json ein Objekt mit written, notes und problems, nur ASCII0 geschrieben; 10 keine Datei genannt; 11 unbekannte Vorlage, oder die Datei existiert
/import-starterpro <xml> [/out <file>] [/json]Wandelt eine Konfiguration des bisherigen Starters in eine Projektdatei im Format 2 um (standardmäßig bootstrapper.json daneben) und listet auf, was nicht übernommen wurde; mit /json ein Objekt mit written, notes und problems, jedes Zeichen außerhalb von ASCII maskiert; siehe Vom bisherigen Starter umsteigen0 geschrieben; 10 Konfiguration nicht gefunden; 11 keine Konfiguration des bisherigen Starters, oder die Projektdatei existiert

Die Codes sind die der Fehlercodes des Starters. /list /json gibt ein Objekt aus:

{
  "versions": [
    { "product": "Kunden", "displayName": "Kunden", "version": "1.4.0", "lastWorking": true }
  ],
  "components": [
    { "id": "components/1.56.1/x86", "keyPath": "C:\\Users\\<user>\\AppData\\Local\\WKL\\Components\\1.56.1\\x86\\Wkl.Access.Components.dll", "clients": 2, "present": true }
  ]
}
FeldBedeutung
versions[].productProduktschlüssel aus bootstrapper.json
versions[].displayNameName, der unter „Apps“ angezeigt wird
versions[].versionVersion der Anwendung (app-manifest.json)
versions[].lastWorkingWahr für die Version, die zuletzt erfolgreich gestartet wurde
components[].idID der Komponente, siehe Was installiert wird
components[].keyPathDatei oder Schlüssel, deren Vorhandensein „installiert“ bedeutet
components[].clientsZahl der Produktversionen, die die Komponente verwenden
components[].presentFalsch, wenn der Schlüsselpfad fehlt; /repair stellt ihn wieder her

Ist nichts installiert, sind die Arrays leer.

Prüfen, dass eine fehlgeschlagene Installation nichts hinterlässt

Um auf einem Test-PC ein Rollback zu sehen, lassen Sie das Kopieren scheitern, nachdem die Version verzeichnet wurde:

  1. Führen Sie /list /json aus und bewahren Sie die Ausgabe auf.
  2. Legen Sie eine neue Version in die Quelle und ändern Sie ein Byte ihrer Datenbankdatei, nachdem app-manifest.json geschrieben wurde.
  3. Starten Sie den Starter. Er meldet Code 42.
  4. Führen Sie /list /json erneut aus: Die Ausgabe gleicht der aus Schritt 1, und unterhalb von Frontends existiert kein Ordner der neuen Version.

Um zu sehen, dass auch die Registrierung der Komponenten und die Datenquelle zurückgenommen werden, lassen Sie einen Schritt nach ihnen scheitern. Der Treiber wird nach den Komponenten abgelegt (Schritt 6 nach Schritt 5), daher eignet sich eine Auslieferung mit einem Eintrag odbc:

  1. Führen Sie /list /json aus und notieren Sie die Werte des Klassenschlüssels der Komponenten (zum Beispiel HKCU\Software\Classes\WklForms.Application\CLSID, bis Release 1.68 WklComponents.Application, und sein InprocServer32) und von HKCU\Software\ODBC\ODBC.INI\<dataSource>.
  2. Legen Sie eine neue Version in die Quelle, deren Auslieferung ein neueres Komponenten-Release und den Treiber mitbringt.
  3. Halten Sie die ausgelieferte Treiber-DLL geöffnet, sodass sie sich nicht lesen lässt, zum Beispiel in PowerShell: $f = [System.IO.File]::Open('<source>\odbc\<driver>\x86\<dll>', 'Open', 'Read', 'None').
  4. Starten Sie den Starter. Nach einigen Sekunden erneuter Versuche meldet er Code 41.
  5. Vergleichen Sie: /list /json, der Klassenschlüssel und die Datenquelle gleichen Schritt 1; unterhalb von %LOCALAPPDATA%\WKL\Components und %LOCALAPPDATA%\WKL\Drivers existiert kein Ordner des neuen Release.
  6. Geben Sie die Datei frei ($f.Dispose()) und starten Sie erneut: Die neue Version wird installiert.

Eine Richtlinie gegen vertrauenswürdige Speicherorte eignet sich dafür nicht: Der Starter prüft sie, bevor etwas installiert wird (Code 50 ohne Transaktion), und die Richtlinienschlüssel unterhalb von HKCU\Software\Policies lassen sich ohne Administratorrechte nicht schreiben.

Um zu sehen, dass eine Deinstallation kein Produkt zur Hälfte entfernt, öffnen Sie die installierte Kopie in Access und führen Sie /uninstall /quiet aus: Code 41 nennt MSACCESS.EXE, und /list zeigt weiterhin jede Version und jede Komponente.

Übernahme des Starters 1.0

Wenn 2.0 zum ersten Mal auf ein Produkt trifft, verzeichnet es als sein eigenes, was der Starter 1.0 hinterlassen hat: die Versionsordner unterhalb von Frontends (die zuletzt funktionierende Version aus State\provisioning.json), den vertrauenswürdigen Speicherort, den 1.0 geschrieben hat (seine Beschreibung endet auf (Wkl.Bootstrapper)), und die Registrierung, die 1.0 mit regsvr32 aus %LOCALAPPDATA%\WKL\Components vorgenommen hat. Danach werden sie wie von 2.0 abgelegte Teile aufgeräumt und deinstalliert. Registrierungen von anderen Orten werden nicht übernommen.

Grenzen des Installers

  • Zwei Starter desselben Windows-Benutzers, die im selben Moment installieren, werden nicht nacheinander ausgeführt: Die Installer-Datenbank gibt es einmal je Benutzer, und ein Starter, der eine unvollendete Installation vorfindet, rollt sie zurück – auch eine, die gerade ein anderer Starter ausführt. Starten Sie jeweils nur einen (Format 1 ohne registration.json arbeitet je Produkt nacheinander).
  • Eine Datei im Format 1 liefert die .NET Desktop Runtime nicht aus: Der Starter prüft sie (Code 33). Ein Projekt im Format 2 kann eine private Runtime ausliefern; siehe Private .NET-Runtime ausliefern.
  • WKL JSON wird von einer Datei im Format 1 nicht ausgeliefert: Eine Anwendung, die es verwendet, braucht es vorab registriert, zum Beispiel durch die IT. Ein Projekt im Format 2 liefert es als Eintrag registerCom aus wie jeden COM-Server.
  • Computer, die Programme im Benutzerprofil mit AppLocker oder Windows Defender Application Control einschränken, werden nicht unterstützt.
  • Eine Quelle über HTTP/HTTPS wird nicht unterstützt; die Quelle ist ein Ordner oder eine Freigabe.

Verwandte Themen

de/wiki/msaccess/bootstrapper/reference/installer.txt · Last modified: by Wolfgang van der Stille