Przejdź do treści stopki
FILMY

Jak używać filtrów korekcji obrazów dla kodów kreskowych w C#

Migrating from MessagingToolkit.Barcode to IronBarcode

MessagingToolkit.Barcode opublikował swoją ostatnią wersję w 2013 roku — wersję 1.7.0.2 — i nie otrzymał od tego czasu żadnych aktualizacji. Ten przewodnik obejmuje kompletną ścieżkę migracji do IronBarcode: dlaczego migracja jest konieczna, jakie zmiany zachodzą w kodzie oraz jak sprawdzić, czy migracja została zakończona. Przewodnik jest skierowany zarówno do zespołów migrujących funkcjonalność kodów kreskowych w izolacji, jak i do zespołów podejmujących szerszą aktualizację .NET Framework, dla której MessagingToolkit.BarCode stanowi blokującą zależność.

Dlaczego warto przejść z MessagingToolkit.BarCode

Blokada zgodności z platformą: MessagingToolkit.BarCode jest przeznaczony dla platform .NET Framework 3.5, 4.0 i 4.5. Nie jest przeznaczony dla platform .NET Standard ani .NET Core. Gdy dowolny plik projektu odwołujący się do tego pakietu jest ustawiony na nowoczesną platformę docelową .NET — .NET 6, .NET 7, .NET 8 lub .NET 9 — operacja przywracania NuGet kończy się niepowodzeniem z powodu błędu zgodności platformy. Kompilacja nie przebiega. Nie jest to ostrzeżenie ani pogorszenie wydajności w czasie wykonywania; jest to błąd kompilacji, który uniemożliwia kompilację projektu. Usunięcie MessagingToolkit.BarCode jest warunkiem koniecznym dla każdej aktualizacji .NET Framework, a nie opcjonalnym krokiem porządkującym.

Luka w zabezpieczeniach: Od ostatniej zmiany kodu minęło dwanaście lat. Wszelkie luki w zabezpieczeniach wykryte po 2014 r. w logice analizowania obrazów biblioteki, jej implementacji dekodowania opartej na ZXing lub jej zależnościach przechodnich nie mają poprawki, nie ma dla nich ostrzeżenia ani osoby odpowiedzialnej za utrzymanie, z którą można się skontaktować. Narzędzia do skanowania bezpieczeństwa oznaczają ten pakiet jako porzucony. Ramy zgodności — PCI DSS, HIPAA, SOC 2, ISO 27001 — wymagają aktywnego zarządzania poprawkami oprogramowania innych firm. Porzucony pakiet nie przechodzi tych audytów ze względów proceduralnych, niezależnie od tego, czy zidentyfikowano konkretny numer CVE.

Wycofane platformy docelowe: Metadane pakietu NuGet wymieniają Silverlight 3, 4 i 5 jako platformy docelowe; wszystkie trzy zostały wycofane w 2021 r. Wymieniono Windows Phone 7.0, 7.5, 7.8 i 8.0; Wsparcie dla tych platform zakończyło się w latach 2014–2017. Biblioteka nigdy nie została zaktualizowana pod kątem platform, które zastąpiły te wycofane środowiska.

Braki w możliwościach: MessagingToolkit.Barcode akceptował tylko System.Drawing.Bitmap wejścia, które są dostępne tylko na Windows w .NET 6 i późniejszych. Zwracał jeden wynik na każde wywołanie dekodowania, bez obsługi obrazów zawierających wiele BarCode'ów. Nie posiadała ona funkcji odczytu plików PDF — aplikacje, które musiały odczytywać BARCODES z dokumentów PDF, wymagały oddzielnego etapu ekstrakcji przed wywołaniem biblioteki. Generowanie wyjścia zwracało Bitmap, wymagając importu System.Drawing.Imaging i uniemożliwiając wdrażanie wieloplatformowe.

Podstawowy problem

MessagingToolkit.Barcode wymusza zależność od System.Drawing oraz przepływ pracy oparty na instancjach, który jest niekompatybilny z nowoczesnym .NET:

