Migrating from InfragisticsBarCodeto IronBarcode
Die meisten Barcode-Migrationen bei Infragisticserfolgen, weil das Team in einem Projekt, in dem nur die Generierung möglich war, Barcodes lesen musste – WinForms, ASP.NET Coreoder jedes Projekt außerhalb von WPF – oder weil sich die ereignisgesteuerte WPF-Reader-API für den Produktiveinsatz als zu fehleranfällig erwies. Das TaskCompletionSource Bridge-Pattern, das gemeinsame _result Feld, das gleichzeitige Aufrufe unsicher macht, und die stillen Ausfälle durch fehlende SymbologyType Flags sind häufige Gründe, warum Teams nach einer Alternative suchen.
Dieser Leitfaden beschreibt die vollständige Migration: Entfernen der Infragistics-Barcode-Pakete, Ersetzen des Generierungs- und Lesecodes sowohl in WinForms- als auch in WPF-Kontexten und Hinzufügen der Barcode-Funktionalität zu Projekttypen, für die Infragisticsüberhaupt keine Unterstützung bot.
Schnellstart
Schritt 1: Infragistics-Barcode-Pakete entfernen
Entfernen Sie die InfragisticsBarcode- NuGet Pakete aus Ihrem Projekt. Je nachdem, welche Ziele Sie verwendet haben:
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
Falls Ihre Projektdatei auf beide verweist, entfernen Sie beide. Die InfragisticsUltimate-Lizenz wird durch das Entfernen von Barcode-spezifischen Paketen nicht beeinträchtigt, sofern Sie andere Infragistics-Komponenten verwenden.
Schritt 2: IronBarcode installieren
dotnet add package IronBarcode
IronBarcode ist ein einzelnes Paket, das auf WinForms, WPF, ASP.NET Core, Konsolen, Blazor Server, Docker, Azure Functionsund AWS Lambda funktioniert. Sie benötigen keine separaten Pakete pro Framework.
Schritt 3: Namespaces aktualisieren
Ersetzen Sie InfragisticsBarcode-Namespaces durch IronBarCode (großes B, großes C):
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;Imports IronBarCodeSchritt 4: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung einmal beim Anwendungsstart hinzu — Program.cs, App.xaml.cs, oder Ihr DI-Zusammensetzungs-Root:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Beispiele für die Code-Migration
WinForms-Generierung: UltraWinBarcode zu BarcodeWriter
Das WinForms-Generierungsmuster lässt sich sauber auf den BarcodeWriter von IronBarcode abbilden:
Vorher (Infragistics WinForms):
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)Nach (IronBarcode):
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)Der Symbology Enum-Wert von Infragisticswechselt zum BarcodeEncoding Enum, der ein Parameter für CreateBarcode() ist anstatt einer Eigenschaftszuweisung. Die Daten werden zum ersten Argument. SaveTo() wird zu .SaveAsPng(), .SaveAsJpeg(), .SaveAsSvg() oder .SaveAsPdf() je nach Ihrem Ausgabeformat.
Falls Sie den Barcode vor dem Speichern verkleinern müssen:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)WPF-ereignisgesteuertes Lesen: Dienstklasse in zwei Zeilen
Dies ist der bedeutendste Rückgang der Migration. Das InfragisticsWPF-Lesemuster erfordert eine vollständige Serviceklasse:
Vorher (Infragistics WPF – ca. 35 Zeilen):
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.Value ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks
Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)
Public Sub New()
_reader = New BarcodeReader()
AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub
Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
_result = New TaskCompletionSource(Of String)()
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
_reader.SymbologyTypes = Symbology.Code128 Or
Symbology.Code39 Or
Symbology.QRCode Or
Symbology.EAN8 Or
Symbology.EAN13 Or
Symbology.UpcA Or
Symbology.Interleaved2Of5
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.Value, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End SubNach (IronBarcode — 2 Zeilen):
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")Die gesamte Dienstklasse — Instanzverwaltung, Ereignisverkabelung, TaskCompletionSource, BitmapImage Laden, Dispose() — ist verschwunden. BarcodeReader.Read() ist synchron, statisch und akzeptiert direkt einen Dateipfad als Zeichenkette.
Wenn Sie auch den Symbolisierungstyp zurückgeben würden:
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End Ifresult.Value ersetzt e.Value. result.Format ersetzt e.Symbology.
Hinzufügen von WinForms-Lesen (bisher unmöglich)
Falls Sie sich in einem WinForms-Projekt befanden, das bisher nur die Generierung unterstützte, ist nun auch das Lesen mit demselben Paket möglich:
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}Imports IronBarCode
' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
MessageBox.Show($"Found: {result.Value} ({result.Format})")
NextKeine zusätzlichen Pakete, keine frameworkspezifische Einrichtung. Der gleiche BarcodeReader.Read() Aufruf funktioniert in WinForms wie in WPF.
ASP.NET CoreEndpunkt (bisher unmöglich)
Die Generierung und das Einlesen von Barcodes in einem ASP.NET CoreController war mit den Infragistics-Paketen nicht möglich. Mit IronBarcode:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End ClassBarcodeReader.Read() akzeptiert direkt ein Stream — es ist nicht erforderlich, den Upload zuerst auf die Festplatte zu speichern.
PDF-Barcode-Lesen
IronBarcode liest Barcodes nativ aus PDF-Dokumenten – es ist kein separates Paket erforderlich:
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}Imports IronBarCode
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
NextInfragistics hatte kein Äquivalent – zum Lesen von PDF-Barcodes war es erforderlich, die PDF-Seiten vor dem Scannen extern in Bilder umzuwandeln.
Stapelverarbeitung: Von sequenziell zu parallel
Vorher (Infragistics – sequenziell, nicht parallelisierungssicher):
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();Imports System.Collections.Generic
' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
service.Dispose()Nach (IronBarcode — parallel, threadsicher):
using IronBarCode;
// Option 1: pass an array directly — IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}Imports IronBarCode
' Option 1: pass an array directly — IronBarcode handles parallelization internally
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles.ToArray(), options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Nextusing IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});Imports IronBarCode
Imports System.Collections.Concurrent
' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim results = BarcodeReader.Read(file)
For Each r In results
allValues.Add(r.Value)
Next
End Sub)Entfernen des Dispose-Musters
Wenn Ihr Code IDisposable Implementierungen rund um die InfragisticsBarcodeReader hatte, können diese vollständig entfernt werden. Der BarcodeReader von IronBarcode ist eine statische Klasse. Es gibt keine Instanz zu erstellen, keinen Ereignis-Handler zu lösen und kein Dispose() zu rufen.
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable
' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of IBarcodeService, IronBarcodeService)()Ein dünner Wrapper-Service für DI-Zwecke ist unkompliziert:
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}Imports IronBarCode
Public Class BarcodeService
Public Function Read(path As String) As IEnumerable(Of String)
Return BarcodeReader.Read(path).Select(Function(r) r.Value)
End Function
Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
End Function
End ClassKeine Konstruktor-Injektion, kein Dispose(), keine Ereignisverwaltung.
Gängige Probleme bei der Migration
Symbolisierungstyp-Flags entfernt
Die SymbologyTypes Eigenschaft beim InfragisticsWPF-Leser erforderte, dass Sie jedes Barcode-Format enumerieren, das Sie unterstützen wollten. IronBarcode hat kein Äquivalent – es erkennt alle über 50 unterstützten Formate automatisch bei jedem Lesevorgang.
Dies hat einen wichtigen Nebeneffekt: Wenn ein bestimmtes Barcode-Format zuvor stillschweigend fehlschlug, weil sein SymbologyType Flag aus der Liste fehlte, wird IronBarcode es jetzt finden. Möglicherweise tauchen in der Produktion Barcode-Werte auf, die zuvor unbemerkt geblieben sind. Das ist das korrekte Verhalten – diese Barcodes waren schon immer da.
Wenn Sie einschränken müssen, welche Formate zurückgegeben werden (aus Leistungs- oder Mehrdeutigkeitsgründen), unterstützt BarcodeReaderOptions dies:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(imagePath, options)Laden von Bitmap-Bildern nicht erforderlich
Der InfragisticsWPF-Leser erforderte das Laden von Bildern als BitmapSource Objekte über new BitmapImage(new Uri(path, UriKind.Absolute)). IronBarcode akzeptiert Dateipfadzeichenfolgen, Byte-Arrays und Datenströme direkt:
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));' All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png")
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"))
BarcodeReader.Read(File.OpenRead("path/to/image.png"))Sie können alle using System.Windows.Media.Imaging; Importe entfernen, die nur für das Laden von Barcode-Bildern da waren.
Das Muster "TaskCompletionSource" wurde entfernt.
Das TaskCompletionSource<string> Feld, das den ereignisgesteuerten DecodeComplete Rückruf in asynchronen Code überführte, ist vollständig verschwunden. BarcodeReader.Read() ist synchron und gibt seine Ergebnisse direkt zurück.
Wenn Ihr aufrufender Code await service.ReadBarcodeAsync(path) war, können Sie dies vereinfachen zu:
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";netWenn Sie eine asynchrone Schnittstelle für nachgelagerte Aufrufer beibehalten möchten, ohne einen Thread zu blockieren:
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}Option Strict On
Option Infer On
Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
Return Task.Run(Function()
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function)
End FunctionNamensänderungen der Immobilie
| Infragistics | IronBarcode |
|---|---|
e.Value (in ReaderDecodeArgs) | result.Value |
e.Symbology (in ReaderDecodeArgs) | result.Format |
barcode.Data | Erstes Argument von BarcodeWriter.CreateBarcode() |
barcode.Symbology = Symbology.Code128 | BarcodeEncoding.Code128 (Parameter) |
barcode.SaveTo(path) | .SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path) |
Migrations-Checkliste
Verwenden Sie diese grep-Muster, um alle Infragistics-Barcode-Verwendungen in Ihrer Codebasis zu finden:
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
Arbeiten Sie jedes Spiel einzeln durch:
UltraWinBarcodeVerwendungen: Ersetzen mitBarcodeWriter.CreateBarcode()new BarcodeReader()+DecodeCompleteBlöcke: Ersetzen mitBarcodeReader.Read()SymbologyTypeFlag-Listen: komplett entfernenBitmapImageLadevorgänge für Barcode-Eingaben: Ersetzen durch direkten Pfad/Stream/BytesReaderDecodeArgs eRückrufkörper: @--CODE-1555--@@ extrahieren →result.Value,e.Symbology→result.FormatIDisposablein Barcode-Dienstklassen: Entfernen, wenn die einzige wegwerfbare Ressource_readerwar
Funktionsvergleich
| Feature | InfragisticsBarCode | IronBarcode |
|---|---|---|
| WinForms-Barcode-Generierung | Ja (UltraWinBarcode) | Ja |
| WinForms-Barcode-Lesen | Nicht verfügbar | Ja |
| WPF-Barcode-Generierung | Ja (XamBarcode) | Ja |
| WPF-Barcode-Lesen | Ja (ereignisgesteuert) | Ja (synchron) |
| ASP.NET Core | Nicht verfügbar | Ja |
| Konsolen-/Arbeitsdienst | Nicht verfügbar | Ja |
| Docker/Linux | Nicht verfügbar | Ja |
| Azure Functions | Nicht verfügbar | Ja |
| Blazor -Server | Nicht verfügbar | Ja |
| Automatische Formaterkennung | Nein – SymbologyType-Flags erforderlich | Ja |
| PDF-Barcode-Lesen | Nicht verfügbar | Ja (Muttersprachler) |
| Threadsichere gleichzeitige Lesevorgänge | Nein | Ja |
| Stapelverarbeitung (integriert) | Nein | Ja |
| QR-Fehlerkorrektursteuerung | Nicht verfügbar | Ja |
| Statische API (keine Instanz) | Nein | Ja |
| Suite -Abonnement erforderlich | Ja (Infragistics Ultimate, $2.399+/Jahr) | Nein |
| Unbefristete Lizenz | Nein | Ja – ab 749 $ |
Wichtigste Vorteile nach der Migration
Barcodelesen in WinForms. Wenn die Migration durch eine WinForms-Leseanforderung getrieben wurde, ist dies das primäre Ergebnis: BarcodeReader.Read(imagePath) kompiliert und läuft in WinForms ohne zusätzliche Einrichtung.
ASP.NET Core und Konsolenunterstützung. Web-APIs, Hintergrunddienste und Konsolentools können nun mit demselben Paket sowohl Barcodes generieren als auch lesen. Falls Sie für diese Projekttypen separate Toolchains oder Workarounds verwendet haben, gehören diese der Vergangenheit an.
Kein Ereignishandler-Vorlage. Der DecodeComplete Handler, die TaskCompletionSource Brücke, das BitmapImage Laden und die Dispose() Bereinigung sind alle entfernt worden. Die Barcode-Logik ist das, was übrig bleibt.
Keine Symbologien-Spezifikation. Formate, die aufgrund fehlender SymbologyType Flags in der Vergangenheit stillschweigend fehlschlugen, werden jetzt korrekt erkannt. Die automatische Erkennung deckt alle über 50 Formate ohne Konfiguration ab.
Gleiche Dienstklasse über alle Projekttypen hinweg. Eine einzige BarcodeService Verpackung mit BarcodeReader.Read() und BarcodeWriter.CreateBarcode() kann über WinForms, WPF, ASP.NET Coreund jedes andere Projekt in der Lösung geteilt werden. Keine frameworkspezifischen Implementierungen.
Für die Barcode-Funktionalität allein ist kein InfragisticsUltimate-Abonnement erforderlich. Falls die Barcode-Unterstützung der einzige Grund für ein InfragisticsUltimate-Abonnement in Ihrem Projekt war oder ein wesentlicher Entscheidungsfaktor, ist IronBarcode eine eigenständige Lösung mit unbefristeten Lizenzoptionen ab 749 US-Dollar für einen einzelnen Entwickler.
Die Migration selbst ist ein rein mechanischer Vorgang, sobald man alle Infragistics-Barcode-Verwendungen lokalisiert hat. Der aufwendigste Teil ist der Ersatz der WPF-Dienstklasse, und selbst das reduziert sich auf das Entfernen der Klasse und das Ersetzen von Aufrufen mit BarcodeReader.Read(). Die Generationsmigration ist eine Eins-zu-Eins-Umbenennung von Eigenschaften/Methoden. Sie erhalten im Gegenzug eine einzige, konsistente API, die in jedem benötigten Projekttyp funktioniert.

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 Handbücher.