Zum Fußzeileninhalt springen
VIDEOS

Wie man Async und Multithread in Barcodes mit C# verwendet

Migrieren von QR-Code zu IronBarcode

Dieser Leitfaden richtet sich an Entwicklungsteams, deren Projekte mit QR-Code begonnen haben und mittlerweile über die QR-Code-Generierung hinausgehende Funktionen erfordern. QR-Code ist eine gut gepflegte, qualitativ hochwertige Bibliothek für ihren vorgesehenen Anwendungsbereich, und eine Migration spiegelt nicht ihre Qualität wider. Es handelt sich um eine Antwort auf Anforderungen – Formaterweiterung, Barcode-Lesung, PDF-Integration –, die nicht dem entsprechen, wofür QR-Code ursprünglich konzipiert wurde. Dieser Leitfaden beschreibt den kompletten technischen Weg von QR-Code zu IronBarcode: Paketaustausch, Namensraumänderungen, Codeübersetzung für jedes gängige Muster, eine Zuordnung der API-Äquivalenzen und Lösungen für die Probleme, die während des Übergangs auftreten.

Warum von QR-Code migrieren?

Formatanforderungen jenseits von QR: QR-Code generiert ausschließlich QR-Codes. Projekte, die sich auf das Erfordernis von Code 128 Labels für die Logistik, EAN-13 Codes für die Produktidentifikation im Einzelhandel, DataMatrixfür die pharmazeutische Serialisierung oder PDF417für die Konformität von Regierungsdokumenten ausweiten, müssen für jedes zusätzliche Format eine separate Bibliothek einführen. Mit der zunehmenden Anzahl der benötigten Formate steigt auch die Anzahl der unabhängigen Pakete, APIs und Wartungsverpflichtungen.

Anforderungen an das Barcode-Lesen: QR-Code verfügt über keine Barcode-Lese-API – es handelt sich von Grund auf um eine reine Generierungsbibliothek. Jede Anwendung, die QR-Codes aus eingehenden Bildern dekodieren, Barcodes auf gescannten Dokumenten überprüfen oder Versandetiketten verarbeiten muss, muss neben QR-Code eine dedizierte Lesebibliothek hinzufügen. Diese zweite Bibliothek bringt ihre eigene API-Oberfläche, ihren eigenen Aktualisierungszyklus und ihre eigenen Kompatibilitätsprobleme bei jedem .NET Upgrade mit sich.

Multi-Bibliotheks-Wartung: Das realistische Akkumulationsmuster für ein QRCoder-basiertes Projekt verläuft von QR-Code zur QR-Code-Generierung über eine 1D-Barcode-Bibliothek für Versandetiketten bis hin zu einer Lesebibliothek zum Dekodieren. Die Verwaltung von drei oder vier unabhängigen Paketen bedeutet, separate Versionshinweise zu verfolgen, Versionskonflikte zu lösen, wenn eines der Pakete aktualisiert wird, und die Vertrautheit mit mehreren APIs innerhalb eines Entwicklungsteams aufrechtzuerhalten. Der Wartungsaufwand summiert sich im Laufe der Zeit auf eine Weise, die in der anfänglichen Integrationsschätzung nicht erkennbar ist.

PDF-Unterstützung: Das Einbetten von Barcodes in PDF-Dokumente oder das Extrahieren von Barcodes aus eingehenden PDF-Dateien fällt nicht in den Funktionsumfang von QRCoder. Dokumentenverarbeitungsprozesse – Rechnungsbearbeitung, Etikettenerstellung aus PDF-Vorlagen, Compliance-Berichterstattung – stoßen früh an diese Grenze. Es muss eine dedizierte PDF-Bibliothek zusammen mit QR-Code hinzugefügt werden, oder die Architektur muss die Barcode-Generierung und die PDF-Generierung über separate Subsysteme leiten.

Das grundsätzliche Problem

QRCoder löst das Problem der QR-Generierung auf effiziente Weise. Sobald eine Anforderung die QR-Kriterien überschreitet, muss die Codebasis zusätzliche Pakete einbinden, um jede Lücke zu füllen:

// QR-Code handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
// QR-Code handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))

' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
$vbLabelText   $csharpLabel

IronBarcode vereint Generierung, Lesen und PDF-Integration unter einer einzigen API:

