FILMY

Migrating from DevExpress BarCode to IronBarcode

Curtis Chau
Curtis Chau
Updated: 20 czerwca 2026

Jeśli korzystasz z DevExpress w zakresie elementów sterujących siatki, wykresów, harmonogramów lub tabel przestawnych, zachowaj je. Ta migracja dotyczy zastąpienia BarCodeControl biblioteką, która potrafi również odczytywać kody kreskowe, działać bezgłowowo i być wdrażana poza kontekstem interfejsu użytkownika. Migracja ta nie ma wpływu na kontrolki interfejsu użytkownika DevExpress, z których korzystasz w aplikacjach WinForms lub Blazor. Zmienia się tylko kod dotyczący kodów kreskowych.

Typowy scenariusz, który skłania do tej migracji, to jedna z trzech sytuacji: pojawia się zapotrzebowanie na czytanie, a DevExpress nie jest w stanie go zaspokoić; Nowa usługa wymaga generowania BARCODE-ów w .NET Core lub funkcji chmurowej, w której nie ma zestawów WinForms; lub nadchodzi czas odnowienia Suite, a kalkulacja kosztu na funkcję przy użyciu pełnego zestawu narzędzi UI wyłącznie do generowania BarCode przestaje mieć sens.

Krok 1: Zainstaluj IronBarcode

> dotnet add package BarCode

Jeśli w tym samym projekcie znajdują się inne kontrolki DevExpress, należy pozostawić pakiety DevExpress NuGet na miejscu. Zmienia się tylko kod związany z kodami BarCode w plikach źródłowych. Jeśli generowanie kodów kreskowych było jedynym powodem, dla którego DevExpress pojawił się w danym projekcie, a nie używasz tam żadnych innych kontrolek DX, możesz usunąć pakiety DevExpress z tego projektu po migracji:

# Only remove DevExpress packages if no other DX controls are used in this project
dotnet remove package DevExpress.Win.Navigation
SHELL

Krok 2: Dodaj inicjalizację licencji

Dodaj aktywację licencji IronBarcode raz przy starcie aplikacji - w Program.cs, App.xaml.cs lub w twoim host builderze:

// In Program.cs (ASP.NET Core) or application entry point
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Brak połączenia sieciowego. Brak kodów błędów do sprawdzenia. Walidacja lokalna.

Krok 3: Zastąp kod specyficzny dla BarCode

Przeszukaj swój kod źródłowy pod kątem typów BARCODE-ów DevExpress. Wszystko inne pozostaje bez zmian:

# Find barcode-related DevExpress usage — ignore grid, chart, and other DX components
grep -r "BarCodeControl\|Code128Generator\|QRCodeGenerator\|DataMatrixGenerator\|PDF417Generator\|AztecCodeGenerator\|DevExpress.XtraPrinting.BarCode" --include="*.cs" .
grep -r "barCode\.Module\|DrawToBitmap\|BarCode\.Symbology" --include="*.cs" .
SHELL

Wyniki tego wyszukiwania są dokładnie tym, co należy zastąpić. Nic więcej.

Przykłady migracji kodu

Generowanie kodu 128

Jest to najczęstszy rodzaj migracji. BarCodeControl z Code128Generator symbologią staje się pojedynczym wywołaniem BarcodeWriter.CreateBarcode.

Przed - Kontrolka DevExpress WinForms:

using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
using System.Drawing;
using System.Drawing.Imaging;

public void GenerateCode128(string data, string outputPath)
{
    var barCode = new BarCodeControl();
    var symbology = new Code128Generator();
    symbology.CharacterSet = Code128CharacterSet.CharsetAuto;
    barCode.Symbology = symbology;
    barCode.Text = data;
    barCode.Module = 0.02f;
    barCode.ShowText = true;

    barCode.Width = 400;
    barCode.Height = 100;
    var bitmap = new Bitmap(barCode.Width, barCode.Height);
    barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
    bitmap.Save(outputPath, ImageFormat.Png);
    bitmap.Dispose();
}

Po - IronBarcode:

// NuGet: dotnet add package BarCode
using IronBarCode;

public void GenerateCode128(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(400, 100)
        .SaveAsPng(outputPath);
}

Rozmiar dokumentu barCode.Module = 0.02f w jednostkach dokumentu został usunięty. .ResizeTo(400, 100) przyjmuje piksele bezpośrednio. Ręczne przypisanie Bitmap i wywołanie DrawToBitmap zostaje zamienione na .SaveAsPng(), które automatycznie obsługuje rozmiarowanie.

Generowanie kodów QR

Przed - DevExpress QR z poprawkami błędów:

using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;
using System.Drawing;
using System.Drawing.Imaging;

