F: Welche SDK-Version ist beim Kunden installiert – und wie installiere ich Updates automatisch?

Thema
VB.NET
Codebeispiele
VB.NET, VB6 / VBScript (COM)
Veröffentlicht

Kurz: Die Version des Aloaha ZUGFeRD SDK erkennen Sie an der Dateiversion (FileVersion) von Aloaha_ZUGFeRD.dll, z. B. 11.0.0.11 – nicht an der AssemblyVersion: Die bleibt aus Gründen der COM-Kompatibilität in allen Versionen 11 gleich (10.0.0.33). Prüfen können Sie die Dateiversion der geladenen DLL in .NET mit FileVersionInfo, aus VB6/VBA über den Windows Installer oder im Kommentar am Anfang jeder erzeugten XML-Datei. Für die automatische Installation beim Kunden legen Sie das SDK-Setup Ihrer eigenen Installation bei und starten es unbeaufsichtigt mit msiexec /i Aloaha_ZUGFeRD_SDK_Setup.msi /qn; es ersetzt ältere Versionen selbstständig.

Gesucht wird das oft als „installierte Version prüfen“, „Versionsnummer der DLL auslesen“, „SDK beim Kunden ausrollen“, „Silent Install“ oder „unbeaufsichtigte Installation per Softwareverteilung“. Diese Seite beantwortet beides: welche Version läuft, und wie die richtige Version ohne Handarbeit auf den Rechner des Kunden kommt.

Auf einen Blick

FrageWegLiefert
Welche DLL nutzt meine .NET-Anwendung gerade?FileVersionInfo der geladenen AssemblyDateiversion und Pfad (GAC oder Programmordner)
Welches Setup ist installiert? (VB6, VBA, Skript, Setup)Windows Installer über den UpgradeCodeVersion des installierten SDK-Setups
Welche DLL lädt COM bzw. .NET aus dem GAC?Dateiversion der DLL im GACDateiversion der systemweit verwendeten DLL
Mit welcher Version wurde eine Rechnung erzeugt?Kommentar am Anfang der XML-DateiAssemblyFileVersion ohne eigenen Code
Wie kommt die neue Version zum Kunden?msiexec /i … /qn aus Ihrem Setupstille Installation, ältere Version wird ersetzt

Der häufigste Fehler: AssemblyVersion statt Dateiversion

alo.AssemblyVersion() und Assembly.GetName().Version liefern in allen Versionen 11 denselben Wert 10.0.0.33. Das ist Absicht: Bei gleicher AssemblyVersion funktionieren bestehende COM-Clients (VB6, VBA, Delphi) und .NET-Verweise nach einem Update ohne Neukompilieren weiter. Die eigentliche Versionsnummer steht in der Dateiversion. Wer die AssemblyVersion vergleicht, hält jede installierte Version für „aktuell“.

Zweiter typischer Fehler: nur die neue DLL in den eigenen Programmordner kopieren. Ist auf dem Rechner bereits ein SDK-Setup installiert, liegt eine ältere DLL im Global Assembly Cache (GAC). Weil die AssemblyVersion gleich ist, lädt .NET bevorzugt die DLL aus dem GAC – Ihr Programm arbeitet dann unbemerkt mit der alten Version. Aktualisieren Sie deshalb immer über das Setup; es ersetzt die DLL im GAC und im Installationsordner.

Version in VB.NET oder C# prüfen

Die Dateiversion der tatsächlich geladenen DLL lesen Sie über den Typ Aloaha_ZUGFeRD.XML. Location zeigt zusätzlich, ob die DLL aus dem GAC oder aus Ihrem Programmordner kommt:

Dim alo As New Aloaha_ZUGFeRD.XML("IHR-LIZENZSCHLUESSEL")
Dim asm As System.Reflection.Assembly = alo.GetType().Assembly
Dim dateiVersion As String = System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location).FileVersion