// IronBarcode — one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
// IronBarcode — one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode

' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
$vbLabelText   $csharpLabel

IronBarcode vs. QRCoder: Funktionsvergleich

Feature QR-Code IronBarcode
QR-Code-Generierung Ja – ausgezeichnet. Ja
Mikro-QR Ja Nein
Code 128 / Code 39 Nein Ja
EAN-13 / UPC-A Nein Ja
DataMatrix Nein Ja
PDF417 Nein Ja
aztekisch Nein Ja
Gesamtformate 1 50+
Barcode-Lesung Nein Ja – automatische Erkennung
PDF-Barcode-Extraktion Nein Ja
PDF-Barcode-Stempeln Nein Ja
Logoeinbettung Ja Ja
Farbanpassung Ja Ja
SVG-Ausgabe Ja Ja
PayloadGenerator-Helfer Ja Nein – manuelle Saitenkonstruktion
Keine externen Abhängigkeiten Ja In sich geschlossen
Lizenz MIT — uneingeschränkt Kommerziell — Lite-Lizenz deckt einen einzelnen Entwickler ab

Schnellstart: Migration von QR-Code zu IronBarcode

Schritt 1: Ersetzen des NuGet-Pakets

QRCoder aus dem Projekt entfernen:

dotnet remove package QRCoder
dotnet remove package QRCoder
SHELL

IronBarcode installieren:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Falls im Projekt ZXing .NET zusammen mit QR-Code zum Einlesen von Barcodes verwendet wurde, kann dieses Paket ebenfalls in diesem Stadium entfernt werden:

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
SHELL

Schritt 2: Namespaces aktualisieren

Ersetzen Sie den Import des QRCoder-Namensraums durch den IronBarcode Namensraum:

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

Schritt 3: Lizenz initialisieren

Lizenzinitialisierung beim Anwendungsstart hinzufügen — Program.cs, Startup.cs oder ein statischer Konstruktor:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Ein kostenloser Testschlüssel ist ohne Registrierung erhältlich. Für den Einsatz in Produktionsumgebungen ist eine erworbene Lizenz erforderlich.

Beispiele für die Code-Migration

Grundlegende QR-Code-Generierung

Das häufigste QRCoder-Muster erfordert drei Objekte: eine QRCodeGenerator-Instanz, ein QRCodeData-Zwischenobjekt und eine Renderer-Klasse wie PngByteQRCode. In IronBarcode wird diese Kette durch einen einzigen statischen Aufruf ersetzt.

QRCoder-Ansatz:

using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
Imports QRCoder

Public Class BarcodeService
    Private ReadOnly _generator As New QRCodeGenerator()

    Public Function GenerateQR(content As String) As Byte()
        Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
        Dim qrCode = New PngByteQRCode(qrCodeData)
        Return qrCode.GetGraphic(10) ' 10px per module
    End Function
End Class
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
Imports IronBarCode

Public Class BarcodeService
    Public Function GenerateQR(content As String) As Byte()
        Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
            .ResizeTo(200, 200) _
            .ToPngBinaryData()
    End Function
End Class
$vbLabelText   $csharpLabel

BarcodeWriter ist eine statische Klasse — keine Instanz wird benötigt und es gibt kein Zwischenobjekt. Die ResizeTo(width, height)-Methode ersetzt die Pixel-pro-Modul-Ganzzahl, die QR-Code in GetGraphic akzeptiert. Wo QR-Code die Ausgabe durch die Anzahl der Module bestimmt (z.B. GetGraphic(10) für ein 10px pro Modul Bild), nimmt IronBarcode absolute Pixelmaße.

QR-Codes in Datei speichern

QRCoder trennt die Bytes im Arbeitsspeicher von der Dateiausgabe erst im letzten Schritt – die Rendererkette bleibt dabei gleich. IronBarcode verwendet auf derselben Kette unterschiedliche Terminalmethoden.

QRCoder-Ansatz:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
Imports IronBarCode

' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("output.png")

' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Die SaveAsPng-Methode ist ein Terminal, das direkt auf die Festplatte schreibt. ToPngBinaryData gibt ein byte[] zurück für Streaming, HTTP-Antworten oder Datenbankspeicherung.

SVG-Ausgabe