// MessagingToolkit.Barcode: only compiles on .NET Framework 4.5 or earlier
// System.Drawing.Bitmap throws PlatformNotSupportedException on Linux/.NET 6+
using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))  // Windows-only in .NET 6+
{
    var result = decoder.Decode(bitmap);          // Single result or null
    if (result != null)
    {
        Console.WriteLine(result.Text);
    }
}
// MessagingToolkit.Barcode: only compiles on .NET Framework 4.5 or earlier
// System.Drawing.Bitmap throws PlatformNotSupportedException on Linux/.NET 6+
using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))  // Windows-only in .NET 6+
{
    var result = decoder.Decode(bitmap);          // Single result or null
    if (result != null)
    {
        Console.WriteLine(result.Text);
    }
}
Imports MessagingToolkit.Barcode
Imports System.Drawing

Dim decoder As New BarcodeDecoder()
Using bitmap As New Bitmap("barcode.png") ' Windows-only in .NET 6+
    Dim result = decoder.Decode(bitmap) ' Single result or Nothing
    If result IsNot Nothing Then
        Console.WriteLine(result.Text)
    End If
End Using
$vbLabelText   $csharpLabel

IronBarcode całkowicie usuwa zależność od System.Drawing i działa identycznie na Windows, Linux, macOS oraz w kontenerach Docker:

// IronBarcode: runs on .NET 6, 7, 8, 9 — Windows, Linux, macOS, Docker
using IronBarCode;

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

var results = BarcodeReader.Read("barcode.png");  // Nie Bitmap, no System.Drawing
foreach (var result in results)
{
    Console.WriteLine(result.Value);
}
// IronBarcode: runs on .NET 6, 7, 8, 9 — Windows, Linux, macOS, Docker
using IronBarCode;

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

var results = BarcodeReader.Read("barcode.png");  // Nie Bitmap, no System.Drawing
foreach (var result in results)
{
    Console.WriteLine(result.Value);
}
Imports IronBarCode

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

Dim results = BarcodeReader.Read("barcode.png") ' Nie Bitmap, no System.Drawing
For Each result In results
    Console.WriteLine(result.Value)
Next
$vbLabelText   $csharpLabel

IronBarcode a MessagingToolkit.BarCode: porównanie funkcji

Funkcja MessagingToolkit.Barcode IronBarcode
Ostatnia aktualizacja 2014 2026 (aktywny)
Wersja NuGet 1.7.0.2 (ostateczna) Aktualne, regularnie aktualizowane
Obsługa .NET 6 / 7 / 8 / 9 Nie Tak
.NET Framework 4.6.2+ Nie Tak
.NET Framework 3.5–4.5 Tak Nie
Obsługa .NET Core Nie Tak
ASP.NET Core Nie Tak
.NET MAUI Nie Tak
Blazor Nie Tak
Wielopłatformowe (Linux, macOS) Nie Tak
Obsługa Docker / kontenerów Nie Tak
Typy danych wejściowych do odczytu BarCode Tylko mapa bitowa Ścieżka, strumień, tablica bajtów, PDF
Odczytywanie BarCodes z plików PDF Nie Tak (język ojczysty)
Wiele BarCode na jednym obrazie Nie Tak
Automatyczne wykrywanie formatu Nie Tak
Formaty wyjściowe generowania BarCode Tylko mapa bitowa PNG, JPEG, SVG, PDF, tablica bajtów
Zależność od System.Drawing Wymagane None
Poprawki bezpieczeństwa Brak od 2014 r. Regularne aktualizacje
Wsparcie komercyjne None Dostępne profesjonalne wsparcie
Wynik audytu zgodności Oznaczone jako porzucone Spełnia standardowe wymagania audytowe

Szybki start: Migracja z MessagingToolkit.BarCode do IronBarcode

Krok 1: Zastąp pakiet NuGet

Usuń pakiet MessagingToolkit.BarCode:

dotnet remove package MessagingToolkit.Barcode
dotnet remove package MessagingToolkit.Barcode
SHELL

Jeśli projekt bezpośrednio odwołuje się do MessagingToolkit.Barcode.dll za pomocą <HintPath> w pliku .csproj, usuń również to odwołanie.

Zainstaluj IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

IronBarcode obsługuje platformy od .NET Framework 4.6.2 do .NET 9. Instaluje się jako pojedynczy pakiet zawierający wszystkie zależności — nie wymaga oddzielnej biblioteki graficznej ani odwołania do ZXing.