' z. B. "11.0.0.11" und "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Aloaha_ZUGFeRD\...\Aloaha_ZUGFeRD.dll"
Console.WriteLine(dateiVersion & "  " & asm.Location)

If New Version(dateiVersion) < New Version("11.0.0.11") Then
    ' Hinweis anzeigen oder das beigelegte Setup starten (siehe unten)
End If

Vergleichen Sie Versionen immer mit Version und nicht als Text: als Text wäre „11.0.0.9“ größer als „11.0.0.11“.

Version aus VB6, VBA oder einem Skript prüfen

COM-Clients sehen die Assembly nicht direkt. Zwei Wege funktionieren ohne zusätzliche Software. Der Windows Installer kennt das installierte SDK-Setup über dessen UpgradeCode {91807EA5-C2CD-4663-BCA6-D49809046E57}; der gilt für alle Setups des SDK, auch für ältere:

' VB6 / VBA (Late Binding, ohne Verweis)
Public Function ZugferdSetupVersion() As String
    Dim inst As Object, prods As Object
    Set inst = CreateObject("WindowsInstaller.Installer")
    Set prods = inst.RelatedProducts("{91807EA5-C2CD-4663-BCA6-D49809046E57}")
    If prods.Count > 0 Then
        ZugferdSetupVersion = inst.ProductInfo(prods.Item(0), "VersionString")   ' z. B. "11.0.0.11"
    End If
End Function

' Dateiversion der DLL im GAC – diese DLL laden COM und .NET
Public Function ZugferdGacVersion() As String
    Dim fso As Object, pfad As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    pfad = Environ("WINDIR") & "\Microsoft.NET\assembly\GAC_MSIL\Aloaha_ZUGFeRD\" & _
           "v4.0_10.0.0.33__c5652d2207a36ca2\Aloaha_ZUGFeRD.dll"
    If fso.FileExists(pfad) Then ZugferdGacVersion = fso.GetFileVersion(pfad)
End Function

Sub VersionPruefen()
    Dim alo As Object
    Set alo = CreateObject("Aloaha_ZUGFeRD.XML")                       ' Fehler 429 = nicht registriert
    MsgBox "Setup: " & ZugferdSetupVersion() & vbCrLf & "DLL: " & ZugferdGacVersion()
End Sub

Leere Rückgabe bei ZugferdSetupVersion heißt: kein SDK-Setup installiert (die DLL wurde dann von Hand registriert). Ob die COM-Registrierung selbst funktioniert, zeigt das Skript zugferd_com_test.vbs, das das Setup neben die DLL installiert.

Ohne Code: Version in der erzeugten XML-Datei

Am Anfang jeder XML-Datei, die das SDK schreibt, steht ein Kommentar mit beiden Versionsnummern. Öffnen Sie eine vom Kunden erzeugte Rechnung (oder das aus der PDF extrahierte XML) in einem Texteditor:

<!--*   AssemblyFileVersion: 11.0.0.11   *-->

So sehen Sie bei einer Rückfrage sofort, mit welcher Version die beanstandete Rechnung erstellt wurde.

Neue Version automatisch beim Kunden installieren

Das SDK-Setup Aloaha_ZUGFeRD_SDK_Setup.msi (in Aloaha_ZUGFeRD_SDK.zip auf der Download-Seite) ist für die Verteilung gedacht:

  • Es installiert für alle Benutzer nach C:\Program Files (x86)\Aloaha\ZUGFeRD SDK\, legt die DLL in den GAC und registriert die COM-Schnittstelle für 32 und 64 Bit.
  • Eine ältere Version des SDK-Setups wird beim Installieren automatisch ersetzt; Sie müssen vorher nichts deinstallieren. Dieselbe Version noch einmal zu installieren schadet nicht.
  • Eine Installation über eine neuere Version (Downgrade) lehnt das Setup ab.
  • Voraussetzung ist das .NET Framework 4.7.2 oder neuer; die Installation braucht Administratorrechte.