QRCoder-Ansatz:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
Imports IronBarCode

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsImage("output.svg")
$vbLabelText   $csharpLabel

Die SvgQRCode-Rendererklasse und ihr GetGraphic-Aufruf lassen sich zu einer einzigen SaveAsImage-Terminalmethode zusammenfassen (eine .svg-Erweiterung erzeugt SVG-Ausgabe).

Zuordnung der Fehlerkorrekturstufen

QRCoder erfordert eine explizite ECC-Auswahl bei jedem CreateQrCode-Aufruf mit dem QRCodeGenerator.ECCLevel-Enum. IronBarcode wendet einen sinnvollen Standardwert an, wenn BarcodeWriter.CreateBarcode verwendet wird, und bietet explizite Kontrolle über QRCodeWriter.QrErrorCorrectionLevel.

QRCoder-Ansatz:

using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder

Dim generator As New QRCodeGenerator()

' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)

' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode

' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("default-ecc.png")

' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
$vbLabelText   $csharpLabel

Die Zuordnung der Ebenen ist: ECCLevel.LLow, ECCLevel.MMedium, ECCLevel.QHigh, ECCLevel.HHighest.

Logoeinbettung

Beide Bibliotheken unterstützen das Einbetten von Logos in QR-Codes. QR-Code leitet dies über die QRCode-Rendererklasse (nicht PngByteQRCode) mit System.Drawing.Bitmap-Parametern. IronBarcode bietet QRCodeWriter.CreateQrCodeWithLogo() als dedizierte Fabrikmethode, die Dateipfade für sowohl URL als auch Logo akzeptiert. Der Leitfaden zur Anpassung des QR-Code-Stils umfasst Optionen für Logogröße, Positionierung und Farbkombinationen.

QRCoder-Ansatz:

using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging

Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)

Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
Imports IronBarCode

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
    .SaveAsPng("qr-logo.png")
$vbLabelText   $csharpLabel

Die System.Drawing.Bitmap-Abhängigkeit wird entfernt — CreateQrCodeWithLogo akzeptiert Dateipfad-Strings für sowohl den Inhalt als auch das Logobild. Fehlerkorrektur wird automatisch auf das für die Logo-Einbettung erforderliche Niveau eingestellt; keine explizite ECC-Konfiguration erforderlich.

PayloadGenerator.WiFi-Migration

QRCoder's PayloadGenerator.WiFi formatiert den Standard-WiFi-QR-Payload-String. Das Ausgabeformat ist ein öffentlicher Standard (WIFI:T:{auth};S:{ssid};P:{password};;), der durch die QR-Code-Spezifikation definiert ist. Bei der Migration können diese Zeichenketten direkt erstellt werden.

QRCoder-Ansatz:

using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder

Dim wifi = New PayloadGenerator.WiFi(
    ssid:="OfficeNetwork",
    password:="SecurePass123",
    authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
$vbLabelText   $csharpLabel

IronBarcode -Ansatz:

using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
Imports IronBarCode

' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("wifi.png")
$vbLabelText   $csharpLabel

Für Teams mit vielen PayloadGenerator-Typen im Einsatz (vCard, CalendarEvent, Geo, SMS), ist der Ansatz der gleiche: Identifizieren Sie die formatierte Zeichenkette, die jeder Generator mit seiner .ToString()-Ausgabe produziert, und konstruieren Sie diese Zeichenkette direkt oder durch eine kleine statische Hilfsmethode.

QR-Code API zu IronBarcode Mapping-Referenz

QR-Code IronBarcode Notizen
new QRCodeGenerator() Statische Klasse – keine Instanz BarcodeWriter erfordert keine Instanziierung
qrGenerator.CreateQrCode(data, ECCLevel.M) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) Direkter Ersatz
new PngByteQRCode(qrCodeData) Nicht erforderlich Rendering ist Teil der Fluent-Kette
qrCode.GetGraphic(20) gibt byte[] zurück .ToPngBinaryData() Größe über .ResizeTo(w, h)
File.WriteAllBytes(path, bytes)-Muster .SaveAsPng(path) Terminalmethode auf GeneratedBarcode
new SvgQRCode(qrCodeData).GetGraphic(10) .SaveAsImage(path) Passieren Sie eine .svg-Erweiterung für SVG-Ausgabe
new QRCode(qrCodeData).GetGraphic(...) QRCodeWriter.CreateQrCode(data, size, level) Wird zur Logo- und Farbanpassung verwendet
QRCodeGenerator.ECCLevel.L QRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.M QRCodeWriter.QrErrorCorrectionLevel.Medium Standardwert, wenn nicht anders angegeben
QRCodeGenerator.ECCLevel.Q QRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.H QRCodeWriter.QrErrorCorrectionLevel.Highest Erforderlich für die Logoeinbettung
PayloadGenerator.WiFi(...).ToString() "WIFI:T:WPA;S:{ssid};P:{pass};;" Erstellen Sie direkt eine Standardzeichenkette.
PayloadGenerator.ContactData(...).ToString() "BEGIN:VCARD\n..." vCard ist ein öffentlicher Standard
Keine Lese-API BarcodeReader.Read(path) Neue Funktion – keine separate Bibliothek mehr nötig
Nur QR-Format 50+ Formate über BarcodeEncoding.* Neue Fähigkeit

Gängige Migrationsprobleme und Lösungen

Problem 1: Änderung des PayloadGenerator-Zeichenfolgenformats

QRCoder: PayloadGenerator.WiFi, PayloadGenerator.ContactData und andere Helfer erzeugen automatisch formatierte Zeichenketten. Der Code übergibt die .ToString()-Ausgabe des Helferobjekts an CreateQrCode.

Lösung: Identifizieren Sie die Zeichenkette, die jeder PayloadGenerator-Typ produziert — ihr Format ist in der QR-Code-Spezifikation dokumentiert und einfach zu reproduzieren. Für WiFi: WIFI:T:WPA;S:{ssid};P:{password};;. Für vCard: Standard BEGIN:VCARD / END:VCARD-Blöcke. Schreiben Sie statische Hilfsmethoden, wenn viele Aufrufstellen denselben Payload-Typ verwenden:

public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
    Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
$vbLabelText   $csharpLabel

Problem 2: ECCLevel-Enum-Zuordnung

QRCoder: QRCodeGenerator.ECCLevel ist ein verschachteltes Enum mit Werten L, M, Q, H. Es ist ein erforderlicher Parameter bei jedem CreateQrCode-Aufruf.

Lösung: Ordnen Sie jeden Wert seinem QRCodeWriter.QrErrorCorrectionLevel-Äquivalent zu, wenn Sie den QRCodeWriter-Weg verwenden. Wenn BarcodeWriter.CreateBarcode verwendet wird, wird das ECC-Level automatisch auf Medium gesetzt und erfordert keinen Parameter. Aktualisieren Sie jeden Anrufstandort:

// QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
// QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' QR-Code ECCLevel.H → IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)

' QR-Code ECCLevel.M → IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
$vbLabelText   $csharpLabel

Problem 3: Entfernung der Renderer-Klasse

QRCoder: Jedes Ausgabeformat erfordert eine eigene Instanzierung der Rendererklasse — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. Diese Klassen akzeptieren QRCodeData und legen GetGraphic mit unterschiedlichen Rückgabetypen offen.

Lösung: Entfernen Sie alle Instanziierungen der Renderer-Klasse. IronBarcode integriert die Formatausgabe in die Terminalmethoden der Fluent-Kette. Ersetzen Sie new PngByteQRCode(data).GetGraphic(n) durch .ToPngBinaryData() nach .ResizeTo(). Ersetzen Sie new SvgQRCode(data).GetGraphic(n) durch .SaveAsImage(path) (mit einer .svg-Erweiterung). Das QRCodeData-Zwischenobjekt verschwindet ebenfalls — es wird in IronBarcode nicht benötigt.

Ausgabe 4: Entfernung von PngByteQRCode und modulbasierte Größenanpassung

QRCoder: PngByteQRCode.GetGraphic(int pixelsPerModule) bestimmt die Ausgabe durch die Anzahl der Pixel pro QR-Modul. Die resultierenden Bildabmessungen hängen von der Anzahl der Module ab, die mit der Inhaltslänge und dem ECC-Level variiert.

Lösung: Ersetzen Sie die modulbasierte Größenanpassung durch ResizeTo(int width, int height) für absolute Pixelmaße. Wenn Ihr Code die erwartete Ausgabegröße dynamisch anhand der Modulanzahl berechnet hat, wechseln Sie zu einer festen Zielgröße, die Ihren Ausgabeanforderungen entspricht:

// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
Imports System

' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)

' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
    .ResizeTo(400, 400) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

QRCoder-Migrations-Checkliste

Vor der Migration anfallende Aufgaben

Prüfen Sie den Quellcode auf alle QRCoder-Verwendungen, bevor Sie Änderungen vornehmen:

# Find all QR-Code namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find all QR-Code namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
SHELL
  • Dokumentieren Sie alle PayloadGenerator-Typen im Einsatz und notieren Sie deren Zeichenkette-Ausgabeformate
  • Notieren Sie alle verwendeten ECC-Level-Werte und deren Aufrufstellen.
  • Identifizieren Sie jeglichen ZXing .NET -Lesecode, der zum Dekodieren mit QR-Code gekoppelt war – dieser kann gleichzeitig ersetzt werden
  • Besorgen Sie sich einen IronBarcode -Lizenzschlüssel (Testschlüssel sind ohne Registrierung erhältlich)

Aufgaben der Code-Aktualisierung

  1. Führen Sie dotnet remove package QRCoder aus
  2. Führen Sie dotnet remove package ZXing.Net aus, wenn es nur zum Lesen zusammen mit QR-Code verwendet wurde
  3. Führen Sie dotnet add package IronBarcode aus
  4. Fügen Sie IronBarCode.License.LicenseKey = "YOUR-KEY"; zum Anwendungsstart hinzu
  5. Ersetzen Sie alle using QRCoder;-Importe durch using IronBarCode;
  6. Entfernen Sie alle new QRCodeGenerator()-Instanzerklärungen — BarcodeWriter ist statisch
  7. Ersetzen Sie alle generator.CreateQrCode(data, ECCLevel.X) + Renderer-Chaining-Muster durch BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)-Chaining
  8. Ersetzen Sie .GetGraphic(n)-Aufrufe durch .ToPngBinaryData() und fügen Sie .ResizeTo(w, h) vor dem Terminal hinzu
  9. Ersetzen Sie File.WriteAllBytes(path, bytes)-Speichermuster durch .SaveAsPng(path)-Terminalmethoden
  10. Ersetzen Sie new SvgQRCode(data).GetGraphic(n) durch .SaveAsImage(path) (mit einer .svg-Erweiterung)
  11. Ersetzen Sie PayloadGenerator.WiFi(...) und andere Helferinstanzen durch direkte Formatzeichenketten
  12. Ordnen Sie jeden QRCodeGenerator.ECCLevel-Wert seinem QRCodeWriter.QrErrorCorrectionLevel-Äquivalent zu
  13. Ersetzen Sie alle ZXing.Net BarcodeReaderGeneric.Decode(bitmap)-Aufrufe durch BarcodeReader.Read(path)
  14. Für die Logoeinbettung ersetzen Sie new QRCode(data).GetGraphic(n, ..., logoBitmap) durch QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)

Post-Migrationstests

  • Scannen Sie alle generierten QR-Codes mit mindestens zwei unabhängigen QR-Code-Scanner-Anwendungen, um die Lesbarkeit zu überprüfen.
  • Verifizieren Sie, dass Logos eingebaute QR-Codes korrekt gescannt werden — bestätigen Sie, dass das Fehlerkorrektur-Level Highest ist
  • Vergleichen Sie die visuelle Ausgabe der generierten Codes mit Beispielen aus der Zeit vor der Migration, bei denen eine einheitliche Darstellung erforderlich ist.
  • Testen Sie alle PayloadGenerator-Ersetzungen — bestätigen Sie, dass WiFi-, vCard- und andere Payload-Zeichenketten auf Zielgeräten korrekt dekodiert werden
  • Falls ZXing.Net ebenfalls entfernt wurde, verifizieren Sie, dass alle Strichcode-Lesewege durch BarcodeReader.Read funktionieren
  • Führen Sie die Anwendung in einer sauberen Umgebung aus, um sicherzustellen, dass keine verbleibenden QRCoder- oder ZXing .NET -Referenzen Bindungsfehler verursachen.
  • Überprüfen Sie, ob der IronBarcode -Lizenzschlüssel in Produktions- und Testumgebungen korrekt geladen wurde.