public void GenerateQrCode(string url, string outputPath)
{
    var barCode = new BarCodeControl();
    var symbology = new QRCodeGenerator();
    symbology.ErrorCorrectionLevel = QRCodeErrorCorrectionLevel.H;
    symbology.CompactionMode = QRCodeCompactionMode.AlphaNumeric;
    barCode.Symbology = symbology;
    barCode.Text = url;

    barCode.Width = 500;
    barCode.Height = 500;
    var bitmap = new Bitmap(barCode.Width, barCode.Height);
    barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
    bitmap.Save(outputPath, ImageFormat.Png);
    bitmap.Dispose();
}

Po - IronBarcode:

using IronBarCode;

public void GenerateQrCode(string url, string outputPath)
{
    QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
        .SaveAsPng(outputPath);
}

QRCodeErrorCorrectionLevel.H mapuje się na QRCodeWriter.QrErrorCorrectionLevel.Highest. Ustawienia CompactionMode.AlphaNumeric są automatycznie obsługiwane przez IronBarcode w oparciu o zawartość.

Kod QR z logo marki (zupełnie nowa funkcja - niemożliwa do zrealizowania w DevExpress):

using IronBarCode;

public void GenerateBrandedQrCode(string url, string logoPath, string outputPath)
{
    QRCodeWriter.CreateQrCode(url, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
        .AddBrandLogo(logoPath)
        .SaveAsPng(outputPath);
}

Generowanie kodów Data Matrix

Przed - DevExpress:

using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;

var barCode = new BarCodeControl();
var symbology = new DataMatrixGenerator();
symbology.MatrixSize = DataMatrixSize.Matrix26x26;
barCode.Symbology = symbology;
barCode.Text = "PART-7734-X";
// ... DrawToBitmap pattern

Po - IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("PART-7734-X", BarcodeEncoding.DataMatrix)
    .ResizeTo(260, 260)
    .SaveAsPng("datamatrix.png");

Generowanie kodów PDF417

Przed - DevExpress:

using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;

var barCode = new BarCodeControl();
barCode.Symbology = new PDF417Generator();
barCode.Text = "SHIPMENT-DATA-2026";
// ... DrawToBitmap pattern

Po - IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("SHIPMENT-DATA-2026", BarcodeEncoding.PDF417)
    .ResizeTo(400, 150)
    .SaveAsPng("pdf417.png");

Dodawanie funkcji czytania (nowa funkcja)

DevExpress nie udostępnia API do odczytu. Jeśli pojawiła się potrzeba odczytu, właśnie w tym momencie IronBarcode natychmiast się zwraca:

using IronBarCode;

// Read from an image file
var results = BarcodeReader.Read("uploaded-label.png");
foreach (var result in results)
{
    Console.WriteLine($"Found {result.Format}: {result.Value}");
}

// Read with options for better accuracy on difficult images
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};
var detailedResults = BarcodeReader.Read("multi-barcode-sheet.png", options);

Punkt końcowy BarCode ASP.NET Core

To nie było osiągalne z BarCodeControl bez obejść WinForms. IronBarcode obsługuje to natywnie:

using IronBarCode;

// In Program.cs or a controller
app.MapGet("/label/{sku}", (string sku) =>
{
    var pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 100)
        .ToPngBinaryData();

    return Results.File(pngBytes, "image/png", $"{sku}.png");
});

app.MapGet("/qr/{data}", (string data) =>
{
    var pngBytes = QRCodeWriter.CreateQrCode(data, 300, QRCodeWriter.QrErrorCorrectionLevel.Highest)
        .ToPngBinaryData();

    return Results.File(pngBytes, "image/png");
});

Odczytywanie BarCodes z plików PDF

IronBarcode odczytuje pliki PDF w sposób natywny. Bez PdfiumViewer, bez pętli renderowania, bez dodatkowych pakietów:

using IronBarCode;

// Read all barcodes from all pages of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var result in results)
{
    Console.WriteLine($"Barcode: {result.Value} | Format: {result.Format}");
}

Typowe problemy związane z migracją

BarCode.Module wykorzystuje jednostki dokumentu, a nie piksele

barCode.Module kontroluje szerokość najwęższego paska w jednostkach dokumentu (zależnych od kontekstu DPI renderowania). Nie chodzi tu o liczbę pikseli. Podczas migracji nie próbuj przeliczać wartości modułu na piksele - zamiast tego zdecyduj się, jakie wymiary w pikselach chcesz i użyj .ResizeTo(width, height) bezpośrednio.

// Before: barCode.Module = 0.02f  — document units, indirect sizing
// After:
.ResizeTo(400, 100)  // explicit pixel dimensions

DrawToBitmap wymaga wstępnie przydzielonej mapy bitowej

Stary wzór przydzielał Bitmap o określonym rozmiarze, a następnie wywoływał DrawToBitmap, aby renderować do niego. .SaveAsPng() IronBarcode obsługuje to wszystko wewnętrznie. Nie przydzielasz niczego z góry.