Krok 2: Aktualizacja przestrzeni nazw

Zastąp przestrzeń nazw MessagingToolkit przestrzenią nazw IronBarcode we wszystkich plikach, które odwołują się do starej biblioteki:

// Remove this
using MessagingToolkit.Barcode;
using System.Drawing;  // if used only for Bitmap input to MessagingToolkit

// Add this
using IronBarCode;
// Remove this
using MessagingToolkit.Barcode;
using System.Drawing;  // if used only for Bitmap input to MessagingToolkit

// Add this
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Pliki, które importowały System.Drawing jedynie dla typu Bitmap używanego z MessagingToolkit.Barcode, mogą mieć usunięty ten import, gdy IronBarcode jest używany.

Krok 3: Inicjalizacja licencji

Dodaj inicjalizację licencji raz na początku aplikacji — w Program.cs, Startup.cs, lub w równoważnym punkcie wejścia. Do użytku produkcyjnego wymagany jest klucz licencyjny; biblioteka działa w trybie próbnym bez niego.

// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Przykłady migracji kodu

Odczytywanie BarCodes z plików graficznych

Stare podejście wymagało skonstruowania Bitmap z ścieżki pliku i przekazania go do instancji BarcodeDecoder.IronBarcode akceptuje bezpośrednio ścieżkę do pliku.

Podejście MessagingToolkit.BarCode:

using MessagingToolkit.Barcode;
using System.Drawing;

public string ReadBarcodeValue(string imagePath)
{
    var decoder = new BarcodeDecoder();
    using (var bitmap = new Bitmap(imagePath))
    {
        var result = decoder.Decode(bitmap);
        return result?.Text;
    }
}
using MessagingToolkit.Barcode;
using System.Drawing;

public string ReadBarcodeValue(string imagePath)
{
    var decoder = new BarcodeDecoder();
    using (var bitmap = new Bitmap(imagePath))
    {
        var result = decoder.Decode(bitmap);
        return result?.Text;
    }
}
Imports MessagingToolkit.Barcode
Imports System.Drawing

Public Function ReadBarcodeValue(imagePath As String) As String
    Dim decoder As New BarcodeDecoder()
    Using bitmap As New Bitmap(imagePath)
        Dim result = decoder.Decode(bitmap)
        Return If(result IsNot Nothing, result.Text, Nothing)
    End Using
End Function
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

public string ReadBarcodeValue(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value;
}
using IronBarCode;

public string ReadBarcodeValue(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value;
}
Imports IronBarCode

Public Function ReadBarcodeValue(imagePath As String) As String
    Dim results = BarcodeReader.Read(imagePath)
    Return results.FirstOrDefault()?.Value
End Function
$vbLabelText   $csharpLabel

Wersja IronBarcode usuwa konstrukcję Bitmap i wzorzec null-conditional na pojedynczym obiekcie. BarcodeReader.Read() zwraca kolekcję — pustą kolekcję, gdy nic nie zostanie znalezione — więc .FirstOrDefault() zastępuje kontrolę null starej wartości zwracanej z jednym wynikiem.

Uzyskiwanie dostępu do informacji o formacie z wyników

MessagingToolkit.Barcode udostępniał wykrywany format za pośrednictwem result.BarcodeFormat.IronBarcode udostępnia to za pomocą result.Format. Oba są wartościami wyliczeniowymi w obiekcie wynikowym, o różnych nazwach typów wyliczeniowych.

Podejście MessagingToolkit.BarCode:

using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))
{
    var result = decoder.Decode(bitmap);
    if (result != null)
    {
        Console.WriteLine($"Value: {result.Text}");
        Console.WriteLine($"Format: {result.BarcodeFormat}");
    }
}
using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))
{
    var result = decoder.Decode(bitmap);
    if (result != null)
    {
        Console.WriteLine($"Value: {result.Text}");
        Console.WriteLine($"Format: {result.BarcodeFormat}");
    }
}
Imports MessagingToolkit.Barcode
Imports System.Drawing

Dim decoder As New BarcodeDecoder()
Using bitmap As New Bitmap("barcode.png")
    Dim result = decoder.Decode(bitmap)
    If result IsNot Nothing Then
        Console.WriteLine($"Value: {result.Text}")
        Console.WriteLine($"Format: {result.BarcodeFormat}")
    End If
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

var results = BarcodeReader.Read("barcode.png");
var first = results.FirstOrDefault();
if (first != null)
{
    Console.WriteLine($"Value: {first.Value}");
    Console.WriteLine($"Format: {first.Format}");
}
using IronBarCode;

var results = BarcodeReader.Read("barcode.png");
var first = results.FirstOrDefault();
if (first != null)
{
    Console.WriteLine($"Value: {first.Value}");
    Console.WriteLine($"Format: {first.Format}");
}
Imports IronBarCode

Dim results = BarcodeReader.Read("barcode.png")
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
    Console.WriteLine($"Value: {first.Value}")
    Console.WriteLine($"Format: {first.Format}")
End If
$vbLabelText   $csharpLabel

Nazwa właściwości zmienia się z .Text na .Value i z .BarcodeFormat na .Format. Typ enum zmienia się z BarcodeFormat (MessagingToolkit) na BarcodeEncoding (IronBarcode), chociaż .Format.ToString() generuje porównywalny ciąg tekstowy do wyświetleń lub logowania.

Generowanie BarCodes

MessagingToolkit.Barcode używał instancji-based BarcodeEncoder z formatem ustawiania właściwości przed wywołaniem .Encode().IronBarcode wykorzystuje metodę statyczną z typem kodowania jako parametrem.

Podejście MessagingToolkit.BarCode:

using MessagingToolkit.Barcode;

public void GenerateQrCode(string data, string outputPath)
{
    var encoder = new BarcodeEncoder();
    encoder.Format = BarcodeFormat.QrCode;
    var bitmap = encoder.Encode(data);
    bitmap.Save(outputPath);
}
using MessagingToolkit.Barcode;

public void GenerateQrCode(string data, string outputPath)
{
    var encoder = new BarcodeEncoder();
    encoder.Format = BarcodeFormat.QrCode;
    var bitmap = encoder.Encode(data);
    bitmap.Save(outputPath);
}
Imports MessagingToolkit.Barcode

Public Sub GenerateQrCode(data As String, outputPath As String)
    Dim encoder As New BarcodeEncoder()
    encoder.Format = BarcodeFormat.QrCode
    Dim bitmap = encoder.Encode(data)
    bitmap.Save(outputPath)
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

public void GenerateQrCode(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
        .SaveAsPng(outputPath);
}
using IronBarCode;

public void GenerateQrCode(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
        .SaveAsPng(outputPath);
}
Imports IronBarCode

Public Sub GenerateQrCode(data As String, outputPath As String)
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
        .SaveAsPng(outputPath)
End Sub
$vbLabelText   $csharpLabel

W przypadku tworzenia kodów 128 i innych barcode'ów 1D stosuje się ten sam wzór statyczny z inną stałą kodowania:

// Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("ean13.png");
// Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("ean13.png");
' Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("code128.png")

' EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("ean13.png")
$vbLabelText   $csharpLabel

Aktualizacja docelowego środowiska

Po usunięciu MessagingToolkit.BARCODE i zastąpieniu wszystkich odwołań można zaktualizować docelową platformę projektu. Ta zmiana była blokowana przez starą zależność i stała się możliwa po jej usunięciu:

Podejście MessagingToolkit.BarCode (plik projektu):

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

Podejście IronBarcode(plik projektu):

<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 można go zainstalować przed zakończeniem aktualizacji platformy. Pozwala to na przeprowadzenie migracji etapami: zainstaluj IronBarcode obok MessagingToolkit.BarCode, zamień wszystkie użycia, zweryfikuj nowy kod, usuń stary pakiet, a następnie jako ostatni krok zmień docelową platformę.

Odczytywanie BarCodes z dokumentów PDF

MessagingToolkit.BarCode nie obsługiwał formatu PDF. Odczytanie kodów kreskowych z pliku PDF wymagało wyodrębnienia obrazów z każdej strony za pomocą oddzielnej biblioteki przed wywołaniem dekodera kodów kreskowych.IronBarcode odczytuje pliki PDF bezpośrednio przy użyciu tej samej metody, co w przypadku obrazów.

Podejście MessagingToolkit.BarCode:

// Not supported — required external PDF page extraction before decode
// Nie equivalent exists in MessagingToolkit.Barcode
// Not supported — required external PDF page extraction before decode
// Nie equivalent exists in MessagingToolkit.Barcode
' Not supported — required external PDF page extraction before decode
' Nie equivalent exists in MessagingToolkit.Barcode
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

// Read all barcodes from every page of a PDF document
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
using IronBarCode;

// Read all barcodes from every page of a PDF document
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
Imports IronBarCode

' Read all barcodes from every page of a PDF document
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})")
Next
$vbLabelText   $csharpLabel

Aplikacje przetwarzające zeskanowane dokumenty, listy przewozowe lub wielostronicowe partie faktur zyskują tę funkcjonalność w ramach migracji bez konieczności instalowania dodatkowych bibliotek lub konfiguracji.

MessagingToolkit.BarCode API do IronBarcode Mapping Dokumentacji API

MessagingToolkit.Barcode IronBarcode Uwagi
new BarcodeDecoder() Statyczny — BarcodeReader.Read() Nie jest wymagany przykład
barcodeReader.Decode(bitmap) BarcodeReader.Read(path) Akceptuje ścieżkę, strumień, tablicę bajtów lub plik PDF
result.Text result.Value Zmieniono nazwę właściwości
result.BarcodeFormat result.Format Zmieniono nazwę właściwości; typ enum to BarcodeEncoding
new BarcodeEncoder() Statyczny — BarcodeWriter.CreateBarcode() Nie jest wymagany przykład
barcodeWriter.Format = BarcodeFormat.QrCode BarcodeEncoding.QRCode (parametr) Format przekazywany jako parametr, a nie właściwość
barcodeWriter.Encode("data") zwraca Bitmap BarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode) Zwraca płynny wynik, a nie bitmapę
bitmap.Save("path.png") .SaveAsPng("path.png") Metoda Fluent na obiekcie wynikowym
BarcodeFormat.QrCode BarcodeEncoding.QRCode Zmieniono nazwę przestrzeni nazw i wartości Enum
BarcodeFormat.Code128 BarcodeEncoding.Code128 Ta sama nazwa symboliczna, inna przestrzeń nazw
BarcodeFormat.Ean13 BarcodeEncoding.EAN13 Różnice w stosowaniu wielkich liter
Zwraca null, jeśli nie znaleziono Zwraca pustą kolekcję Sprawdź .Any() lub .FirstOrDefault()
Tylko obraz bitmapowy Ścieżka, strumień, tablica bajtów, PDF Nie jest wymagana biblioteka System.Drawing
Tylko.NET Framework 3.5–4.5 Od .NET 4.6.2 do .NET 9 Pełna obsługa nowoczesnego środowiska .NET

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

Problem 1: Nie znaleziono przestrzeni nazw po aktualizacji pakietu

Problem: Po usunięciu MessagingToolkit.Barcode i dodaniu IronBarcode, kompilacja kończy się niepowodzeniem z CS0246: The type or namespace name 'BarcodeDecoder' could not be found.

Rozwiązanie: Stara przestrzeń nazw using MessagingToolkit.Barcode; musi być zastąpiona przez using IronBarCode; (uwaga na dużą literę C) w każdym pliku odwołującym się do starej biblioteki. Wyszukiwanie starego ciągu znaków przestrzeni nazw w całym projekcie pozwoli zlokalizować wszystkie pliki, których to dotyczy:

grep -r "using MessagingToolkit.Barcode" --include="*.cs" .
grep -r "BarcodeDecoder\|BarcodeEncoder" --include="*.cs" .
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .
grep -r "BarcodeDecoder\|BarcodeEncoder" --include="*.cs" .
SHELL

Problem 2: Niejednoznaczność BarcodeReader między przestrzeniami nazw

Problem: Jeśli projekt odnosi się zarówno do MessagingToolkit.Barcode, jak i IronBarcode podczas etapowej migracji, BarcodeReader może być niejednoznaczne pomiędzy dwoma przestrzeniami nazw.

Rozwiązanie: W okresie przejściowym należy wyraźnie zaznaczyć, że chodzi o odniesienie:

// Use the fully qualified name while both packages are installed
var results = IronBarCode.BarcodeReader.Read("barcode.png");
// Use the fully qualified name while both packages are installed
var results = IronBarCode.BarcodeReader.Read("barcode.png");
Imports IronBarCode

Dim results = BarcodeReader.Read("barcode.png")
$vbLabelText   $csharpLabel

Gdy wszystkie odwołania do MessagingToolkit.Barcode zostaną zastąpione i stary pakiet zostanie usunięty, kwalifikator można usunąć, a using IronBarCode; dyrektywa jest wystarczająca.

Problem 3: Framework docelowy nadal ustawiony na net472 po usunięciu pakietu

Problem: Po usunięciu MessagingToolkit.Barcode i zainstalowaniu IronBarcode, plik projektu nadal kieruje na net472. Ostrzeżenia kompilatora wskazują, że nowoczesne interfejsy API .NET są niedostępne.

Rozwiązanie: Zaktualizuj element <TargetFramework> w pliku .csproj po usunięciu zależności.IronBarcode wspiera zarówno net472 (poprzez zgodność z .NET Framework 4.6.2), jak i nowoczesne cele. Zmiana na net8.0 wymaga sprawdzenia, czy w projekcie nie ma innych zależności z przeszłości:


<TargetFramework>net8.0</TargetFramework>

<TargetFramework>net8.0</TargetFramework>
XML

Uruchom dotnet build po zmianie, aby zidentyfikować jakiekolwiek pozostałe zależności z przeszłości, które wymagają uwagi.

MessagingToolkit. Lista kontrolna migracji BarCode

Zadania przed migracją

Przeprowadź audyt kodu źródłowego, aby zidentyfikować wszystkie miejsca, w których występuje odwołanie do MessagingToolkit.BarCode:

# Find all using statements
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .

# Find decoder instantiations
grep -r "BarcodeDecoder" --include="*.cs" .

# Find encoder instantiations
grep -r "BarcodeEncoder" --include="*.cs" .

# Find decode calls
grep -r "\.Decode(" --include="*.cs" .

# Find encode calls
grep -r "\.Encode(" --include="*.cs" .

# Find project file references
grep -r "MessagingToolkit" --include="*.csproj" .
grep -r "MessagingToolkit" --include="packages.config" .
# Find all using statements
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .

# Find decoder instantiations
grep -r "BarcodeDecoder" --include="*.cs" .

# Find encoder instantiations
grep -r "BarcodeEncoder" --include="*.cs" .

# Find decode calls
grep -r "\.Decode(" --include="*.cs" .

# Find encode calls
grep -r "\.Encode(" --include="*.cs" .

# Find project file references
grep -r "MessagingToolkit" --include="*.csproj" .
grep -r "MessagingToolkit" --include="packages.config" .
SHELL

Należy udokumentować wszystkie pliki wymagające zmian. Zanotuj wszystkie miejsca, gdzie System.Drawing.Bitmap jest używany jako wejście do dekodera — te użycia również będą musiały być zaktualizowane.

Zadania związane z aktualizacją kodu

  1. Uruchom dotnet remove package MessagingToolkit.Barcode, aby usunąć pakiet
  2. Uruchom dotnet add package IronBarcode, aby zainstalować IronBarcode
  3. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; na początku aplikacji
  4. Zastąp wszystkie instrukcje using MessagingToolkit.Barcode; przez using IronBarCode;
  5. Zastąp wszystkie wzorce new BarcodeDecoder() przez statyczne wywołania BarcodeReader.Read()
  6. Zastąp wszystkie wzorce new BarcodeEncoder() przez statyczne wywołania BarcodeWriter.CreateBarcode()
  7. Zaktualizuj wszystkie odwołania result.Text do result.Value
  8. Zaktualizuj wszystkie odwołania result.BarcodeFormat do result.Format
  9. Zaktualizuj wszystkie wzorce barcodeWriter.Format = BarcodeFormat.X, aby przekazać kodowanie jako parametr
  10. Zastąp bitmap.Save() przez .SaveAsPng() lub odpowiednią metodą wyjściową na wyniku IronBarcode
  11. Usuń import using System.Drawing;, gdzie były używane tylko dla wejść Bitmap do MessagingToolkit
  12. Zaktualizuj <TargetFramework> w pliku projektu, jeśli aktualizacja platformy jest częścią migracji