Wichtigste Vorteile der Migration zu IronBarcode

Einzelne API für alle Barcode-Operationen: Nach der Migration verwendet jede Barcode-Aufgabe — Generierung, Lesen, PDF-Stempeln — dasselbe IronBarCode-Namensraum und dieselben Einstiegspunkte. Entwickler, die dem Projekt beitreten, lernen nur eine API anstatt drei. Die Codeüberprüfung im gesamten Barcode-Subsystem wird einheitlich. Die Dokumentensuche ist zentralisiert.

Strichcode-Lesen ohne zweite Bibliothek: BarcodeReader.Read behandelt Bilddateien, PDF-Seiten, Streams und im Speicher befindliche Bitmaps mit automatischer Format-Erkennung. Die Lesefunktion, für die bisher ZXing .NET – mit seinen Formatvorgaben und Überlegungen zur Thread-Sicherheit – erforderlich war, ist nun sofort durch einen einzigen Methodenaufruf verfügbar. Der Leitfaden zum Lesen von Barcodes aus Bildern umfasst die Erkennung mehrerer Barcodes, die Bildvorverarbeitung und das Scannen von PDF-Seiten.

Format-Erweiterung ohne neue Abhängigkeiten: Das Hinzufügen von Code 128, EAN-13, DataMatrix, PDF417oder einem anderen unterstützten Format nach der Migration erfordert nur einen anderen BarcodeEncoding-Parameterwert. Es müssen keine neuen Pakete installiert, keine neuen APIs erlernt und keine Versionskompatibilitätsprobleme behoben werden. Die neuen Formatvorgaben lassen sich durch eine einzige Änderung in einer Zeile anstatt durch eine neue Bibliotheksintegration realisieren.

Vereinfachte QR-Code-Anpassung: Logoeinbettung, Farbänderungen und Kontrolle der Ruhezone sind als benannte Methoden auf dem QRCodeWriter-Ergebnis verfügbar. Die System.Drawing.Bitmap-Abhängigkeit, die QR-Code für die Logoeinbettung erfordert, wird durch einen einfachen Dateipfad-String ersetzt. Der Leitfaden zur Anpassung des QR-Code-Stils dokumentiert alle verfügbaren Anpassungsoptionen.

Integrierte PDF-Integration: Barcodes können aus eingehenden PDF-Dokumenten gelesen und in bestehende PDF-Dateien eingefügt werden, ohne dass eine PDF-Bibliothek hinzugefügt werden muss. Dokumentenverarbeitungs-Workflows, die bisher eine separate PDF-Abhängigkeit erforderten, verfügen nun über eine integrierte Barcode- und PDF-Funktionalität.

Reduzierter langfristiger Wartungsaufwand: Durch den Wechsel von drei oder vier unabhängigen Paketen zu einem einzigen Paket entfällt der kumulative Aufwand, mehrere Releasezyklen zu verfolgen, Versionskonflikte zwischen Bibliotheken zu lösen und mehrere Testsuiten bei neuen .NET Versionen zu aktualisieren. Die Wartungskosten des Barcode-Subsystems reduzieren sich auf eine einzige Abhängigkeit von einem einzelnen Paket.

Hinweis:NetBarcode, QR-Code und ZXing.NET sind eingetragene Warenzeichen ihrer jeweiligen Eigentümer. Diese Seite ist nicht mit NetBarcode, QR-Code oder ZXing.NET verbunden, wird nicht von ihnen unterstützt oder gesponsert. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Häufig gestellte Fragen

Warum sollte ich von QRCoder.NET zu IronBarcode migrieren?

Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.

Wie kann ich QRCoder-API-Aufrufe durch IronBarcode ersetzen?

Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.

Wie viel Code ändert sich bei der Migration von QRCoder.NET zu IronBarcode?

Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.

Muss ich während der Migration sowohl QRCoder.NET als auch IronBarcode installiert lassen?

Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.

Wie lautet der NuGet-Paketname für IronBarcode?

Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.

Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu QRCoder.NET?

IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.

Erkennt IronBarcode nach der Migration von QRCoder automatisch alle Barcode-Formate?

Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.

Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?

Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.

Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?

Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.

Welche Ergebniseigenschaften ändern sich bei der Migration von QRCoder.NET zu IronBarcode?

Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.

Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?

Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.

Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?

Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an