// Before: must know size upfront, allocate, draw, save, dispose
barCode.Width = 400;
barCode.Height = 100;
var bitmap = new Bitmap(barCode.Width, barCode.Height);
barCode.DrawToBitmap(bitmap, new Rectangle(0, 0, barCode.Width, barCode.Height));
bitmap.Save(path, ImageFormat.Png);
bitmap.Dispose();

// After: size specified once, everything else handled
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng(path);

Powiązanie danych w WinForms

Jeśli BarCodeControl był powiązany z źródłem danych w projektancie WinForms, równoważny IronBarcode to wyraźnie odczytanie wartości z modelu i przekazanie jej do BarcodeWriter.CreateBarcode. IronBarcode nie uczestniczy w powiązaniu danych WinForms - jest to programowe API, a nie kontrolka interfejsu użytkownika. Jeśli potrzebujesz wyświetlić wygenerowany kod kreskowy na formularzu, wygeneruj bajty obrazu i ustaw je na PictureBox:

using IronBarCode;

// Generate and display in a WinForms PictureBox
private void UpdateBarcodeDisplay(string value)
{
    var bytes = BarcodeWriter.CreateBarcode(value, BarcodeEncoding.Code128)
        .ResizeTo(400, 100)
        .ToPngBinaryData();

    using var ms = new System.IO.MemoryStream(bytes);
    pictureBox1.Image = System.Drawing.Image.FromStream(ms);
}

Zastąpienie przestrzeni nazw

Stare importy do usunięcia:

// Remove these
using DevExpress.XtraEditors;
using DevExpress.XtraPrinting.BarCode;

Nowy import do dodania:

// Add this
using IronBarCode;

Przewodnik po mapowaniu API

DevExpress BarCodeOdpowiednik IronBarcode
new BarCodeControl()Statyczne - brak instancji
new Code128Generator() + barCode.Symbology = symbologyBarcodeEncoding.Code128 parametr
new QRCodeGenerator() + QRCodeErrorCorrectionLevel.HQRCodeWriter.CreateQrCode(data, size, QRCodeWriter.QrErrorCorrectionLevel.Highest)
new DataMatrixGenerator() + DataMatrixSize.Matrix26x26BarcodeWriter.CreateBarcode(data, BarcodeEncoding.DataMatrix)
new PDF417Generator()BarcodeWriter.CreateBarcode(data, BarcodeEncoding.PDF417)
new AztecCodeGenerator()BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Aztec)
barCode.Text = valuePierwszy argument do CreateBarcode lub CreateQrCode
barCode.Module = 0.02f.ResizeTo(width, height) w pikselach
barCode.ShowText = true.AddBarcodeText()
DrawToBitmap(bitmap, rect).SaveAsPng(path)
new Bitmap(w, h) + ręczna likwidacjaNie jest potrzebne
Bitmap → MemoryStream → HTTP.ToPngBinaryData()
Brak API do odczytuBarcodeReader.Read(path)
using DevExpress.XtraEditors + using DevExpress.XtraPrinting.BarCodeusing IronBarCode

Lista kontrolna migracji

Użyj tego wzorca grep, aby znaleźć wszystkie pliki wymagające aktualizacji:

grep -r "BarCodeControl\|Code128Generator\|QRCodeGenerator\|DataMatrixGenerator\|PDF417Generator\|AztecCodeGenerator" --include="*.cs" .
grep -r "barCode\.Module\|barCode\.Symbology\|DrawToBitmap\|DevExpress\.XtraPrinting\.BarCode" --include="*.cs" .
SHELL

Przejrzyj wszystkie dopasowania:

  • Zastąp using DevExpress.XtraEditors; i using DevExpress.XtraPrinting.BarCode; przez using IronBarCode;
  • Zastąp new BarCodeControl() + konfigurację symboliki przez BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)
  • Zastąp new QRCodeGenerator() + konfigurację symboliki przez QRCodeWriter.CreateQrCode(data, size, errorLevel)
  • Zastąp barCode.Module = X przez .ResizeTo(width, height)
  • Zastąp wzory DrawToBitmap + bitmap.Save przez .SaveAsPng(path)
  • Zastąp wzory Bitmap-to-MemoryStream przez .ToPngBinaryData()
  • Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" przy starcie aplikacji
  • Dodaj wywołania BarcodeReader.Read() wszędzie tam, gdzie potrzebna jest możliwość odczytu

Jeśli w projekcie wykorzystuje się DevExpress wyłącznie do obsługi kodów kreskowych, a nie stosuje się innych komponentów DX, należy usunąć pakiety DevExpress NuGet po zastąpieniu wszystkich odwołań do kodów kreskowych. Jeśli w projekcie wykorzystywane są kontrolki siatki, wykresów lub inne kontrolki interfejsu użytkownika DevExpress, należy pozostawić te pakiety na miejscu - migracja dotyczy wyłącznie kodu kodu BarCode.

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.

Czytaj więcej

Powiązane artykuły