Testy po migracji

  • Zweryfikuj, że dotnet build kończy się bez błędów i bez odniesień do MessagingToolkit
  • Uruchom grep -r "MessagingToolkit" --include="*.cs" . i potwierdź zerowe wyniki
  • Przetestuj odczyt kodów kreskowych z rzeczywistymi obrazami kodów kreskowych z aplikacji i potwierdź, że .Value zwraca oczekiwany ciąg
  • Przetestuj odczyt kodów kreskowych przy użyciu obrazów zawierających wiele kodów kreskowych i upewnij się, że wszystkie kody kreskowe z kolekcji zostały zwrócone
  • Przetestuj generowanie kodów BarCode i sprawdź, czy plik wyjściowy jest zgodny z oczekiwanym formatem i kodowaniem
  • Jeśli korzystasz z czytnika PDF, przetestuj to na reprezentatywnym dokumencie PDF i sprawdź, czy metadane dotyczące numerów stron są poprawne
  • Jeśli zmieniono docelowy framework, uruchom pełną Suite testów w nowym środowisku uruchomieniowym, aby zidentyfikować wszelkie inne problemy z kompatybilnością

Kluczowe korzyści wynikające z migracji do IronBarcode

Odblokowane aktualizacje frameworka: Po usunięciu MessagingToolkit.BARCODE docelowy framework pliku projektu można zaktualizować do dowolnej nowoczesnej wersji .NET. Ta pojedyncza zmiana umożliwia dostęp do ulepszeń wydajności .NET 8, funkcji języka C# 12, natywnych wzorców asynchronicznych oraz pełnego ekosystemu pakietów NuGet, które wymagają .NET Standard 2.0 lub nowszego.

Rozmieszczanie wieloplatformowe: Wewnętrzny pipeline obrazów IronBarcode nie zależy od System.Drawing, który jest dostępny tylko na Windows w .NET 6 i późniejszych. Po migracji aplikacje mogą być wdrażane na serwerach Linux, w środowiskach deweloperskich macOS, kontenerach Docker i w środowiskach funkcji w chmurze bez napotkania PlatformNotSupportedException z biblioteki kodów kreskowych.

Rozwiązane kwestie dotyczące zgodności:IronBarcode otrzymuje regularne aktualizacje zabezpieczeń w ramach udokumentowanego procesu konserwacji. Zastąpienie porzuconej zależności aktywnie utrzymywaną rozwiązuje problemy wykryte podczas audytów w ramach PCI DSS, HIPAA, SOC 2 i podobnych standardów, które wymagają aktywnego zarządzania poprawkami bibliotek stron trzecich.

Wsparcie natywne dla PDF: BarcodeReader.Read() przyjmuje ścieżki do plików PDF bezpośrednio, eliminując potrzebę oddzielnego kroku ekstrakcji obrazów PDF przed dekodowaniem kodów kreskowych. Aplikacje przetwarzające zeskanowane dokumenty lub partie faktur mogą korzystać z tej funkcji bez konieczności dodawania nowych bibliotek lub etapów procesu.

Rozszerzone opcje wyjścia: Generowane kody kreskowe są dostępne jako PNG, JPEG, SVG, PDF lub ciągi zakodowane base64 dzięki płynnemu obiektowi wyniku zwracanemu przez BarcodeWriter.CreateBarcode(). To zastępuje typ zwracany System.Drawing.Bitmap z MessagingToolkit.Barcode, usuwając ograniczenie wyjścia tylko dla Windows i umożliwiając bezpośrednie osadzanie w odpowiedziach internetowych lub w bazie danych.

MessagingToolkit i ZXing.NET są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana, zatwierdzona ani sponsorowana przez MessagingToolkit lub ZXing.NET. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.)}]

Często Zadawane Pytania

Dlaczego warto przejść z MessagingToolkit BarCode 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 MessagingToolkit 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 MessagingToolkit BarCode 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 MessagingToolkit BarCode, 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 MessagingToolkit BarCode?

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 MessagingToolkit?

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 MessagingToolkit BarCode 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