IRONSOFTWAREHOME
FILMY

Migrating from MessagingToolkit.Barcode to IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 sierpnia 2026

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);
    }
}

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);
}
C#

##IronBarcode a MessagingToolkit.BarCode: porównanie funkcji

FunkcjaMessagingToolkit.BarcodeIronBarcode
Ostatnia aktualizacja20142026 (aktywny)
Wersja NuGet1.7.0.2 (ostateczna)Aktualne, regularnie aktualizowane
Obsługa .NET 6 / 7 / 8 / 9NieTak
.NET Framework 4.6.2+NieTak
.NET Framework 3.5–4.5TakNie
Obsługa .NET CoreNieTak
ASP.NET CoreNieTak
.NET MAUINieTak
BlazorNieTak
Wielopłatformowe (Linux, macOS)NieTak
Obsługa Docker / kontenerówNieTak
Typy danych wejściowych do odczytu BarCodeTylko mapa bitowaŚcieżka, strumień, tablica bajtów, PDF
Odczytywanie BarCodes z plików PDFNieTak (język ojczysty)
Wiele BarCode na jednym obrazieNieTak
Automatyczne wykrywanie formatuNieTak
Formaty wyjściowe generowania BarCodeTylko mapa bitowaPNG, JPEG, SVG, PDF, tablica bajtów
Zależność od System.DrawingWymaganeNone
Poprawki bezpieczeństwaBrak od 2014 r.Regularne aktualizacje
Wsparcie komercyjneNoneDostępne profesjonalne wsparcie
Wynik audytu zgodnościOznaczone jako porzuconeSpeł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
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
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;

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";

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;
    }
}

Podejście IronBarcode:

using IronBarCode;

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

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}");
    }
}

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}");
}

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);
}

Podejście IronBarcode:

using IronBarCode;

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

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");

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>
XML

Podejście IronBarcode(plik projektu):

<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
C#

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})");
}

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.BarcodeIronBarcodeUwagi
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.Textresult.ValueZmieniono nazwę właściwości
result.BarcodeFormatresult.FormatZmieniono nazwę właściwości; typ enum to BarcodeEncoding
new BarcodeEncoder()Statyczny — BarcodeWriter.CreateBarcode()Nie jest wymagany przykład
barcodeWriter.Format = BarcodeFormat.QrCodeBarcodeEncoding.QRCode (parametr)Format przekazywany jako parametr, a nie właściwość
barcodeWriter.Encode("data") zwraca BitmapBarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)Zwraca płynny wynik, a nie bitmapę
bitmap.Save("path.png").SaveAsPng("path.png")Metoda Fluent na obiekcie wynikowym
BarcodeFormat.QrCodeBarcodeEncoding.QRCodeZmieniono nazwę przestrzeni nazw i wartości Enum
BarcodeFormat.Code128BarcodeEncoding.Code128Ta sama nazwa symboliczna, inna przestrzeń nazw
BarcodeFormat.Ean13BarcodeEncoding.EAN13Różnice w stosowaniu wielkich liter
Zwraca null, jeśli nie znalezionoZwraca pustą kolekcjęSprawdź .Any() lub .FirstOrDefault()
Tylko obraz bitmapowyŚcieżka, strumień, tablica bajtów, PDFNie jest wymagana biblioteka System.Drawing
Tylko.NET Framework 3.5–4.5Od .NET 4.6.2 do .NET 9Peł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" .
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");

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>
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" .
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.)}]

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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta