Przejdź do treści stopki
FILMY

Jak tworzyć BarCodes jako strumienie w języku C# przy użyciu IronBarcode

Migrating fromBarcode4NETto IronBarcode

Ten przewodnik po migracji obejmuje usunięcie zależności odBarcode4NETi zastąpienie jej IronBarcode, wraz z instrukcjami krok po kroku, porównaniami kodu i praktycznymi przykładami dla programistów .NET podejmujących tę zmianę.Barcode4NETzakończył swój cykl życia bez formalnego ogłoszenia — zaprzestano sprzedaży nowych licencji, nigdy nie opublikowano pakietu NuGet, a biblioteka działa wyłącznie na platformie .NET Framework. Ten przewodnik jest praktyczny i konkretny: obejmuje usuwanie odwołania do biblioteki DLL, instalacjęIronBarcode za pośrednictwem NuGet oraz konwersję kodu generującego. Obejmuje również funkcje odczytu i obsługi plików PDF, które stają się dostępne po migracji, a które w ogóle nie były dostępne w Barcode4NET.

Dlaczego warto przejść z Barcode4NET

Zespoły migrujące zBarcode4NETzgłaszają następujące powtarzające się problemy:

Brak nowych licencji: LicencjeBarcode4NETnie są już sprzedawane za pośrednictwem ComponentSource ani żadnego innego kanału. Jeśli programista dołącza do zespołu korzystającego z Barcode4NET, nie ma mechanizmu umożliwiającego zakup licencji dla niego. Wykonawca dołączający do projektu lub drugi programista, który musi pracować nad funkcjami BarCode, nie może uzyskać legalnej licencji na podstawie oryginalnych warunków produktu.

Brak pakietu NuGet: Nie jest to drobna niedogodność — to fundamentalna niezgodność z nowoczesnymi procesami pracy w środowisku .NET. Każdy programista, który klonuje repozytorium, musi wiedzieć, gdzie znajduje się biblioteka DLL. Aby je zlokalizować, należy ręcznie skonfigurować potoki CI/CD. Komenda dotnet restore nie rozwiazuje problemu. Plik DLL jest albo dodawany do systemu kontroli wersji, albo przechowywany w prywatnym magazynie artefaktów, co w obu przypadkach wymaga ciągłej ręcznej konserwacji.

Brak obsługi .NET 5, 6, 7, 8 lub 9:Barcode4NETjest przeznaczony wyłącznie dla platformy .NET Framework. Gdy organizacja aktualizuje swoje docelowe srodowisko do net8.0, budowanie projektu nie powiedzie sie, poniewaz biblioteka byla skompilowana przeciwko zestawom .NET Framework, ktore nie sa juz referencjonowane. Nie będzie żadnej poprawki. Jeśli zespół musi przejść na nowoczesny .NET ze względu na wydajność, wdrożenie w systemie Linux lub Dockerze albo długoterminowe wsparcie Microsoftu,Barcode4NETjest niezbędnym rozwiązaniem.

Brak poprawek bezpieczeństwa: Biblioteka jest zamrożona w stanie, w jakim znajdowała się w momencie wstrzymania prac nad nią. Wszelkie problemy związane z bezpieczeństwem wykryte od tego czasu pozostają na stałe nierozwiązane. Nie ma systemu śledzenia błędów, osoby odpowiedzialnej za utrzymanie ani procesu reagowania dostawcy.

Brak poprawek błędów: Jeśli pojawi się problem z renderowaniem w przypadku konkretnego wariantu symboliki lub skrajnego przypadku wymiarów BarCode, nie ma możliwości rozwiązania tego problemu. Biblioteka nie będzie aktualizowana.

Podstawowy problem

Najczęstszym momentem odkrycia jest aktualizacja docelowego frameworka przez programistę w trakcie projektu modernizacji .NET Framework. Kompilacja kończy się niepowodzeniem, ponieważ biblioteka DLLBarcode4NETzostała skompilowana przy użyciu zestawów .NET Framework, które nie są już dostępne w nowym środowisku docelowym. Problem nie leży w samym API generowania — chodzi o podstawową zależność, która nie pozwala na dalszy postęp.

//Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
//Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
//   <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.Width = 300
barcode.Height = 100
Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
barcodeImage.Save(outputPath, ImageFormat.Png)
$vbLabelText   $csharpLabel
//IronBarcode— NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
//IronBarcode— NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
Imports IronBarCode

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

BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

IronBarcode a Barcode4NET: porównanie funkcji

Funkcja Barcode4NET IronBarcode
Pakiet NuGet Nie — tylko ręczna biblioteka DLL Tak (IronBarcode)
Obsługa platformy .NET Framework Tak (tylko .NET Framework) Tak (.NET Framework 4.6.2+)
Obsługa .NET Core / .NET 5+ Nie Tak (.NET 5, 6, 7, 8, 9)
Obsługa systemów Linux / macOS Nie Tak
Obsługa Docker Nie Tak
Azure / AWS Lambda Nie Tak
Generowanie BarCode'ów Tak Tak
Odczytywanie/skanowanie BarCode Nie Tak (BarcodeReader.Read())
Odczytywanie BarCodes z plików PDF Nie Tak (język ojczysty, bez dodatkowej biblioteki)
Kod QR z logo Nie Tak (AddBrandLogo())
Płynny, łańcuchowy interfejs API Nie Tak
Aktywna konserwacja Nie (koniec cyklu życia) Tak
Dostępne są nowe licencje Nie Tak — Lite $749, Plus $1,499, Pro $2,999, Bez ograniczeń $5,999
Poprawki bezpieczeństwa Nie Tak
Integracja z potokiem CI/CD Instrukcja kopiowania plików DLL Standardowe dotnet restore

Szybki start: Migracja zBarcode4NETdo IronBarcode

Migrację można rozpocząć natychmiast, wykonując te podstawowe kroki.

Krok 1: Zastąp pakiet NuGet

Barcode4NET nigdy nie bylo dystrybuowane jako paczka NuGet, wiec nie ma komendy dotnet remove package. Usuń to ręcznie.

Usuń bibliotekę DLL z kontroli wersji i przygotuj ją do usunięcia:

git rm -r ThirdParty/Barcode4NET/
git rm -r ThirdParty/Barcode4NET/
SHELL

Usun element <Reference> z kazdego pliku .csproj. Przeszukaj calosc rozwiazania, aby znalezc wszystkie pliki wymagajace aktualizacji:

grep -rl "Barcode4NET" --include="*.csproj" .
grep -rl "Barcode4NET" --include="*.csproj" .
SHELL

Usun ten element z kazdego pliku .csproj, ktory go zawiera:

<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
<Reference Include="Barcode4NET">
  <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
XML

Następnie zainstaluj IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

To pojedyncze polecenie dodaje IronBarcode i rozwiązuje wszystkie zależności. Bez zarządzania bibliotekami DLL, bez magazynu artefaktów, bez ręcznego kopiowania.

Krok 2: Aktualizacja przestrzeni nazw

Zamien stara dyrektywe using na poczatku kazdego pliku, ktory uzywal Barcode4NET:

// Before
using Barcode4NET;

// After
using IronBarCode;
// Before
using Barcode4NET;

// After
using IronBarCode;
Imports Barcode4NET

' After
Imports IronBarCode
$vbLabelText   $csharpLabel

Krok 3: Inicjalizacja licencji

Dodaj inicjalizacje licencji podczas uruchamiania aplikacji — w Program.cs, Startup.cs, lub gdziekolwiek aplikacja jest bootstrappingowana:

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

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

Przykłady migracji kodu

Podstawowe generowanie etykiet

Najbardziej powszechny wzorzec Barcode4NET: utworzenie obiektu, ustawienie wlasciwosci, wywolanie GenerateBarcode(), aby otrzymac Bitmap, a nastepnie zapisanie go.

Podejście Barcode4NET:

using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;

public void SaveLabel(string sku, string outputPath)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = sku;
    barcode.Width = 400;
    barcode.Height = 120;
    Bitmap barcodeImage = barcode.GenerateBarcode();
    barcodeImage.Save(outputPath, ImageFormat.Png);
}
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging

Public Sub SaveLabel(sku As String, outputPath As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = sku
    barcode.Width = 400
    barcode.Height = 120
    Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
    barcodeImage.Save(outputPath, ImageFormat.Png)
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public void SaveLabel(string sku, string outputPath)
{
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub SaveLabel(sku As String, outputPath As String)
    BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
        .ResizeTo(400, 120) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

Blok ustawiający właściwości zwija się w jeden płynny łańcuch. Wywolanie .ResizeTo() zastepuje przypisania wlasciwosci Width i Height. .SaveAsPng() zastepuje zarowno GenerateBarcode(), jak i osobne wywolanie barcodeImage.Save(). Aby uzyskać dodatkowe opcje generowania, zapoznaj się z dokumentacją dotyczącą generowania kodów kreskowych IronBarcode.

Wyświetlanie PictureBox w WinForms

Jesli twoj kodBarcode4NETprzypisywal wartosc zwrotna Bitmap bezposrednio do PictureBox lub podobnej kontroli, zamiast tego zaladujesz tablice bajtow przez MemoryStream.

Podejście Barcode4NET:

using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
using Barcode4NET;
using System.Drawing;

private void RefreshBarcodeDisplay(string data)
{
    var barcode = new Barcode4NET.Barcode();
    barcode.Symbology = Symbology.Code128;
    barcode.Data = data;
    barcode.Width = 300;
    barcode.Height = 100;
    pictureBox1.Image = barcode.GenerateBarcode();
}
Imports Barcode4NET
Imports System.Drawing

Private Sub RefreshBarcodeDisplay(data As String)
    Dim barcode As New Barcode4NET.Barcode()
    barcode.Symbology = Symbology.Code128
    barcode.Data = data
    barcode.Width = 300
    barcode.Height = 100
    pictureBox1.Image = barcode.GenerateBarcode()
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
using IronBarCode;
using System.Drawing;
using System.IO;

private void RefreshBarcodeDisplay(string data)
{
    byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .ToPngBinaryData();

    using var stream = new MemoryStream(pngBytes);
    pictureBox1.Image = Image.FromStream(stream);
}
Imports IronBarCode
Imports System.Drawing
Imports System.IO

Private Sub RefreshBarcodeDisplay(data As String)
    Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .ToPngBinaryData()

    Using stream As New MemoryStream(pngBytes)
        pictureBox1.Image = Image.FromStream(stream)
    End Using
End Sub
$vbLabelText   $csharpLabel

Krok MemoryStream to jedyne strukturalne dodanie. Wszystko inne to bezpośrednie tłumaczenie z wzorca ustawiającego właściwości na łańcuch płynny.

Generowanie kodów QR

Podejście Barcode4NET:

using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
using Barcode4NET;

var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing.Imaging

Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.QRCode
barcode.Data = "https://example.com/product/99"
barcode.Width = 300
barcode.Height = 300
Dim qrImage As Bitmap = barcode.GenerateBarcode()
qrImage.Save("qr.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
    .SaveAsPng("qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com/product/99", 300) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode uzywa dedykowanej klasy QRCodeWriter dla kodow QR, ktora umożliwia dostęp do opcji specyficznych dla QR, takich jak poziom korekty błędów i umieszczanie logo marki. Drugi parametr dla QRCodeWriter.CreateQrCode() to rozmiar piksela kwadratowego obrazu.

Dodawanie funkcji odczytu BarCode

Barcode4NET nie posiadał API do odczytu. Jeśli Twoja aplikacja przetwarza zeskanowane dokumenty, weryfikuje wygenerowane BARCODES lub wyodrębnia dane z faktur w formacie PDF, funkcja ta jest dostępna natychmiast po migracji bez konieczności dodawania drugiej biblioteki.

Podejście Barcode4NET:

// Nie reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
// Nie reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
' Nie reading API available in Barcode4NET.
' Required a separate library (e.g., ZXing.Net) to decode barcodes.
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

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

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
using IronBarCode;

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

// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
Imports IronBarCode

' Read a barcode from an image file
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Symbology: {result.Format}")
Next

' Read all barcodes from a PDF — pages are handled automatically
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
$vbLabelText   $csharpLabel

Czytanie plików PDF nie wymaga żadnej dodatkowej biblioteki. BarcodeReader.Read() obsluguje oba wejscia, obrazy i PDF, natywnie. Opcje konfiguracyjne, w tym prędkość odczytu i wykrywanie wielu kodów kreskowych, można znaleźć w dokumentacji dotyczącej odczytu kodów kreskowych.

Aktualizacja docelowej platformy

Po usunięciuBarcode4NETznika również ograniczenie dotyczące .NET Framework. Zaktualizuj element TargetFramework w swoim .csproj:

Podejście Barcode4NET:


<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>
XML

Podejście IronBarcode:


<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
XML

IronBarcode obsługuje platformy od .NET Framework 4.6.2 do .NET 9, więc docelową platformę można zaktualizować do wersji, na której opiera się Twoja organizacja, bez żadnych ograniczeń ze strony biblioteki kodów kreskowych.

Kontroler ASP.NET Core — zwracanie BarCode jako odpowiedzi obrazkowej

Jeśli jednocześnie modernizujesz aplikację Web Forms, oto wzorzec .NET Core służący do zwracania obrazu BARCODE z akcji kontrolera:

Podejście Barcode4NET:

//Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
//Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
'Barcode4NET was not compatible with ASP.NET Core.
'Web Forms HttpHandler was required for image delivery.
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
    [HttpGet("{data}")]
    public IActionResult Get(string data)
    {
        byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
            .ResizeTo(400, 120)
            .ToPngBinaryData();

        return File(pngBytes, "image/png");
    }
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc

<ApiController>
<Route("api/barcodes")>
Public Class BarcodesController
    Inherits ControllerBase

    <HttpGet("{data}")>
    Public Function [Get](data As String) As IActionResult
        Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
            .ResizeTo(400, 120) _
            .ToPngBinaryData()

        Return File(pngBytes, "image/png")
    End Function
End Class
$vbLabelText   $csharpLabel

.ToPngBinaryData() zwraca bezposrednio byte[], ktory pasuje do wyniku File() bez zadnej posredniej konwersji.

Barcode4NETAPI do IronBarcode Mapping Reference

Barcode4NET IronBarcode
new Barcode4NET.Barcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 (parametr dla CreateBarcode)
barcode.Data = "ITEM-12345" Pierwszy parametr CreateBarcode()
barcode.Width = 300; BARCODE.Height = 100 .ResizeTo(300, 100)
barcode.GenerateBarcode() zwraca Bitmap .SaveAsPng(path) / .ToPngBinaryData()
Symbology.QRCode BarcodeEncoding.QRCode
Symbology.Code39 BarcodeEncoding.Code39
Symbology.EAN13 BarcodeEncoding.EAN13
Symbology.UPCA BarcodeEncoding.UPCA
<Reference Include="Barcode4NET"> <PackageReference Include="IronBarcode" />
.NET Framework only .NET Framework 4.6.2 through .NET 9
Tylko generowanie Generowanie + odczytywanie (BarcodeReader.Read())
Brak obsługi plików PDF BarcodeReader.Read("doc.pdf") natywny

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Brak dotnet remove package dla referencji DLL

Barcode4NET: PonieważBarcode4NETnigdy nie był pakietem NuGet, nie ma polecenia menedżera pakietów, które pozwoliłoby go usunąć. Element <Reference Include="Barcode4NET"> musi byc usuniety z kazdego pliku .csproj recznie, a katalog DLL musi byc usuniety z kontroli zrodla wyraznie.

Rozwiązanie: Uruchom wyszukiwanie, aby zlokalizować wszystkie pliki projektu, które odwołują się do biblioteki DLL, a następnie usuń te elementy ręcznie:

grep -rn "Barcode4NET" --include="*.csproj" .
grep -rn "Barcode4NET" --include="*.csproj" .
SHELL

Nie należy pozostawiać odwołania do biblioteki DLL obok nowego odwołania do NuGet — spowoduje to błędy kompilacji wynikające z niejednoznacznego rozpoznawania typów.

Problem 2: Zmiana typu zwracanego z bitmapy na tablicę bajtów

Barcode4NET: GenerateBarcode() returns System.Drawing.Bitmap. Kod, ktory przypisuje wartosc zwrotna zmiennej typu Bitmap lub przekazuje ja do dowolnej metody oczekujacej Bitmap — takiej jak PictureBox — musi byc zaktualizowany.

Rozwiazanie: Zamien przypisania .GenerateBarcode() na .ToPngBinaryData() i zaladuj tablice bajtow przez MemoryStream w miejscu wywolania:

byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .ToPngBinaryData();

using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
Imports System.IO

Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .ToPngBinaryData()

Using stream As New MemoryStream(pngBytes)
    pictureBox1.Image = Image.FromStream(stream)
End Using
$vbLabelText   $csharpLabel

Przeszukanie rozwiazania pod katem .GenerateBarcode() zlokalizuje wszystkie miejsca wywolania wymagajace aktualizacji.

Problem 3: Zmiana przestrzeni nazw enumów symboli

Barcode4NET: Uzywa Symbology.Code128, Symbology.QRCode, Symbology.Code39, i podobnych wartosci z przestrzeni nazw Barcode4NET.

Rozwiazanie: Zamien na wartosci enum BarcodeEncoding. Wszystkie nazwy własne pozostają niezmienione — zmienia się jedynie nazwa typu:

// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
// Before
barcode.Symbology = Symbology.Code128;

// After
BarcodeEncoding.Code128  // passed as parameter to CreateBarcode()
' Before
barcode.Symbology = Symbology.Code128

' After
BarcodeEncoding.Code128  ' passed as parameter to CreateBarcode()
$vbLabelText   $csharpLabel

Przeszukanie i zamiana Symbology. na BarcodeEncoding. dla calego rozwiazania obejmuje wiekszosc przypadkow. Sprawdź każde zamienione słowo, aby upewnić się, że pasuje do kontekstu.

Problem 4: Szerokość i wysokość są teraz metodami, a nie właściwościami

BarCode4NET: Rozmiar został skonfigurowany jako dwa oddzielne przypisania właściwości:barcode.Width = 300; BarCode.Height = 100;

Rozwiazanie: Uzyj ciaglej metody .ResizeTo(width, height). To jest na tyle syntaktycznie inne, ze proste wyszukiwanie i zamiana tego nie zlapie — znajdz .Width = i .Height = w kodzie zwiazanym z kodami kreskowymi i zaktualizuj kazda wystepujaca sytuacje:

// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
// Before
barcode.Width = 300;
barcode.Height = 100;

// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng(outputPath);
' Before
barcode.Width = 300
barcode.Height = 100

' After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

Lista kontrolna migracji Barcode4NET

Zadania przed migracją

Przed rozpoczęciem pracy przeprowadź te wyszukiwania w całym rozwiązaniu. Dają one dokładny obraz zakresu migracji:

# Find allBarcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
# Find allBarcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .

# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .

# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .

# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .

# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .

# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .

# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
SHELL

Zwróć uwagę na liczbę plików dla każdego wzorca. Dokumentuj kod rysowania oparty na współrzędnych, wzorce użycia czcionek oraz wszelkie kroki skryptu kompilacji, które kopiują bibliotekę DLL.

Zadania związane z aktualizacją kodu

  1. Usun ThirdParty/Barcode4NET/ z kontroli zrodla (git rm -r)
  2. Usun <Reference Include="Barcode4NET"> ze wszystkich plikow .csproj
  3. Usuń ręczne kroki kopiowania bibliotek DLL ze skryptów kompilacji i plików potoku CI/CD
  4. Uruchom dotnet add package IronBarcode dla kazdego projektu w rozwiazaniu
  5. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; do uruchamiania aplikacji
  6. Zamień using Barcode4NET; na using IronBarCode; we wszystkich plikach .cs
  7. Zamień bloki new Barcode4NET.Barcode() na wywołania BarcodeWriter.CreateBarcode()
  8. Zamień Symbology.X na BarcodeEncoding.X w całym dokumencie
  9. Zastąp BarCode.Width = N; kod kreskowy.Height = M; with `.ResizeTo(N, M)
  10. Zamien przypisania .GenerateBarcode() na .SaveAsPng() lub .ToPngBinaryData()
  11. Zaktualizuj przypisania PictureBox lub inne kontrolki obrazu, aby uzywaly wzorca MemoryStream
  12. Zaktualizuj TargetFramework w plikach .csproj, jesli aktualizujesz z net4xx
  13. Uruchom pełną kompilację i napraw wszelkie pozostałe błędy kompilacji

Testy po migracji

  • Porównaj wizualny wynik BarCode z próbkami o znanej poprawności, aby potwierdzić wygląd
  • Sprawdź, czy skaner kodów kreskowych może odczytać wygenerowane kody kreskowe we wszystkich obsługiwanych systemach symbolicznych
  • Testuj wartosci BarcodeEncoding, aby dopasowaly oczekiwane wyjscie dla Code128, Code39, EAN-13, UPC-A i kodu QR
  • Zweryfikuj, ze wzorzec MemoryStream jest poprawnie wyswietlany w kontrolkach WinForms, tam gdzie to ma zastosowanie
  • Potwierdz, ze proces CI/CD konczy sie pomyslnie, uzywajac tylko dotnet restore bez recznych krokow z DLL
  • Testuj funkcjonalnosc odczytywania kodu kreskowego, jesli BarcodeReader.Read() zostal dodany jako czesc migracji

Kluczowe korzyści wynikające z migracji do IronBarcode

Przywrócono możliwość licencjonowania nowych członków zespołu:IronBarcode to aktywny produkt komercyjny z licencjami wieczystymi dostępnymi w określonych przedziałach cenowych. Nowi programiści, wykonawcy i nowi członkowie zespołu mogą uzyskać licencję natychmiast. Sytuacja, w której programista dołącza do zespołu i nie może legalnie pracować nad kodem związanym z kodami BarCode, przestaje istnieć.

Standardowe zarzadzanie zaleznosciami NuGet: Po migracji dotnet restore zajmuje sie wszystkim. Nowi programiści klonują repozytorium, przywracają pakiety i kompilują bez konieczności znajomości lokalizacji bibliotek DLL, magazynów artefaktów czy ręcznych procedur kopiowania. Eliminuje to utrudnienia, jakie dystrybucja bibliotek DLLBarcode4NETpowodowała w każdym potoku CI/CD i procesie wdrażania.

Pełna swoboda wyboru wersji .NET: Usunięcie ograniczenia związanego zBarcode4NETodblokowuje projekty modernizacji .NET. Framework docelowy można zaktualizować do .NET 8, .NET 9 lub przyszłych wersji bez żadnych ograniczeń biblioteki BarCode. Dostępne stają się wdrożenia w systemie Linux, konteneryzacja Docker oraz środowiska uruchomieniowe bezserwerowe w chmurze.

Odczytywanie kodu kreskowego bez drugiej biblioteki: BarcodeReader.Read() dekoduje kody kreskowe z obrazow i PDF-ow natywnie. Zespoły, które wcześniej łączyłyBarcode4NETdo generowania z ZXing.Net lub inną biblioteką do odczytu, mogą skonsolidować się w jedną utrzymywaną zależność. Odczytywanie kodów kreskowych z plików PDF nie wymaga żadnej dodatkowej biblioteki PDF.

Stan bezpieczeństwa i zgodności:IronBarcode otrzymuje regularne poprawki bezpieczeństwa i jest monitorowany pod kątem aktualnych baz danych CVE. Audyty listy komponentów oprogramowania nie będą już wskazywaćBarcode4NETjako komercyjnej zależności wycofanej z użytku, dla której nie istnieje proces reagowania dostawcy. Ustalenia dotyczące działań naprawczych, któreBarcode4NETgeneruje podczas audytów bezpieczeństwa, zostaną rozwiązane natychmiast po zakończeniu migracji.

Aktywne tempo rozwoju:IronBarcode dostarcza regularne aktualizacje dostosowane do nowych wydań platformy .NET. Aktualizacje zgodności dla przyszłych wersji .NET dostarczane są przez pakiet, więc biblioteka nie zostanie zamrożona w stanie, w którym była kiedy dostawca ucichł.

Często Zadawane Pytania

Dlaczego warto przejść z Barcode4.NET na IronBarcode?

Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.

Jak zastąpić wywołania API Barcode4.NET za pomocą IronBarcode?

Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.

Jak bardzo zmienia się kod podczas migracji z Barcode4.NET do IronBarcode?

Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.

Czy podczas migracji muszę mieć zainstalowane zarówno Barcode4.NET, jak i IronBarcode?

Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.

Jaka jest nazwa pakietu NuGet dla IronBarcode?

Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.

W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Barcode4.NET?

IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.

Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Barcode4.NET?

Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.

Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?

Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.

W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?

Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.

Jakie właściwości wyników ulegają zmianie podczas migracji z Barcode4.NET do IronBarcode?

Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.

Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?

Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.

Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?

Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

Curtis Chau
Autor tekstów technicznych

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ę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie