Comment créer des codes-barres sous forme de flux en C# en utilisant IronBarcode
Passer de Barcode4NETà IronBarcode
Ce guide de migration explique comment supprimer une dépendance à Barcode4NETet la remplacer par IronBarcode, avec des instructions étape par étape, des comparaisons de code et des exemples pratiques pour les développeurs .NET qui entreprennent cette transition. Barcode4NETa atteint sa fin de vie sans annonce officielle : les nouvelles licences ne sont plus vendues, aucun package NuGet n'a jamais été publié et la bibliothèque fonctionne exclusivement sur .NET Framework. Ce guide est pratique et précis : il explique comment supprimer la référence à la DLL, installer Code-barres IronBarcode via NuGet et convertir le code de génération. Il couvre également les fonctionnalités de lecture et de traitement des fichiers PDF qui deviennent disponibles après la migration, et qui n'étaient pas du tout disponibles via Barcode4NET.
Pourquoi migrer depuis Barcode4NET?
Les équipes migrant depuis Barcode4NETsignalent les déclencheurs suivants de manière récurrente :
Aucune nouvelle licence disponible : les licences Barcode4NETne sont plus vendues par l'intermédiaire de ComponentSource ni d'aucun autre canal. Si un développeur rejoint une équipe utilisant Barcode4NET, il n'existe aucun mécanisme permettant de lui acheter une licence. Un entrepreneur rejoignant le projet ou un deuxième développeur devant travailler sur les fonctionnalités des codes-barres ne peut pas être légalement autorisé en vertu des conditions du produit d'origine.
Absence de package NuGet : il ne s'agit pas d'un simple désagrément, mais d'une incompatibilité fondamentale avec les flux de travail .NET modernes. Chaque développeur qui clone le dépôt doit savoir où se trouve la DLL. Les pipelines CI/CD doivent être configurés manuellement pour le localiser. La commande dotnet restore ne fait rien pour le résoudre. La DLL est soit intégrée au système de contrôle de version, soit conservée dans un espace de stockage d'artefacts privé, deux solutions qui nécessitent une maintenance manuelle continue.
Aucune prise en charge de .NET 5, 6, 7, 8 ou 9 : Barcode4NETcible exclusivement .NET Framework . Lorsque qu'une organisation met à niveau son framework cible vers net8.0, la compilation échoue car la bibliothèque était compilée contre des assemblies .NET Framework qui ne sont plus référencés. Aucun correctif n'est prévu. Si l'équipe doit passer à une version moderne de .NET pour des raisons de performance, de déploiement sous Linux ou Docker, ou pour bénéficier d'un support Microsoft à long terme, Barcode4NETconstitue un obstacle majeur.
Aucune mise à jour de sécurité : la bibliothèque est figée dans l'état où elle se trouvait lorsque son développement a cessé. Les problèmes de sécurité découverts depuis restent définitivement sans solution. Il n'y a pas de système de suivi des problèmes, pas de responsable de la maintenance à contacter, et pas de processus de réponse des fournisseurs.
Aucune correction de bug : si un problème d'affichage apparaît avec une variante de symbologie particulière ou un cas limite dans les dimensions du code-barres, il n'existe aucune solution. La bibliothèque ne sera pas mise à jour.
Le problème fondamental
Le moment de découverte le plus fréquent est celui où un développeur met à jour le framework cible lors d'un projet de modernisation .NET . La compilation échoue car la DLL de Barcode4NETa été compilée avec des assemblys .NET Framework qui ne sont plus disponibles sous la nouvelle cible. Le problème ne réside pas dans l'API de génération elle-même, mais dans la dépendance sous-jacente qui ne peut pas évoluer.
// Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
// <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
// Barcode4NET— locked to .NET Framework, no NuGet package
// Requires manual DLL reference in every .csproj:
// <Reference Include="Barcode4NET">
// <HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
// </Reference>
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.Width = 300;
barcode.Height = 100;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging
Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.Width = 300
barcode.Height = 100
Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
barcodeImage.Save(outputPath, ImageFormat.Png)
// Code-barres IronBarcode — NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng(outputPath);
// Code-barres IronBarcode — NuGet package, .NET Framework 4.6.2 through .NET 9
// dotnet add package IronBarcode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng(outputPath);
Imports IronBarCode
' Code-barres IronBarcode — NuGet package, .NET Framework 4.6.2 through .NET 9
' dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng(outputPath)
Comparaison des fonctionnalités Code-barres IronBarcode et de Barcode4NET
| Fonction | Barcode4NET | Code-barres IronBarcode |
|---|---|---|
| Paquet NuGet | Non — DLL manuelle uniquement | Oui (IronBarcode) |
| Prise en charge du .NET Framework | Oui (.NET Framework uniquement) | Oui (.NET Framework 4.6.2+) |
| Prise en charge de .NET Core / .NET 5 et versions ultérieures | Non | Oui (.NET 5, 6, 7, 8, 9) |
| Prise en charge de Linux/macOS | Non | Oui |
| Prise en charge de Docker | Non | Oui |
| Azure / AWS Lambda | Non | Oui |
| génération de codes-barres | Oui | Oui |
| Lecture/scan des codes-barres | Non | Oui (BarcodeReader.Read()) |
| lecture de codes-barres PDF | Non | Oui (natif, sans bibliothèque supplémentaire) |
| Code QR avec logo | Non | Oui (AddBrandLogo()) |
| API chaînable fluide | Non | Oui |
| Maintenance active | Non (fin de vie) | Oui |
| Nouvelles licences disponibles | Non | Oui — Lite 749 $, Plus 1 499 $, Pro 2 999 $, Unlimited 5 999 $ |
| correctifs de sécurité | Non | Oui |
| intégration du pipeline CI/CD | Étapes de copie manuelle de la DLL | Standard dotnet restore |
Démarrage rapide : Migration de Barcode4NETvers IronBarcode
La migration peut commencer immédiatement grâce à ces étapes fondamentales.
Étape 1 : Remplacer le package NuGet
Barcode4NET n'a jamais été distribué comme package NuGet, donc il n'y a pas de commande dotnet remove package. Retirez-le manuellement.
Supprimez la DLL du contrôle de code source et préparez la suppression :
git rm -r ThirdParty/Barcode4NET/
git rm -r ThirdParty/Barcode4NET/
Retirez l'élément <Reference> de chaque fichier .csproj. Recherchez dans toute la solution pour trouver chaque fichier qui doit être mis à jour :
grep -rl "Barcode4NET" --include="*.csproj" .
grep -rl "Barcode4NET" --include="*.csproj" .
Retirez cet élément de chaque fichier .csproj qui le contient :
<Reference Include="Barcode4NET">
<HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
<Reference Include="Barcode4NET">
<HintPath>..\ThirdParty\Barcode4NET\Barcode4NET.dll</HintPath>
</Reference>
Installez ensuite IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
Cette simple commande ajoute Code-barres IronBarcode et résout toutes les dépendances. Aucune gestion des DLL, aucun stockage d'artefacts, aucune étape de copie manuelle.
Étape 2 : Mise à jour des espaces de noms
Remplacez l'ancienne directive using en haut de chaque fichier qui utilisait Barcode4NET:
// Before
using Barcode4NET;
// After
using IronBarCode;
// Before
using Barcode4NET;
// After
using IronBarCode;
Imports Barcode4NET
' After
Imports IronBarCode
Étape 3 : initialisation de la licence
Ajoutez l'initialisation de la licence au démarrage de l'application — dans Program.cs, Startup.cs, ou partout où votre application démarre :
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Exemples de migration de code
Génération d'étiquettes de base
Le modèle Barcode4NETle plus courant : créer un objet, définir les propriétés, appeler GenerateBarcode() pour recevoir un Bitmap, puis l'enregistrer.
Approche Barcode4NET :
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;
public void SaveLabel(string sku, string outputPath)
{
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = sku;
barcode.Width = 400;
barcode.Height = 120;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
}
using Barcode4NET;
using System.Drawing;
using System.Drawing.Imaging;
public void SaveLabel(string sku, string outputPath)
{
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = sku;
barcode.Width = 400;
barcode.Height = 120;
Bitmap barcodeImage = barcode.GenerateBarcode();
barcodeImage.Save(outputPath, ImageFormat.Png);
}
Imports Barcode4NET
Imports System.Drawing
Imports System.Drawing.Imaging
Public Sub SaveLabel(sku As String, outputPath As String)
Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = sku
barcode.Width = 400
barcode.Height = 120
Dim barcodeImage As Bitmap = barcode.GenerateBarcode()
barcodeImage.Save(outputPath, ImageFormat.Png)
End Sub
Approche IronBarcode :
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void SaveLabel(string sku, string outputPath)
{
BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void SaveLabel(string sku, string outputPath)
{
BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub SaveLabel(sku As String, outputPath As String)
BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.SaveAsPng(outputPath)
End Sub
Le bloc de définition des propriétés se réduit à une seule chaîne fluide. L'appel .ResizeTo() remplace les affectations de propriétés Width et Height. .SaveAsPng() remplace à la fois GenerateBarcode() et l'appel séparé barcodeImage.Save(). Pour plus d'options de génération, consultez la documentation sur la génération de codes-barres IronBarcode .
Affichage de la PictureBox WinForms
Si votre code Barcode4NETassignait directement la valeur de retour Bitmap à une PictureBox ou un contrôle similaire, vous chargerez à la place un tableau de bytes par le biais d'un MemoryStream.
Approche Barcode4NET :
using Barcode4NET;
using System.Drawing;
private void RefreshBarcodeDisplay(string data)
{
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = data;
barcode.Width = 300;
barcode.Height = 100;
pictureBox1.Image = barcode.GenerateBarcode();
}
using Barcode4NET;
using System.Drawing;
private void RefreshBarcodeDisplay(string data)
{
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = data;
barcode.Width = 300;
barcode.Height = 100;
pictureBox1.Image = barcode.GenerateBarcode();
}
Imports Barcode4NET
Imports System.Drawing
Private Sub RefreshBarcodeDisplay(data As String)
Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.Code128
barcode.Data = data
barcode.Width = 300
barcode.Height = 100
pictureBox1.Image = barcode.GenerateBarcode()
End Sub
Approche IronBarcode :
using IronBarCode;
using System.Drawing;
using System.IO;
private void RefreshBarcodeDisplay(string data)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
}
using IronBarCode;
using System.Drawing;
using System.IO;
private void RefreshBarcodeDisplay(string data)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
}
Imports IronBarCode
Imports System.Drawing
Imports System.IO
Private Sub RefreshBarcodeDisplay(data As String)
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
Using stream As New MemoryStream(pngBytes)
pictureBox1.Image = Image.FromStream(stream)
End Using
End Sub
L'étape MemoryStream est la seule addition structurelle. Tout le reste est une traduction directe du modèle de définition de propriétés vers la chaîne fluide.
Génération de codes QR
Approche Barcode4NET :
using Barcode4NET;
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
using Barcode4NET;
var barcode = new Barcode4NET.Barcode();
barcode.Symbology = Symbology.QRCode;
barcode.Data = "https://example.com/product/99";
barcode.Width = 300;
barcode.Height = 300;
Bitmap qrImage = barcode.GenerateBarcode();
qrImage.Save("qr.png", System.Drawing.Imaging.ImageFormat.Png);
Imports Barcode4NET
Imports System.Drawing.Imaging
Dim barcode As New Barcode4NET.Barcode()
barcode.Symbology = Symbology.QRCode
barcode.Data = "https://example.com/product/99"
barcode.Width = 300
barcode.Height = 300
Dim qrImage As Bitmap = barcode.GenerateBarcode()
qrImage.Save("qr.png", ImageFormat.Png)
Approche IronBarcode :
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
.SaveAsPng("qr.png");
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/99", 300)
.SaveAsPng("qr.png");
Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/product/99", 300) _
.SaveAsPng("qr.png")
IronBarcode utilise une classe dédiée QRCodeWriter pour les codes QR, qui permet d'accéder à des options spécifiques aux QR telles que le niveau de correction d'erreurs et l'intégration du logo de marque. Le deuxième paramètre pour QRCodeWriter.CreateQrCode() est la taille en pixels de l'image carrée.
Ajout de la lecture des codes-barres
Barcode4NET ne disposait pas d'API de lecture. Si votre application traite des documents numérisés, vérifie les codes-barres générés ou extrait des données de factures PDF, cette fonctionnalité est disponible immédiatement après la migration, sans ajout de deuxième bibliothèque.
Approche Barcode4NET :
// Non reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
// Non reading API available in Barcode4NET.
// Required a separate library (e.g., ZXing.Net) to decode barcodes.
' Non reading API available in Barcode4NET.
' Required a separate library (e.g., ZXing.Net) to decode barcodes.
Approche IronBarcode :
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Symbology: {result.Format}");
}
// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("scanned-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Symbology: {result.Format}");
}
// Read all barcodes from a PDF — pages are handled automatically
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
Imports IronBarCode
' Read a barcode from an image file
Dim results = BarcodeReader.Read("scanned-label.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Symbology: {result.Format}")
Next
' Read all barcodes from a PDF — pages are handled automatically
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
La lecture des fichiers PDF ne nécessite aucune bibliothèque supplémentaire. BarcodeReader.Read() gère à la fois les images et les entrées PDF nativement. Consultez la documentation relative à la lecture des codes-barres pour connaître les options de configuration, notamment la vitesse de lecture et la détection de plusieurs codes-barres.
Mise à niveau du cadre cible
Une fois Barcode4NETsupprimé, la contrainte liée au .NET Framework disparaît également. Mettez à jour l'élément TargetFramework dans votre .csproj :
Approche Barcode4NET :
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
</PropertyGroup>
Approche IronBarcode :
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
IronBarcode prend en charge .NET Framework 4.6.2 à .NET 9, ce qui permet de mettre à niveau le framework cible vers n'importe quelle version choisie par votre organisation, sans aucune contrainte liée à une bibliothèque de codes-barres.
Contrôleur ASP.NET Core — Renvoi d'un code-barres sous forme de réponse image
Si vous modernisez simultanément une application Web Forms, voici le modèle ASP.NET Core pour renvoyer une image de code-barres à partir d'une action de contrôleur :
Approche Barcode4NET :
// Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
// Barcode4NETwas not compatible with ASP.NET Core.
// Web Forms HttpHandler was required for image delivery.
' Barcode4NET was not compatible with ASP.NET Core.
' Web Forms HttpHandler was required for image delivery.
Approche IronBarcode :
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
[HttpGet("{data}")]
public IActionResult Get(string data)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcodes")]
public class BarcodesController : ControllerBase
{
[HttpGet("{data}")]
public IActionResult Get(string data)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcodes")>
Public Class BarcodesController
Inherits ControllerBase
<HttpGet("{data}")>
Public Function [Get](data As String) As IActionResult
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.ToPngBinaryData()
Return File(pngBytes, "image/png")
End Function
End Class
.ToPngBinaryData() renvoie un byte[] directement, qui s'intègre dans le résultat File() sans aucune conversion intermédiaire.
Référence de correspondance entre l'API Barcode4NETet IronBarcode
| Barcode4NET | Code-barres IronBarcode |
|---|---|
new Barcode4NET.Barcode() |
BarcodeWriter.CreateBarcode(data, encoding) |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128 (paramètre de CreateBarcode) |
barcode.Data = "ITEM-12345" |
Premier paramètre de CreateBarcode() |
barCode.Width = 300 ; hauteur du code-barres = 100 |
.ResizeTo(300, 100) |
barcode.GenerateBarcode() retourne Bitmap |
.SaveAsPng(path) / .ToPngBinaryData() |
Symbology.QRCode |
BarcodeEncoding.QRCode |
Symbology.Code39 |
BarcodeEncoding.Code39 |
Symbology.EAN13 |
BarcodeEncoding.EAN13 |
Symbology.UPCA |
BarcodeEncoding.UPCA |
<Reference Include="Barcode4NET"> | <PackageReference Include="IronBarcode" /> |
|
.NET Framework only |
.NET Framework 4.6.2 through .NET 9 |
| Génération uniquement | Génération + lecture (BarcodeReader.Read()) |
| Prise en charge des fichiers PDF non disponible | BarcodeReader.Read("doc.pdf") natif |
Problèmes de migration courants et solutions
Problème 1 : Pas de dotnet remove package pour les références DLL
Barcode4NET : Comme Barcode4NETn'a jamais été un package NuGet , il n'existe aucune commande du gestionnaire de packages pour le supprimer. L'élément <Reference Include="Barcode4NET"> doit être retiré manuellement de chaque fichier .csproj, et le répertoire DLL doit être supprimé du contrôle de source explicitement.
Solution : Effectuez une recherche pour localiser tous les fichiers de projet qui référencent la DLL, puis supprimez les éléments manuellement :
grep -rn "Barcode4NET" --include="*.csproj" .
grep -rn "Barcode4NET" --include="*.csproj" .
Ne laissez pas la référence DLL en place à côté de la nouvelle référence NuGet ; cela provoque des erreurs de compilation dues à une résolution de type ambiguë.
Problème 2 : Changement du type de retour, de Bitmap à tableau d'octets
Barcode4NET: GenerateBarcode() returns System.Drawing.Bitmap. Le code qui assigne la valeur de retour à une variable typée Bitmap ou la passe à toute méthode attendant un Bitmap — comme un PictureBox — doit être mis à jour.
Solution : Remplacez les affectations .GenerateBarcode() par .ToPngBinaryData() et chargez le tableau de bytes par un MemoryStream à l'endroit de l'appel :
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
using var stream = new MemoryStream(pngBytes);
pictureBox1.Image = Image.FromStream(stream);
Imports System.IO
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
Using stream As New MemoryStream(pngBytes)
pictureBox1.Image = Image.FromStream(stream)
End Using
Rechercher .GenerateBarcode() dans toute la solution localisera tous les endroits d'appel qui nécessitent une mise à jour.
Problème 3 : Modification de l'espace de noms de l'énumération de symbologie
Barcode4NET : Utilise Symbology.Code128, Symbology.QRCode, Symbology.Code39, et des valeurs similaires de l'espace de noms Barcode4NET.
Solution : Remplacez par des valeurs enum BarcodeEncoding. Tous les noms communs sont conservés — seul le nom du type change :
// Before
barcode.Symbology = Symbology.Code128;
// After
BarcodeEncoding.Code128 // passed as parameter to CreateBarcode()
// Before
barcode.Symbology = Symbology.Code128;
// After
BarcodeEncoding.Code128 // passed as parameter to CreateBarcode()
' Before
barcode.Symbology = Symbology.Code128
' After
BarcodeEncoding.Code128 ' passed as parameter to CreateBarcode()
Un remplacement global de Symbology. par BarcodeEncoding. couvre la plupart des cas. Examinez chaque remplacement pour en confirmer le contexte.
Problème n° 4 : La largeur et la hauteur sont désormais une méthode, et non plus des propriétés.
Barcode4NET : La taille a été configurée comme deux affectations de propriétés distinctes : barcode.Width = 300 ; barCode.Height = 100;
Solution : Utilisez la méthode chaînée .ResizeTo(width, height). C'est suffisamment différent syntaxiquement pour qu'un simple recherche-et-remplace ne le capture pas — recherchez .Width = et .Height = dans le code lié aux codes-barres et mettez à jour chaque occurrence :
// Before
barcode.Width = 300;
barcode.Height = 100;
// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng(outputPath);
// Before
barcode.Width = 300;
barcode.Height = 100;
// After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng(outputPath);
' Before
barcode.Width = 300
barcode.Height = 100
' After — chained on the CreateBarcode call
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng(outputPath)
Liste de contrôle de migration Barcode4NET
Tâches préalables à la migration
Effectuez ces recherches sur votre solution avant de commencer. Ils offrent une image précise de l'ampleur de la migration :
# Find all Barcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .
# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .
# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .
# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .
# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .
# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .
# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
# Find all Barcode4NETusages in source files
grep -rn "Barcode4NET" --include="*.cs" .
# Find the using directive
grep -rn "using Barcode4NET" --include="*.cs" .
# Find object creation
grep -rn "new Barcode4NET.Barcode()" --include="*.cs" .
# Find Symbology enum usage
grep -rn "Symbology\." --include="*.cs" .
# Find GenerateBarcode calls
grep -rn "\.GenerateBarcode()" --include="*.cs" .
# Find the DLL reference in project files
grep -rn "Barcode4NET" --include="*.csproj" .
# Find DLL references in build scripts
grep -rn "Barcode4NET" --include="*.yml" .
grep -rn "Barcode4NET" --include="*.yaml" .
grep -rn "ThirdParty/Barcode4NET" .
Notez le nombre de fichiers pour chaque motif. Code de dessin basé sur les coordonnées du document, modèles d'utilisation des polices et toutes les étapes du script de compilation qui copient la DLL.
Tâches de mise à jour du code
- Supprimez
ThirdParty/Barcode4NET/du contrôle de source (git rm -r) - Retirez
<Reference Include="Barcode4NET">de tous les fichiers.csproj - Supprimez les étapes de copie manuelle des DLL des scripts de compilation et des fichiers de pipeline CI/CD
- Exécutez
dotnet add package IronBarcodepour chaque projet de la solution - Ajoutez
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";au démarrage de l'application - Remplacez
using Barcode4NET;parusing IronBarCode;dans tous les fichiers.cs - Remplacez les blocs
new Barcode4NET.Barcode()par des appelsBarcodeWriter.CreateBarcode() - Remplacez
Symbology.XparBarcodeEncoding.Xpartout - Remplacez
barcode.Width = N; barcode.Height = M;with.ResizeTo(N, M) - Remplacez les affectations
.GenerateBarcode()par.SaveAsPng()ou.ToPngBinaryData() - Mettez à jour les affectations de contrôle d'image
PictureBoxou autres pour utiliser le modèleMemoryStream - Mettez à jour
TargetFrameworkdans les fichiers.csprojsi vous passez denet4xx - Exécutez la compilation complète et corrigez les erreurs de compilation restantes.
Test de post-migration
- Comparer l'apparence du code-barres visuel à celle d'échantillons de référence.
- Vérifier que le matériel du lecteur de codes-barres peut lire les codes-barres générés à partir de toutes les symbologies concernées.
- Testez que les valeurs
BarcodeEncodingcorrespondent à la sortie attendue pour Code128, Code39, EAN-13, UPC-A, et Code QR - Vérifiez que le modèle
MemoryStreams'affiche correctement dans les contrôles WinForms où cela s'applique - Confirmez que le pipeline CI/CD se termine avec succès en utilisant uniquement
dotnet restoresans étapes manuelles de DLL - Testez la fonctionnalité de lecture de code-barres si
BarcodeReader.Read()a été ajouté dans le cadre de la migration
Principaux avantages de la migration vers IronBarcode
Possibilité rétablie d'octroyer des licences à de nouveaux membres d'équipe : Code-barres IronBarcode est un produit commercial actif avec des licences perpétuelles disponibles à des prix définis. Les nouveaux développeurs, sous-traitants et membres d'équipe peuvent obtenir une licence immédiatement. La situation où un développeur rejoint l'entreprise et ne peut légalement travailler sur du code lié aux codes-barres cesse d'exister.
Gestion standard des dépendances NuGet : Après la migration, dotnet restore gère tout. Les nouveaux développeurs clonent le dépôt, restaurent les paquets et compilent sans aucune connaissance de l'emplacement des DLL, des magasins d'artefacts ou des procédures de copie manuelle. Les frictions que la distribution de DLL de Barcode4NETengendrait dans chaque pipeline CI/CD et flux de travail d'intégration sont éliminées.
Liberté totale quant à la version .NET : la suppression de la contrainte Barcode4NETdébloque les projets de modernisation .NET . Le framework cible peut être mis à niveau vers .NET 8, .NET 9 ou des versions ultérieures sans aucune limitation de bibliothèque de codes-barres. Le déploiement Linux, la conteneurisation Docker et les environnements d'exécution sans serveur dans le cloud deviennent tous disponibles.
Lecture de code-barres sans seconde bibliothèque : BarcodeReader.Read() décode les codes-barres à partir d'images et de PDFs nativement. Les équipes qui utilisaient auparavant Barcode4NETpour la génération avec ZXing .NET ou une autre bibliothèque pour la lecture peuvent désormais se regrouper autour d'une seule dépendance maintenue. La lecture des codes-barres PDF ne nécessite aucune bibliothèque PDF supplémentaire.
Posture de sécurité et de conformité : Code-barres IronBarcode reçoit des correctifs de sécurité réguliers et est comparé aux bases de données CVE actuelles. Les audits de nomenclature logicielle ne feront plus apparaître Barcode4NETcomme une dépendance commerciale en fin de vie sans processus de réponse du fournisseur. Le problème de correction identifié par Barcode4NETlors des audits de sécurité est résolu dès que la migration est terminée.
Rythme de développement actif : Code-barres IronBarcode déploie des mises à jour régulières alignées sur les nouvelles versions de .NET . Les mises à jour de compatibilité pour les futures versions de .NET sont fournies par le package, donc la bibliothèque ne sera pas figée dans l'état qu'elle était quand un fournisseur s'est tu.
Questions Fréquemment Posées
Pourquoi devrais-je migrer de Barcode4.NET vers IronBarcode ?
Les raisons les plus courantes sont la simplification des licences (suppression de la complexité du SDK + de la clé d'exécution), l'élimination des limites de débit, la prise en charge native des PDF, l'amélioration du déploiement Docker/CI/CD et la réduction de l'API boilerplate dans le code de production.
Comment remplacer les appels API de Barcode4.NET par IronBarcode ?
Remplacer la création d'instance et le modèle de licence par IronBarCode.License.LicenseKey = "key". Remplacer les appels au lecteur par BarcodeReader.Read(path) et les appels à l'écrivain par BarcodeWriter.CreateBarcode(data, encoding). Les méthodes statiques ne nécessitent aucune gestion d'instance.
Quelle quantité de code change lors de la migration de Barcode4.NET vers IronBarcode ?
La plupart des migrations permettent de réduire le nombre de lignes de code. Les modèles de licence, les constructeurs d'instances et la configuration explicite des formats sont supprimés. Les principales opérations de lecture/écriture sont converties en équivalents plus courts d'IronBarcode avec des objets de résultat plus propres.
Dois-je garder les deux logiciels Barcode4.NET et IronBarcode installés pendant la migration ?
Non. La plupart des migrations sont des remplacements directs plutôt que des opérations parallèles. Migrez une classe de service à la fois, remplacez la référence NuGet et mettez à jour les modèles d'instanciation et d'appel d'API avant de passer à la classe suivante.
Quel est le nom du package NuGet pour IronBarcode ?
Le paquet est "IronBarcode" (avec un B et un C majuscules). Installez-le avec "Install-Package IronBarCode" ou "dotnet add package IronBarCode". La directive using dans le code est "using IronBarCode ;".
Comment IronBarcode simplifie-t-il le déploiement de Docker par rapport à Barcode4.NET ?
IronBarcode est un package NuGet sans fichiers SDK externes ni configuration de licence montée. Dans Docker, définissez la variable d'environnement IRONBARCODE_LICENSE_KEY et le paquetage gère la validation de la licence au démarrage.
IronBarcode détecte-t-il automatiquement tous les formats de codes-barres après avoir migré depuis Barcode4.NET ?
Oui. IronBarcode détecte automatiquement la symbologie dans tous les formats pris en charge. L'énumération explicite des BarcodeTypes n'est pas nécessaire. Si le format est déjà connu et que la performance est importante, BarcodeReaderOptions permet de restreindre l'espace de recherche en tant qu'optimisation.
IronBarcode peut-il lire des codes-barres à partir de PDF sans bibliothèque séparée ?
Oui, BarcodeReader.Read("document.pdf") traite les fichiers PDF de manière native. Les résultats incluent le numéro de page, le format, la valeur et la confiance pour chaque code-barres trouvé. Aucune étape de rendu PDF externe n'est requise.
Comment IronBarcode gère-t-il le traitement parallèle des codes-barres ?
Les méthodes statiques d'IronBarcode sont sans état et à l'abri des threads. Utilisez Parallel.ForEach directement sur les listes de fichiers sans gestion d'instance par thread. BarcodeReaderOptions.MaxParallelThreads contrôle le budget interne des threads.
Quelles propriétés de résultat changent lors de la migration de Barcode4.NET vers IronBarcode ?
Renommages courants : BarcodeValue devient Value, BarcodeType devient Format. Les résultats d'IronBarcode ajoutent également Confidence et PageNumber. Une recherche et un remplacement à l'échelle de la solution gèrent les renommages dans le code existant de traitement des résultats.
Comment configurer l'octroi de licences IronBarcode dans un pipeline CI/CD ?
Stockez IRONBARCODE_LICENSE_KEY en tant que secret de pipeline et attribuez IronBarCode.License.LicenseKey dans le code de démarrage de l'application. Un seul secret couvre tous les environnements, y compris le développement, les tests, la mise en scène et la production.
IronBarcode prend-il en charge la génération de codes QR avec un style personnalisé ?
Oui. QRCodeWriter.CreateQrCode() prend en charge les couleurs personnalisées via ChangeBarCodeColor(), l'intégration de logos via AddBrandLogo(), les niveaux de correction d'erreur configurables et plusieurs formats de sortie, notamment PNG, JPG, PDF et stream.

