
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);
}
}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 UsingImports 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 UsingIronBarcode 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)
NextImports 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
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
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 IronBarCodeImports IronBarCodePliki, 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"' 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 FunctionImports 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 FunctionPodejś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 FunctionImports IronBarCode
Public Function ReadBarcodeValue(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return results.FirstOrDefault()?.Value
End FunctionWersja 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 UsingImports 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 UsingPodejś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 IfImports 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 IfNazwa 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 SubImports 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 SubPodejś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 SubImports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.SaveAsPng(outputPath)
End SubW 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")' 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>
Podejście IronBarcode(plik projektu):
<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// Not supported — required external PDF page extraction before decode
// Nie equivalent exists in MessagingToolkit.BarcodePodejś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})")
NextImports 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})")
NextAplikacje 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" .
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")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:
<!-- Update this line in the .csproj file -->
<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" .
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.)}]
Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.
Powiązane artykuły


