NET MAUIを使用してC#でバーコードを読み取りおよびスキャンする方法
バーコードリブから IronBarcode への移行
このガイドでは、 .NET開発者向けにBarcodeLibからIronBarcodeへの完全な移行手順を説明します。 本書では、チームがこの移行を行う理由、段階的なパッケージ置換手順、一般的なBarcodeLibパターンごとのコード移行例、完全なAPIマッピングリファレンス、およびコードベース全体にわたる移行を管理するための構造化されたチェックリストについて解説しています。
BarcodeLibから移行する理由
BarcodeLibからIronBarcodeへの移行を検討しているチームは、以下の要因を報告しています。
読み取りAPIなし: BarcodeLibには、読み取りまたはデコード機能は含まれていません。 バーコード画像を生成していたプロジェクトが、アップロードされた画像、倉庫のスキャナー、またはサプライヤーの文書からバーコードをスキャンするという新たな要件を受けた場合、BarcodeLibはその要件を満たすことができません。 唯一の選択肢は、ZXing .NETのような別のライブラリを追加することですが、これにより、BarcodeLibと並行して維持管理する必要のある2つ目の依存関係グラフと2つ目のAPIサーフェスが導入されます。
SkiaSharpバージョンの競合:バーコードリブ3.xはSystem.Drawing.Commonを置き換えるためにSkiaSharpをグラフィックスバックエンドとして導入しました。 このライブラリは、特定のSkiaSharpバージョン範囲に限定されています。 MAUIプロジェクト、 Blazorプロジェクト、および他の依存関係によってSkiaSharpも取り込まれるプロジェクトでは、解決されたバージョンがBarcodeLibの想定範囲外になることがよくあります。 これにより、復元時にNU1608警告が発生し、最悪の場合、デバイス上でランタイムアセンブリのバインディングエラーが発生します。
PDF非対応:請求書、作業指示書、出荷明細書など、バーコードが埋め込まれたPDF文書を生成するアプリケーションは、後続の処理中にそれらのバーコードを読み取る必要がある場合があります。 BarcodeLibはバーコード画像を生成しますが、PDFファイルへの対応はしていません。 BarcodeLibを使用してPDFからバーコードを抽出するには、別のPDFライブラリを使用してPDFページを画像にレンダリングし、その画像を別の読み取りライブラリに渡す必要があります。
バイト配列出力のストリームエンコーディングステップ:バーコードリブ3.xはMemoryStreamにエンコードする必要があります。 IronBarcodeは生成チェーン上で直接.ToPngBinaryData()を提供します。
基本的な問題
BarcodeLibは生成専用のアーキテクチャを採用しているため、スキャン機能を追加すると、スタックに2つ目のライブラリを組み込む必要が生じます。
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
IronBarcodeは同じusingステートメントで同じパッケージ内で両方を処理します:
// IronBarcode: generation and reading — no second library needed
using IronBarCode;
// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("barcode.png");
// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result); // "PRODUCT-12345"
// IronBarcode: generation and reading — no second library needed
using IronBarCode;
// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("barcode.png");
// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result); // "PRODUCT-12345"
Imports IronBarCode
' Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng("barcode.png")
' Read back — same package, same namespace
Dim result = BarcodeReader.Read("barcode.png").First().Value
Console.WriteLine(result) ' "PRODUCT-12345"
IronBarcodeとBarcodeLib:機能比較
| フィーチャー | バーコードリブ | IronBarcode |
|---|---|---|
| バーコード生成 | はい | はい |
| バーコードの読み取り/スキャン | なし | はい (BarcodeReader.Read()) |
| QRコード生成 | いいえ(1Dのみ) | はい(高度な設定、ロゴ埋め込み機能付き) |
| PDFバーコード読み取り | なし | はい(ネイティブ、追加ライブラリ不要) |
| PDFバーコード生成出力 | なし | はい |
| SkiSharpの依存関係 | はい(バージョン競合のリスクあり) | なし |
| MAUIプロジェクトとの互換性 | 紛争リスク(NU1608) | 紛争なし |
| 流暢なチェーン可能なAPI | なし | はい |
byte[]を直接出力 |
手動 (via MemoryStream) |
.ToPngBinaryData() |
| 複数バーコード検出 | なし | はい (ExpectMultipleBarcodes) |
| 読書速度調整 | 該当なし | はい (ReadingSpeed enum) |
| Linux / macOS のサポート | 部分的(SkiaSharpに依存) | フル |
| Docker / コンテナのサポート | 設定が必要です | はい |
| アクティブメンテナンス | はい(コミュニティ) | はい(商用) |
| 商用サポート/SLA | なし | はい |
| ライセンス | アパッチ2.0(無料) | $999–$5,999 永続 |
クイックスタート:BarcodeLibからIronBarcodeへの移行
これらの基本的なステップを踏めば、すぐにでも移行を開始できます。
ステップ 1: NuGet パッケージを置き換える
最初にBarcodeLibパッケージを削除します:
dotnet remove package BarcodeLib
dotnet remove package BarcodeLib
参照方法がわからない場合は、.csprojファイルを確認してください:
grep -n "BarcodeLib" YourProject.csproj
grep -n "BarcodeLib" YourProject.csproj
すべてのBarcodeLib関連の<PackageReference>エントリを削除してください。 NU1608警告の回避策として明示的な<PackageReference Include="SkiaSharp">オーバーライドを追加した場合は、それも削除してください - IronBarcodeのインストール後に、他の理由でSkiaSharpがまだ必要かどうかを評価してください。 次にIronBarcodeをインストールします。
dotnet add package IronBarcode
dotnet add package IronBarcode
ステップ 2: 名前空間の更新
参照されていた各ファイルでBarcodeLib usingディレクティブを置き換えます:
// Before
using BarcodeStandard;
using SkiaSharp;
// After
using IronBarCode;
// Before
using BarcodeStandard;
using SkiaSharp;
// After
using IronBarCode;
Imports IronBarCode
Imports SkiaSharp
ステップ 3: ライセンスの初期化
アプリケーション起動時のライセンス初期化を追加します:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
ASP.NET Coreアプリケーションの場合、builder.Build()より前にこれを入れます。 コンソールアプリケーションの場合、Main()の先頭に配置します。 他のアプリケーションから呼び出されるクラスライブラリについては、ホストアプリケーションの起動時に初期化してください。
コード移行の例
基本コード128生成
最も一般的なBarcodeLibパターン: インスタンスを作成し、プロパティを設定し、Encode()を呼び出します。
BarcodeLibのアプローチ:
using BarcodeStandard;
using SkiaSharp;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
using var stream = File.OpenWrite(outputPath);
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
using BarcodeStandard;
using SkiaSharp;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
using var stream = File.OpenWrite(outputPath);
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
Imports BarcodeStandard
Imports SkiaSharp
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(Type.Code128, trackingNumber, 400, 120)
Using stream = File.OpenWrite(outputPath)
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
End Sub
IronBarcodeのアプローチ:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.AddAnnotationTextBelowBarcode(trackingNumber)
.SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.AddAnnotationTextBelowBarcode(trackingNumber)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.AddAnnotationTextBelowBarcode(trackingNumber) _
.SaveAsPng(outputPath)
End Sub
プロパティ設定ブロックは、流暢なチェーンへと収束する。 b.IncludeLabel = trueを置き換えます - ラベル文字列を明示的に受け入れるため、バーの下に表示されるテキストを制御できます。 .ResizeTo()は幅/高さの引数を置き換えます。 高度な生成オプションについては、 IronBarcodeのバーコード生成に関するドキュメントを参照してください。
バイト配列を返す — 一般的なWeb APIパターン
BarcodeLib 3.xはSKImageを返します。 それからバイトを取得するには、SkiaSharpを介してMemoryStreamにエンコードする必要があります。 IronBarcodeは直接.ToPngBinaryData()を提供します。
BarcodeLibのアプローチ:
using BarcodeStandard;
using SkiaSharp;
using System.IO;
public byte[] GetBarcodeBytes(string data)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
using System.IO;
public byte[] GetBarcodeBytes(string data)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
Public Function GetBarcodeBytes(data As String) As Byte()
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End Function
IronBarcodeのアプローチ:
using IronBarCode;
public byte[] GetBarcodeBytes(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
}
using IronBarCode;
public byte[] GetBarcodeBytes(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GetBarcodeBytes(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
End Function
MemoryStream中間ステップは存在しません。 byte[]を直接返し、HTTPレスポンスボディ、データベースBLOBカラム、ファイルライタが実際に欲しているものです。
Web APIコントローラーアクション
BarcodeLibのアプローチ:
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, sku, 400, 120);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return File(ms.ToArray(), "image/png");
}
}
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, sku, 400, 120);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return File(ms.ToArray(), "image/png");
}
}
Imports BarcodeStandard
Imports SkiaSharp
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, sku, 400, 120)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return File(ms.ToArray(), "image/png")
End Using
End Function
End Class
IronBarcodeのアプローチ:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.ToPngBinaryData()
Return File(pngBytes, "image/png")
End Function
End Class
コントローラーアクションはFile()に流れます。
QRコード生成
BarcodeLib 3.xはQRコードを生成しないため、BarcodeStandard.Type列挙型には2Dのエントリがありません。 BarcodeLibと並行してQRが必要なプロジェクトは通常QRCoderなどの第2のライブラリを追加しました。 IronBarcodeはロゴ埋め込みやスタイリングの追加オプションを持つ専用のQRCodeWriterクラスを使用します。
BarcodeLibのアプローチ:
//バーコードリブhas no QR Code (or any 2D) support.
// Generating a QR code from aバーコードリブproject required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
//バーコードリブhas no QR Code (or any 2D) support.
// Generating a QR code from aバーコードリブproject required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
'バーコードリブhas no QR Code (or any 2D) support.
' Generating a QR code from aバーコードリブproject required adding a
' second library such as QRCoder:
'
' Imports QRCoder
' Dim qrGen As New QRCodeGenerator()
' Dim data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q)
' ' ... separate API, separate dependency to maintain.
IronBarcodeのアプローチ:
using IronBarCode;
// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.SaveAsPng("qr.png");
// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.SaveAsPng("qr.png");
// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
' Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.SaveAsPng("qr.png")
' QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
QRCodeWriter.CreateQrCode()はデータ文字列とピクセルサイズをパラメータとして受け取ります。 ロゴの埋め込み、色のカスタマイズ、エラー修正レベルはすべて、連鎖的な方法によって利用可能です。 QRコードのスタイル設定オプションについては、 IronBarcodeのQRコードに関するドキュメントを参照してください。
EAN-13とUPC-A
これらは小売業の在庫管理システムでよく見られるものです。 列挙型の名前は変わりますが、値は直接的に同等です。
BarcodeLibのアプローチ:
using BarcodeStandard;
using SkiaSharp;
// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
using BarcodeStandard;
using SkiaSharp;
// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
' EAN-13 product barcode
Dim b As New Barcode()
Dim ean As SKImage = b.Encode(Type.Ean13, "5901234123457", 250, 100)
Using s = File.OpenWrite("product-ean.png")
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
' UPC-A for US retail
Dim upc As SKImage = b.Encode(Type.UpcA, "012345678905", 250, 100)
Using s = File.OpenWrite("product-upc.png")
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
IronBarcodeのアプローチ:
using IronBarCode;
// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.ResizeTo(250, 100)
.SaveAsPng("product-ean.png");
// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
.ResizeTo(250, 100)
.SaveAsPng("product-upc.png");
using IronBarCode;
// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.ResizeTo(250, 100)
.SaveAsPng("product-ean.png");
// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
.ResizeTo(250, 100)
.SaveAsPng("product-upc.png");
Imports IronBarCode
' EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.ResizeTo(250, 100) _
.SaveAsPng("product-ean.png")
' UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA) _
.ResizeTo(250, 100) _
.SaveAsPng("product-upc.png")
バーコード読み取り機能の追加(新規機能)
BarcodeLibには読み取りAPIがありません。 移行の動機が、アップロードされた画像、倉庫のスキャナー、またはスキャンされた PDF ドキュメントからバーコードをスキャンするという新しい要件である場合は、2 つ目のライブラリを追加せずに以下を追加してください。
BarcodeLibのアプローチ:
//バーコードリブ— no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
//バーコードリブ— no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
'バーコードリブ— no reading API exists
' Adding reading requires a separate library such as ZXing.Net:
' dotnet add package ZXing.Net
' Imports ZXing
' Dim reader As New BarcodeReader()
' ' ... separate API, separate dependency graph to manage
IronBarcodeのアプローチ:
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
Imports IronBarCode
' Read a barcode from an image file
Dim results = BarcodeReader.Read("incoming-label.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read all barcodes from a multi-page PDF — no PDF library required
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Configure for high-volume scanning with multiple barcodes per image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim warehouseResults = BarcodeReader.Read("dock-scan.png", options)
System.Drawing.Bitmapオブジェクトを受け入れます。 ReadingSpeed列挙型により、大量のスキャン時に完全性とパフォーマンスを交換できます。 読み取り設定オプションについては、 IronBarcodeの読み取りに関するドキュメントを参照してください。
SkiaSharp紛争の解決
移行の動機がNU1608警告である場合は、パッケージを切り替えた後に競合が解決されていることを確認してください。 dotnet add package IronBarcodeを実行した後、出力を再構築して確認してください:
dotnet build 2>&1 | grep -i "NU1608\|SkiaSharp"
dotnet build 2>&1 | grep -i "NU1608\|SkiaSharp"
出力が表示されない場合は、競合は解決済みです。 SkiaSharpの警告が引き続き表示される場合は、依存関係グラフ内の別のパッケージが原因です。IronBarcodeは原因ではありません。
BarcodeLibのアプローチ:
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
IronBarcodeのアプローチ:
<ItemGroup>
<PackageReference Include="IronBarcode" Version="*" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="IronBarcode" Version="*" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
バーコードリブAPI からIronBarcodeへのマッピングリファレンス
| バーコードリブ | IronBarcode |
|---|---|
new Barcode() |
静的API - インスタンスは不要 |
b.Encode(Type.Code128, "data", w, h) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
Width/heightがEncode()に渡されます。 |
.ResizeTo(width, height) |
Returns SKImage |
.SaveAsPng(path) / .ToPngBinaryData() |
Type.Code128 |
BarcodeEncoding.Code128 |
Type.Code39 |
BarcodeEncoding.Code39 |
Type.Ean13 |
BarcodeEncoding.EAN13 |
Type.UpcA |
BarcodeEncoding.UPCA |
| QRサポートなし(1Dのみ) | BarcodeEncoding.QRCode (also QRCodeWriter) |
Type.Itf14 |
BarcodeEncoding.ITF14 |
Type.Codabar |
BarcodeEncoding.Codabar |
| 読み取りAPIはありません | BarcodeReader.Read(path) |
| MAUIにおけるSkiaSharpのバージョン競合 | 競合する依存関係はありません |
img.Encode(...).SaveTo(stream) |
.SaveAsPng(path) |
MemoryStream + SkiaSharp encode |
.ToPngBinaryData() |
一般的な移行の問題と解決策
問題1: 型列挙型の名前空間の変更
BarcodeLib 3.x: BarcodeStandard.Type.Code128 (PascalCase, in the BarcodeStandard namespace)を使用します。 古い2.xのコードはBarcodeLib.TYPE.CODE128 (大文字定数, BarcodeLib namespace)を使用するかもしれません - 両方の形式が移行中の実際のコードベースに登場します。
ソリューション: BarcodeEncoding.Code128に置き換えます。 grepを使用して.csファイル全体を検索し、すべての出現箇所を特定します。
grep -rn "Type\.\|TYPE\." --include="*.cs" .
grep -rn "Type\.\|TYPE\." --include="*.cs" .
一般的な置き換え: Type.Code128 / TYPE.CODE128 → BarcodeEncoding.Code128, Type.Ean13 / TYPE.EAN13 → BarcodeEncoding.EAN13, Type.UpcA / TYPE.UPCA → BarcodeEncoding.UPCA, Type.Itf14 / TYPE.ITF14 → BarcodeEncoding.ITF14, Type.Codabar / TYPE.CO/DABAR → BarcodeEncoding.Codabar。 BarcodeLibにはQRエントリがありません; どんなTYPE.QR_Codeも2.xバージョンまたはフォークからのデッドコードです - BarcodeEncoding.QRCodeに置き換えてください (またはスタイル付き出力にQRCodeWriterを使用してください)。
問題2: SKImage / Image 戻り値型
BarcodeLib: System.Drawing.Imageを返します。 どちらのタイプもIronBarcodeではコンパイルされません。
ソリューション:中間画像変数を削除し、流暢なチェーン上の適切な終端メソッドで保存ロジックを置き換えます:
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
Imports System.IO
' Before (BarcodeLib 3.x)
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
' After
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
Image img = b.Encodeパターンを検索し、影響を受けたすべての箇所を見つけてください。
問題3: 幅と高さのパラメータ
BarcodeLib: 幅と高さは3.xのb.Width / b.Heightプロパティ割り当てが別々になっています。 どちらの形式も移植が必要です。
ソリューション: 幅/高さは.ResizeTo(width, height)コールになります。 コールサイトを見つける:
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
次に、サイズ引数またはプロパティペアを単一の.ResizeTo(width, height)チェーンコールに置き換えます。
問題4:IncludeLabelブール値切り替え
BarcodeLib: b.IncludeLabel = trueは自動的にエンコードされたデータ文字列をバーの下に見えるテキストとしてレンダリングするブール型です。
ソリューション: ラベル文字列を明示的に受け取る.AddAnnotationTextBelowBarcode("text")を使用してください。 ほとんどの場合、バーコードにエンコードされたデータ文字列と同じものを渡してください。 元のコードがIncludeLabel = trueを使用しており、BarcodeLibにデータをラベルとして自動レンダリングさせていた場合、その同じデータ文字列を明示的に渡してください:
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.AddAnnotationTextBelowBarcode(data) // pass the same string
.SaveAsPng(outputPath);
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.AddAnnotationTextBelowBarcode(data) // pass the same string
.SaveAsPng(outputPath);
Dim barcodeWriter = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
barcodeWriter.AddAnnotationTextBelowBarcode(data) ' pass the same string
barcodeWriter.SaveAsPng(outputPath)
問題5:BarcodeLib削除後に残ったSkiaSharp参照
BarcodeLib: プロジェクトはBarcodeLibのバージョン制約をオーバーライドするために明示的な<PackageReference Include="SkiaSharp">エントリを頻繁に蓄積しました。 BarcodeLibが削除されると、これらは孤立した状態になります。
解決策: IronBarcodeに切り替えた後、明示的な参照を削除する前に、SkiaSharpが他のパッケージでまだ必要とされているかどうかを確認してください。
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
SkiaSharpが削除された明示的な<PackageReference>のためだけに出現する場合、そのエントリを削除してください。 MAUIや他の依存関係によってまだ取り込まれている場合は、そのままにしておいてください。IronBarcodeはそれと競合しません。
BarcodeLib移行チェックリスト
マイグレーション前のタスク
変更範囲を把握するために、作業を開始する前に以下の検索を実行してください。
# Find allバーコードリブusing directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .
# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .
# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .
# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .
# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .
# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .
# Find NU1608 evidence in lock files
grep -rn "NU1608" .
# Find allバーコードリブusing directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .
# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .
# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .
# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .
# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .
# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .
# Find NU1608 evidence in lock files
grep -rn "NU1608" .
各検索によって影響を受けたすべてのファイルを文書化してください。 どのプロジェクトがBarcodeLibを直接参照しているか、またどのプロジェクトが推移的にBarcodeLibを継承しているかを注視してください。 BarcodeLibの競合を解決するためだけに追加された、明示的なSkiaSharpバージョンの上書きを特定してください。
コード更新タスク
- 各プロジェクトで
dotnet remove package BarcodeLibを実行します - BarcodeLibの競合を修正するためだけに追加された、明示的なSkiaSharpバージョンの上書き参照をすべて削除します。
- 各プロジェクトで
dotnet add package IronBarcodeを実行します - 各プロジェクトのアプリケーションスタートアップに
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";を追加します using BarcodeStandard;(または古いコードではusing BarcodeLib;) とusing SkiaSharp;を全てのusing IronBarCode;に置き換えます- 2.x
using System.Drawing.Imaging;インポートを削除します new Barcode()+BarcodeWriter.CreateBarcode()流暢なチェーンに置き換えますType.Code128/TYPE.CODE128→BarcodeEncoding.Code128と他のすべての列挙値を置き換えます- width/height引数(または2.x
b.Width = N; b.Height = M;) with.ResizeTo(N, M)チェーンコール .AddAnnotationTextBelowBarcode(data)に置き換えます.ToPngBinaryData()に置き換えます- 中間
SKImage/.ToPngBinaryData()がそれらを置き換える場合 - 必要に応じてバーコード読み取りコードを追加します (
BarcodeReader.Read())
移行後のテスト
プロジェクトをビルドし、復元出力にNU1608警告が残っていないことを確認します。
dotnet build 2>&1を実行します | grep -i "NU1608|SkiaSharp"`を使用して、SkiaSharpの競合が完全に解決されたことを確認します。 生成されたバーコードの視覚的な出力を、BarcodeLibの既知の良品サンプルと比較する。- モバイルスキャナーや
BarcodeReader.Read()メソッドを使用してQRコードが正しくデコードされることを確認します - 該当する場合は、EAN-13およびUPC-Aバーコードを小売店のスキャナーハードウェアでテストする
- 画像がすべての出力先(ファイルシステム、HTTPレスポンス、データベースストレージ)で正しく表示されることを確認する。
- 実際の文書で
BarcodeReader.Read("file.pdf")を使用して、PDFバーコード読み取りシナリオをテストします プロジェクトがLinuxまたはmacOSをターゲットとしている場合、クロスプラットフォームビルドが成功することを確認します。 - AndroidおよびiOSターゲットで、SkiaSharpバインディングエラーなしでMAUIビルドが完了することを確認します。
IronBarcodeへの移行の主なメリット
セカンドライブラリなしでバーコードを読み取る:読み取り機能を必要とするチームにとって、最も直接的なメリットは、セカンドライブラリへの依存をなくせることです。 using IronBarCode;ステートメントを使用し、追加のNuGetインストールは必要ありません。 ZXing .NETとその依存関係グラフは、もはやプロジェクトの一部ではありません。
SkiaSharpのバージョン競合なし: IronBarcodeは、アプリケーションコードとSkiaSharpの依存関係グラフを共有しません。 MAUIプロジェクト、 Blazorプロジェクト、および複数のパッケージがSkiaSharp上で統合されるあらゆるプロジェクトは、NU1608警告やランタイムバインディングエラーなしにIronBarcodeをインストールできます。 BarcodeLibが導入したバージョンネゴシエーション機能は廃止されました。
直接バイト配列出力: byte[]を返します。 BarcodeLibでバイト配列出力に必要だったMemoryStream中間体は、バーコードを生成するすべてのコントローラーアクション、サービスメソッド、APIハンドラーから削除されます。
PDFバーコード処理: BarcodeReader.Read()はPDFファイルをネイティブに受け入れます。 埋め込みバーコードを含むPDF文書を生成するアプリケーションは、別途PDFレンダリングライブラリを用意することなく、それらのバーコードを読み取ることができます。 生成、PDF埋め込み、読み取りといった一連の処理はすべてIronBarcode内で行われます。
Commercial Support and SLA: IronBarcodeは、Iron Softwareの商業支援モデルに基づいており、定義された更新サイクルがあります。 新しい.NETリリースが発表されたり、.NETエコシステムに重大な変更が現れたとき、IronBarcodeは商業SLAに基づくタイムラインで互換性更新を発表します。
第二のライブラリなしでのQRコード生成: QRCodeWriterはロゴ埋め込み、色のカスタマイズ、誤り訂正レベルの設定をチェーンメソッドを通してサポートします。バーコードリブ3.xは1Dのシンボロジーのみを生成します — BarcodeLibと共にQRが必要なプロジェクトは以前、QRCoderなどの第2のライブラリを追加しました。 QRコードのニーズが拡大したチームは、生成ワークフローを変更することなく、同じパッケージ内でこれらの機能を取得できます。
よくある質問
なぜBarcodeLibからIronBarcodeに移行する必要があるのですか?
一般的な理由としては、ライセンスの簡素化(SDK + ランタイムキーの複雑さの排除)、スループット制限の排除、ネイティブPDFサポートの獲得、Docker/CI/CDデプロイの改善、プロダクションコード内のAPI定型文の削減などが挙げられます。
BarcodeLib APIコールをIronBarcodeに置き換えるには?
インスタンスの作成とライセンスの定型文をIronBarCode.License.LicenseKey = "key "に置き換えてください。リーダー・コールをBarcodeReader.Read(path)に、ライター・コールをBarcodeWriter.CreateBarcode(data, encoding)に置き換えてください。静的メソッドはインスタンス管理を必要としません。
BarcodeLibからIronBarcodeに移行する場合、コードはどのくらい変更されますか?
ほとんどのマイグレーションでは、コード行数は少なくなります。ライセンスの定型文、インスタンス・コンストラクタ、明示的なフォーマット設定が削除されます。コアとなる読み取り/書き込み操作は、より短いIronBarcodeに対応し、よりきれいな結果オブジェクトが得られます。
移行中、BarcodeLibとIronBarcodeの両方をインストールしておく必要がありますか?
ほとんどのマイグレーションは、並列操作ではなく、直接置き換えです。一度に1つのサービスクラスを移行し、NuGet参照を置き換え、インスタンス化とAPI呼び出しパターンを更新してから次のクラスに移行します。
IronBarcodeのNuGetパッケージ名は何ですか?
パッケージは'IronBarcode'(大文字のBとC)です。Install-Package IronBarcode'または'dotnet add package IronBarcode'でインストールしてください。コード中のusingディレクティブは'using IronBarcode;'である。
IronBarcodeはBarcodeLibと比べてどのようにDockerデプロイを簡素化しますか?
IronBarcodeは外部SDKファイルやマウントされたライセンス設定のないNuGetパッケージです。Dockerでは、IRONBARCODE_LICENSE_KEY環境変数を設定すると、パッケージが起動時にライセンス検証を処理します。
IronBarcodeはBarCodeLibから移行した後、すべてのバーコードフォーマットを自動的に検出しますか?
IronBarcodeは、サポートされているすべてのフォーマットのシンボルを自動検出します。明示的なBarcodeTypesの列挙は必要ありません。フォーマットが既に知られていて、パフォーマンスが重要な場合、BarcodeReaderOptionsは最適化として検索空間を制限することができます。
IronBarcodeは別のライブラリなしでPDFからバーコードを読み取ることができますか?
BarcodeReader.Read("document.pdf")は、PDFファイルをネイティブに処理します。結果には、見つかった各バーコードの PageNumber、Format、Value、および Confidence が含まれます。外部のPDFレンダリングステップは必要ありません。
IronBarcodeはどのようにパラレルバーコード処理を行うのですか?
IronBarcodeの静的メソッドはステートレスでスレッドセーフです。Parallel.ForEachをスレッドごとのインスタンス管理なしにファイルリスト上で直接使用します。BarcodeReaderOptions.MaxParallelThreadsは内部のスレッドバジェットを制御します。
BarcodeLibからIronBarcodeに移行すると、どのような結果のプロパティが変更されますか?
一般的なリネーム:BarcodeValueはValueに、BarcodeTypeはFormatに。IronBarcodeの結果にはConfidenceとPageNumberも追加されます。ソリューション全体の検索と置換は、既存の結果処理コードで名前の変更を処理します。
CI/CDパイプラインでIronBarcodeのライセンスを設定するには?
IRONBARCODE_LICENSE_KEYをパイプラインシークレットとして保存し、アプリケーションの起動コードにIronBarCode.License.LicenseKeyを割り当てます。1つのシークレットで、開発環境、テスト環境、ステージング環境、本番環境を含むすべての環境をカバーできます。
IronBarcodeはカスタムスタイルのQRコード生成に対応していますか?
はい。QRCodeWriter.CreateQrCode()は、ChangeBarCodeColor()によるカスタムカラー、AddBrandLogo()によるロゴ埋め込み、設定可能なエラー訂正レベル、PNG、JPG、PDF、ストリームなどの複数の出力形式をサポートしています。

