- 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
| Frage | Weg | Liefert |
|---|---|---|
| Welche DLL nutzt meine .NET-Anwendung gerade? | FileVersionInfo der geladenen Assembly | Dateiversion und Pfad (GAC oder Programmordner) |
| Welches Setup ist installiert? (VB6, VBA, Skript, Setup) | Windows Installer über den UpgradeCode | Version des installierten SDK-Setups |
| Welche DLL lädt COM bzw. .NET aus dem GAC? | Dateiversion der DLL im GAC | Dateiversion der systemweit verwendeten DLL |
| Mit welcher Version wurde eine Rechnung erzeugt? | Kommentar am Anfang der XML-Datei | AssemblyFileVersion ohne eigenen Code |
| Wie kommt die neue Version zum Kunden? | msiexec /i … /qn aus Ihrem Setup | stille 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ückgabewert | Bedeutung |
|---|---|
| 0 | erfolgreich installiert |
| 3010 | erfolgreich, 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.