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
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
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
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
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
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"
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
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
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
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
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
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
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")
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>
Podejście IronBarcode(plik projektu):
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
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
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
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" .
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")
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>
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" .
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
- Uruchom
dotnet remove package MessagingToolkit.Barcode, aby usunąć pakiet - Uruchom
dotnet add package IronBarcode, aby zainstalować IronBarcode - Dodaj
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";na początku aplikacji - Zastąp wszystkie instrukcje
using MessagingToolkit.Barcode;przezusing IronBarCode; - Zastąp wszystkie wzorce
new BarcodeDecoder()przez statyczne wywołaniaBarcodeReader.Read() - Zastąp wszystkie wzorce
new BarcodeEncoder()przez statyczne wywołaniaBarcodeWriter.CreateBarcode() - Zaktualizuj wszystkie odwołania
result.Textdoresult.Value - Zaktualizuj wszystkie odwołania
result.BarcodeFormatdoresult.Format - Zaktualizuj wszystkie wzorce
barcodeWriter.Format = BarcodeFormat.X, aby przekazać kodowanie jako parametr - Zastąp
bitmap.Save()przez.SaveAsPng()lub odpowiednią metodą wyjściową na wyniku IronBarcode - Usuń import
using System.Drawing;, gdzie były używane tylko dla wejść Bitmap do MessagingToolkit - Zaktualizuj
<TargetFramework>w pliku projektu, jeśli aktualizacja platformy jest częścią migracji
Testy po migracji
- Zweryfikuj, że
dotnet buildkoń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
.Valuezwraca 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ń.