Unbeaufsichtigt aus Ihrem eigenen Setup, einem Batch oder einer Softwareverteilung:

msiexec /i "Aloaha_ZUGFeRD_SDK_Setup.msi" /qn /norestart /l*v "%TEMP%\aloaha_zugferd_sdk.log"
RückgabewertBedeutung
0erfolgreich installiert
3010erfolgreich, ein Neustart wird empfohlen
1603 (oder 1925)Fehler, z. B. fehlende Administratorrechte, .NET Framework 4.7.2 fehlt oder eine neuere Version ist bereits installiert – Details im Protokoll

Am einfachsten starten Sie das Setup bei jedem Update Ihrer Anwendung mit: Ist die Version schon installiert, ist der Aufruf schnell erledigt; ist sie älter, wird sie ersetzt. Wer vorher prüfen möchte, vergleicht ZugferdSetupVersion() (siehe oben) mit der Version des beigelegten Setups.

Das Update auf eine neue Version ist mit gültigem Wartungsvertrag kostenlos. Lizenzschlüssel sind von der Installation unabhängig: Ihre Anwendung übergibt den Schlüssel wie bisher im Code.

Ohne Setup: DLL selbst mitliefern

Liefern Sie Aloaha_ZUGFeRD.dll lieber selbst in Ihrem Programmordner aus, ist das möglich; für COM-Clients muss die DLL dann mit RegAsm registriert werden (regasm Aloaha_ZUGFeRD.dll /codebase /tlb, als Administrator, mit dem RegAsm der passenden Bitbreite – siehe Access-Fehler 430). Prüfen Sie dabei, ob schon ein SDK-Setup installiert ist: dessen DLL im GAC hätte Vorrang vor Ihrer Kopie. Dann installieren Sie besser das aktuelle Setup.

Häufige Fragen

Warum zeigt AssemblyVersion immer 10.0.0.33, obwohl Version 11 installiert ist?

Die AssemblyVersion bleibt absichtlich gleich, damit COM-Clients und .NET-Verweise nach einem Update ohne Neukompilieren weiterlaufen. Die tatsächliche Version steht in der Dateiversion (FileVersion) der DLL, z. B. 11.0.0.11.

Wie prüfe ich aus Access oder VB6, welche SDK-Version installiert ist?

Über den Windows Installer: CreateObject("WindowsInstaller.Installer"), RelatedProducts mit dem UpgradeCode {91807EA5-C2CD-4663-BCA6-D49809046E57} und ProductInfo(Produkt, "VersionString"). Alternativ die Dateiversion der DLL im GAC mit Scripting.FileSystemObject.GetFileVersion lesen.

Kann ich das SDK beim Kunden ohne Dialoge installieren?

Ja: msiexec /i Aloaha_ZUGFeRD_SDK_Setup.msi /qn /norestart, mit Administratorrechten. Rückgabewert 0 oder 3010 bedeutet Erfolg. Eine ältere Version wird dabei automatisch ersetzt.

Muss ich die alte Version vorher deinstallieren?

Nein. Das Setup erkennt ältere Setups des SDK und ersetzt sie. Nur ein Downgrade auf eine ältere Version lehnt es ab.

Ich habe die neue DLL in meinen Programmordner kopiert, es läuft aber noch die alte Version – warum?

Auf dem Rechner ist noch ein älteres SDK-Setup installiert. Dessen DLL im Global Assembly Cache hat bei gleicher AssemblyVersion Vorrang. Installieren Sie das aktuelle Setup; es ersetzt die DLL im GAC.

Woran sehe ich, mit welcher Version eine Rechnung erstellt wurde?

Am Kommentar am Anfang der erzeugten XML-Datei: Dort steht AssemblyFileVersion mit der Dateiversion des SDK, mit der die Rechnung geschrieben wurde.