NET MAUIを使用してC#でバーコードを読み取りおよびスキャンする方法
インフラジスティクス バーコード から IronBarcode への移行
Infragisticsのバーコード移行のほとんどは、WinForms、 ASP.NET Core、またはWPF以外のプロジェクトなど、生成機能しか利用できないプロジェクトでバーコード読み取り機能が必要になった場合、あるいはイベント駆動型のWPFリーダーAPIが本番環境での使用には脆弱すぎることが判明した場合に発生します。 TaskCompletionSource ブリッジパターン、同時呼び出しを安全でなくする共有 _result フィールド、そして SymbologyType フラグが欠如していることによる無音の失敗は、チームが代替案を探す一般的な理由です。
このガイドでは、Infragisticsのバーコードパッケージの削除、WinFormsとWPFの両方のコンテキストにおける生成および読み取りコードの置き換え、そしてInfragisticsが全くサポートしていなかったプロジェクトタイプへのバーコード機能の追加など、移行の全手順を説明します。
クイックスタート
ステップ1:Infragisticsバーコードパッケージを削除する
プロジェクトからInfragisticsのバーコードNuGetパッケージを削除してください。 使用していたターゲットによって異なります。
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
# WinForms generation package
dotnet remove package Infragistics.WinForms.Barcode
# WPF reading package
dotnet remove package Infragistics.WPF.BarcodeReader
プロジェクトファイルが両方を参照している場合は、両方とも削除してください。 他のInfragisticsコンポーネントを使用している場合、バーコード固有のパッケージを削除してもInfragistics Ultimateライセンスには影響しません。
ステップ2: IronBarcodeをインストールする
dotnet add package IronBarcode
dotnet add package IronBarcode
IronBarcodeは、WinForms、WPF、 ASP.NET Core、コンソール、 Blazor Server、Docker、Azure Functions、AWS Lambdaなど、様々なプラットフォームで動作する単一のパッケージです。 フレームワークごとに個別のパッケージを用意する必要はありません。
ステップ 3: 名前空間の更新
Infragisticsバーコード名前空間をIronBarCode(大文字のB、大文字のC)に置き換えます:
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;
// Remove these:
// using Infragistics.Win.UltraWinBarcode;
// using Infragistics.Controls.Barcodes;
// using System.Windows.Media.Imaging; // if only used for barcode BitmapImage loading
// Add this:
using IronBarCode;
Imports IronBarCode
ステップ4:ライセンスを初期化する
アプリケーション開始時に1回だけライセンスの初期化を追加します—App.xaml.cs、またはDI構成ルート:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
コード移行の例
WinForms生成:UltraWinBarcodeからBarcodeWriterへ
WinForms生成パターンは、IronBarcodeのBarcodeWriterにきれいにマッピングされます:
以前(Infragistics WinForms):
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
using Infragistics.Win.UltraWinBarcode;
var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
Imports Infragistics.Win.UltraWinBarcode
Dim barcode As New UltraWinBarcode()
barcode.Symbology = Symbology.Code128
barcode.Data = "ITEM-12345"
barcode.SaveTo(outputPath)
(IronBarcode)後:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
// NuGet: dotnet add package IronBarcode
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
Infragistics Symbology 列挙値は BarcodeEncoding 列挙に移り、これはプロパティ割り当てではなく CreateBarcode() のパラメーターになります。 データが最初の引数となる。 SaveTo() は、出力形式に応じて .SaveAsSvg()、または .SaveAsPdf() になります。
保存する前にバーコードのサイズを変更する必要がある場合:
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
using IronBarCode;
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
Imports IronBarCode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
WPFイベント駆動型読み取り:サービスクラスから2行への変換
これは移民数の減少において最も顕著な例である。 インフラジスティクス WPFの読み取りパターンでは、完全なサービス クラスが必要です。
変更前(Infragistics WPF - 約35行):
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.Value ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
using Infragistics.Controls.Barcodes;
using System.Windows.Media.Imaging;
private BarcodeReader _reader;
private TaskCompletionSource<string> _result;
public InfragisticsBarcodeService()
{
_reader = new BarcodeReader();
_reader.DecodeComplete += OnDecodeComplete;
}
public async Task<string> ReadBarcodeAsync(string imagePath)
{
_result = new TaskCompletionSource<string>();
var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
_reader.SymbologyTypes = Symbology.Code128 |
Symbology.Code39 |
Symbology.QRCode |
Symbology.EAN8 |
Symbology.EAN13 |
Symbology.UpcA |
Symbology.Interleaved2Of5;
_reader.Decode(bitmap);
return await _result.Task;
}
private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
_result?.TrySetResult(e.Value ?? "No barcode found");
}
public void Dispose()
{
if (_reader != null)
{
_reader.DecodeComplete -= OnDecodeComplete;
_reader = null;
}
}
Imports Infragistics.Controls.Barcodes
Imports System.Windows.Media.Imaging
Imports System.Threading.Tasks
Private _reader As BarcodeReader
Private _result As TaskCompletionSource(Of String)
Public Sub New()
_reader = New BarcodeReader()
AddHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
End Sub
Public Async Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
_result = New TaskCompletionSource(Of String)()
Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))
_reader.SymbologyTypes = Symbology.Code128 Or
Symbology.Code39 Or
Symbology.QRCode Or
Symbology.EAN8 Or
Symbology.EAN13 Or
Symbology.UpcA Or
Symbology.Interleaved2Of5
_reader.Decode(bitmap)
Return Await _result.Task
End Function
Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
_result?.TrySetResult(If(e.Value, "No barcode found"))
End Sub
Public Sub Dispose()
If _reader IsNot Nothing Then
RemoveHandler _reader.DecodeComplete, AddressOf OnDecodeComplete
_reader = Nothing
End If
End Sub
(IronBarcode - 2行)後:
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
サービスクラス全体—インスタンス管理、イベントワイヤリング、Dispose()—はなくなります。 BarcodeReader.Read() は同期的で、静的で、ファイルパス文字列を直接受け取ります。
シンボルタイプも返していた場合:
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}
using IronBarCode;
var results = BarcodeReader.Read(imagePath);
var first = results.FirstOrDefault();
if (first != null)
{
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read(imagePath)
Dim first = results.FirstOrDefault()
If first IsNot Nothing Then
Console.WriteLine($"Value: {first.Value}, Format: {first.Format}")
End If
result.Value は e.Value に取って代わります。 result.Format は e.Symbology に取って代わります。
WinFormsの読み取り機能を追加(以前は不可能でした)
生成機能のみを備えたWinFormsプロジェクトを使用していた場合、同じパッケージで読み取り機能も利用できるようになりました。
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}
using IronBarCode;
// In a WinForms button handler or service method — same API as WPF or ASP.NET Core
var results = BarcodeReader.Read(imagePath);
foreach (var result in results)
{
MessageBox.Show($"Found: {result.Value} ({result.Format})");
}
Imports IronBarCode
' In a WinForms button handler or service method — same API as WPF or ASP.NET Core
Dim results = BarcodeReader.Read(imagePath)
For Each result In results
MessageBox.Show($"Found: {result.Value} ({result.Format})")
Next
追加のパッケージは不要で、フレームワーク固有のセットアップもありません。同じ BarcodeReader.Read() 呼び出しがWinFormsでもWPFでも動作します。
ASP.NET Coreエンドポイント(従来は不可能だった)
Infragisticsのパッケージでは、 ASP.NET Coreコントローラーでのバーコードの生成と読み取りは不可能でした。 IronBarcodeを使用:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/barcode")]
public class BarcodeController : ControllerBase
{
[HttpPost("read")]
public IActionResult ReadBarcode(IFormFile imageFile)
{
using var stream = imageFile.OpenReadStream();
var results = BarcodeReader.Read(stream);
var values = results.Select(r => new { r.Value, Format = r.Format.ToString() });
return Ok(values);
}
[HttpGet("generate")]
public IActionResult GenerateBarcode([FromQuery] string data)
{
var bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.ToPngBinaryData();
return File(bytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/barcode")>
Public Class BarcodeController
Inherits ControllerBase
<HttpPost("read")>
Public Function ReadBarcode(imageFile As IFormFile) As IActionResult
Using stream = imageFile.OpenReadStream()
Dim results = BarcodeReader.Read(stream)
Dim values = results.Select(Function(r) New With {Key .Value = r.Value, Key .Format = r.Format.ToString()})
Return Ok(values)
End Using
End Function
<HttpGet("generate")>
Public Function GenerateBarcode(<FromQuery> data As String) As IActionResult
Dim bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.ToPngBinaryData()
Return File(bytes, "image/png")
End Function
End Class
BarcodeReader.Read() は Stream を直接受け入れます—先にディスクにアップロードを保存する必要はありません。
PDFバーコード読み取り
IronBarcodeはPDFドキュメントからバーコードをネイティブに読み取ります。別途パッケージは必要ありません。
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
using IronBarCode;
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("document.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})");
}
Imports IronBarCode
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("document.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: {result.Value} ({result.Format})")
Next
Infragisticsには同等の機能がなかった。PDFバーコードを読み取るには、スキャンする前にPDFページを外部で画像に変換する必要があった。
バッチ処理:逐次処理から並列処理へ
以前(Infragistics - シーケンシャル処理であり、並列化には対応していません):
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();
// Must process one at a time — shared _result field is not thread-safe
var service = new InfragisticsBarcodeService();
var results = new List<string>();
foreach (var file in imageFiles)
{
var value = await service.ReadBarcodeAsync(file);
results.Add(value);
}
service.Dispose();
Imports System.Collections.Generic
' Must process one at a time — shared _result field is not thread-safe
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()
For Each file In imageFiles
Dim value As String = Await service.ReadBarcodeAsync(file)
results.Add(value)
Next
service.Dispose()
(IronBarcode - 並列処理、スレッドセーフ)後:
using IronBarCode;
// Option 1: pass an array directly — IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;
// Option 1: pass an array directly — IronBarcode handles parallelization internally
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read(imageFiles.ToArray(), options);
foreach (var result in results)
{
Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode
' Option 1: pass an array directly — IronBarcode handles parallelization internally
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read(imageFiles.ToArray(), options)
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
using IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});
using IronBarCode;
using System.Collections.Concurrent;
// Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
var allValues = new ConcurrentBag<string>();
Parallel.ForEach(imageFiles, file =>
{
var results = BarcodeReader.Read(file);
foreach (var r in results)
allValues.Add(r.Value);
});
Imports IronBarCode
Imports System.Collections.Concurrent
' Option 2: Parallel.ForEach — static BarcodeReader.Read is thread-safe
Dim allValues As New ConcurrentBag(Of String)()
Parallel.ForEach(imageFiles, Sub(file)
Dim results = BarcodeReader.Read(file)
For Each r In results
allValues.Add(r.Value)
Next
End Sub)
廃棄パターンの削除
コードにInfragisticsのIDisposable実装が含まれている場合、それらは完全に削除できます。 IronBarcodeのBarcodeReaderは静的クラスです。 作成するインスタンスはなく、デタッチするイベントハンドラーもなく、呼び出すDispose()もありません。
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();
// Before: service registered as IDisposable in DI container
services.AddScoped<InfragisticsBarcodeService>(); // implements IDisposable
// After: no registration needed — use static method directly, or wrap in thin service if preferred
// services.AddScoped<IBarcodeService, IronBarcodeService>();
' Before: service registered as IDisposable in DI container
services.AddScoped(Of InfragisticsBarcodeService)() ' implements IDisposable
' After: no registration needed — use static method directly, or wrap in thin service if preferred
' services.AddScoped(Of IBarcodeService, IronBarcodeService)()
DI(依存性注入)を目的とした薄いラッパーサービスは、簡単に作成できます。
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}
using IronBarCode;
public class BarcodeService
{
public IEnumerable<string> Read(string path)
=> BarcodeReader.Read(path).Select(r => r.Value);
public byte[] Generate(string data, BarcodeEncoding encoding)
=> BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData();
}
Imports IronBarCode
Public Class BarcodeService
Public Function Read(path As String) As IEnumerable(Of String)
Return BarcodeReader.Read(path).Select(Function(r) r.Value)
End Function
Public Function Generate(data As String, encoding As BarcodeEncoding) As Byte()
Return BarcodeWriter.CreateBarcode(data, encoding).ToPngBinaryData()
End Function
End Class
コンストラクタの注入なし、Dispose()なし、イベント管理なし。
よくある移行の問題
シンボルタイプフラグが削除されました
Infragistics WPFリーダーのSymbologyTypesプロパティは、サポートしたいすべてのバーコード形式を列挙する必要がありました。 IronBarcodeにはこれに匹敵するものはなく、50種類以上の対応フォーマットすべてを読み取り時に自動的に検出します。
これには重要な副作用があります。特定のバーコード形式がSymbologyTypeフラグがリストから欠落しているために以前静かに失敗していた場合、IronBarcodeはそれを見つけるようになります。 これまで黙って無視されていたバーコード値が、生産工程で表示されるようになるかもしれません。 これは正しい動作です。これらのバーコードは元々そこに存在していました。
返される形式を制約する必要がある場合(パフォーマンスや曖昧さの理由で)、BarcodeReaderOptionsはこれをサポートします:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false
};
var results = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(imagePath, options)
ビットマップ画像の読み込みは不要です
Infragistics WPFリーダーは画像をnew BitmapImage(new Uri(path, UriKind.Absolute))経由でロードする必要がありました。 IronBarcodeは、ファイルパス文字列、バイト配列、およびストリームを直接受け入れます。
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));
// All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png");
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"));
BarcodeReader.Read(File.OpenRead("path/to/image.png"));
' All of these work — no BitmapImage conversion needed
BarcodeReader.Read("path/to/image.png")
BarcodeReader.Read(File.ReadAllBytes("path/to/image.png"))
BarcodeReader.Read(File.OpenRead("path/to/image.png"))
バーコード関連の画像読み込みのためだけに存在していたusing System.Windows.Media.Imaging;インポートを削除できます。
TaskCompletionSource パターンが削除されました
イベントドリブンのTaskCompletionSource<string>フィールドが完全に消えます。 BarcodeReader.Read()は同期的で、その結果を直接返します。
呼び出しコードがawait service.ReadBarcodeAsync(path)であった場合、次のように簡素化できます:
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";
// Before
var value = await service.ReadBarcodeAsync(imagePath);
// After
var value = BarcodeReader.Read(imagePath).FirstOrDefault()?.Value ?? "No barcode found";
スレッドをブロックせずに、下流の呼び出し元に対して非同期インターフェースを維持したい場合は、次の手順に従ってください。
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}
public Task<string> ReadBarcodeAsync(string imagePath)
{
return Task.Run(() =>
{
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
});
}
Option Strict On
Public Function ReadBarcodeAsync(imagePath As String) As Task(Of String)
Return Task.Run(Function()
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
End Function)
End Function
物件名の変更
| インフラジスティクス | IronBarcode |
|---|---|
ReaderDecodeArgs内) |
result.Value |
ReaderDecodeArgs内) |
result.Format |
barcode.Data |
BarcodeWriter.CreateBarcode()の最初の引数 |
barcode.Symbology = Symbology.Code128 |
BarcodeEncoding.Code128(パラメーター) |
barcode.SaveTo(path) |
.SaveAsPng(path) / .SaveAsJpeg(path) / .SaveAsSvg(path) |
移行チェックリスト
コードベース内のInfragisticsバーコードの使用箇所をすべて検索するには、以下のgrepパターンを使用してください。
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
# Namespace references
grep -r "Infragistics.WinForms.Barcode\|Infragistics.Win.UltraWinBarcode" --include="*.cs" .
grep -r "Infragistics.Controls.Barcodes" --include="*.cs" .
grep -r "Infragistics.WPF.BarcodeReader" --include="*.csproj" .
# WinForms generation types
grep -r "UltraWinBarcode" --include="*.cs" .
grep -r "Symbology\.Code" --include="*.cs" .
grep -r "barcode\.SaveTo(" --include="*.cs" .
# WPF reading types and patterns
grep -r "new BarcodeReader()" --include="*.cs" .
grep -r "DecodeComplete" --include="*.cs" .
grep -r "ReaderDecodeArgs" --include="*.cs" .
grep -r "SymbologyType\." --include="*.cs" .
grep -r "e\.Value\|ReaderDecodeArgs" --include="*.cs" .
grep -r "BitmapImage" --include="*.cs" .
# TaskCompletionSource usage (likely barcode-related if near above patterns)
grep -r "TaskCompletionSource" --include="*.cs" .
各試合を順に進めてください。
BarcodeWriter.CreateBarcode()に置き換えますnew BarcodeReader()+BarcodeReader.Read()に置き換えますSymbologyTypeフラグリスト:完全に削除します- バーコード入力に使用された
BitmapImageロード:直接パス/ストリーム/バイトに置き換えます e.Value→e.Symbology→result.Formatに抽出します バーコードサービスクラスの_readerであった場合は削除します
機能比較
| フィーチャー | インフラジスティクス バーコード | IronBarcode |
|---|---|---|
| WinFormsによるバーコード生成 | はい(UltraWinBarcode) | はい |
| WinFormsでのバーコード読み取り | 不可 | はい |
| WPFバーコード生成 | はい(XamBarcode) | はい |
| WPFバーコード読み取り | はい(イベント駆動型) | はい(同期) |
| .NET Core | 不可 | はい |
| コンソール/ワーカーサービス | 不可 | はい |
| Docker / Linux | 不可 | はい |
| Azure Functions | 不可 | はい |
| Blazorサーバー | 不可 | はい |
| 自動フォーマット検出 | いいえ — SymbologyType フラグは必須です | はい |
| PDFバーコード読み取り | 不可 | はい(ネイティブ) |
| スレッドセーフな同時読み取り | なし | はい |
| バッチ読み込み(内蔵) | なし | はい |
| QRコードエラー訂正制御 | 不可 | はい |
| 静的API(インスタンスなし) | なし | はい |
| Suiteのサブスクリプションが必要です | はい (Infragistics Ultimate, $2,399+/年) | なし |
| 永久ライセンス | なし | はい、749ドルから |
移行後の主なメリット
WinFormsでのバーコード読み取り。 WinFormsの読み取り要件に基づくマイグレーションが実行された場合、これは主な結果です:BarcodeReader.Read(imagePath) は追加設定なしにWinFormsでコンパイルおよび実行されます。
ASP.NET Coreとコンソールをサポート。Web API、バックグラウンドサービス、コンソールツールは、同じパッケージを使用してバーコードの生成と読み取りの両方を実行できるようになりました。 これらのプロジェクトタイプごとに個別のツールチェーンや回避策を維持していた場合、それらは不要になります。
イベントハンドラの定型化不要。 Dispose()クリーンアップはすべて削除されます。 残るのはバーコードのロジックだけだ。
シンボロジーの仕様なし。 SymbologyTypeフラグの欠如による静かな失敗を引き起こしていた形式は、今後正しく検出されます。 自動検出機能により、設定不要で50種類以上のフォーマットに対応します。
すべてのプロジェクトタイプで同じサービスクラス。 単一のBarcodeWriter.CreateBarcode()を使用しており、これはWinForms、WPF、ASP.NET Core、およびソリューション内の他のすべてのプロジェクト間で共有できます。 フレームワーク固有の実装はありません。
バーコード機能のみを利用する場合、Infragistics Ultimateのサブスクリプションは不要です。プロジェクトでInfragistics Ultimateのサブスクリプションを契約した唯一の理由がバーコードサポートだった場合、またはそれが契約の重要な要因だった場合は、 IronBarcodeは単体パッケージとして提供されており、開発者1名あたり749ドルから利用できる永久ライセンスオプションが用意されています。
Infragisticsのバーコードの使用箇所をすべて特定できれば、移行作業自体は機械的に行えます。 最も関与している部分は、WPFサービスクラスの置き換えであり、それでもクラスを削除し、呼び出しをBarcodeReader.Read()に置き換えることに帰着します。 世代移行とは、プロパティ/メソッド名を1対1で変更することです。 得られるのは、必要なあらゆるプロジェクトタイプで動作する、一貫性のある単一のAPIです。
よくある質問
なぜInfragistics BarCodeからIronBarcodeに移行する必要があるのですか?
一般的な理由としては、ライセンスの簡素化(SDK + ランタイムキーの複雑さの排除)、スループット制限の排除、ネイティブPDFサポートの獲得、Docker/CI/CDデプロイの改善、プロダクションコード内のAPI定型文の削減などが挙げられます。
InfragisticsのAPIコールをIronBarcodeに置き換えるには?
インスタンスの作成とライセンスの定型文をIronBarCode.License.LicenseKey = "key "に置き換えてください。リーダー・コールをBarcodeReader.Read(path)に、ライター・コールをBarcodeWriter.CreateBarcode(data, encoding)に置き換えてください。静的メソッドはインスタンス管理を必要としません。
Infragistics BarCodeからIronBarcodeに移行する場合、コードはどのくらい変更されますか?
ほとんどのマイグレーションでは、コード行数は少なくなります。ライセンスの定型文、インスタンス・コンストラクタ、明示的なフォーマット設定が削除されます。コアとなる読み取り/書き込み操作は、より短いIronBarcodeに対応し、よりきれいな結果オブジェクトが得られます。
移行時にInfragistics BarCodeとIronBarcodeの両方をインストールしておく必要がありますか?
ほとんどのマイグレーションは、並列操作ではなく、直接置き換えです。一度に1つのサービスクラスを移行し、NuGet参照を置き換え、インスタンス化とAPI呼び出しパターンを更新してから次のクラスに移行します。
IronBarcodeのNuGetパッケージ名は何ですか?
パッケージは'IronBarcode'(大文字のBとC)です。Install-Package IronBarcode'または'dotnet add package IronBarcode'でインストールしてください。コード中のusingディレクティブは'using IronBarcode;'である。
IronBarcodeはInfragistics Barcodeと比較して、どのようにDockerデプロイを簡素化しますか?
IronBarcodeは外部SDKファイルやマウントされたライセンス設定のないNuGetパッケージです。Dockerでは、IRONBARCODE_LICENSE_KEY環境変数を設定すると、パッケージが起動時にライセンス検証を処理します。
Infragisticsから移行した後、IronBarcodeはすべてのバーコードフォーマットを自動的に検出しますか?
IronBarcodeは、サポートされているすべてのフォーマットのシンボルを自動検出します。明示的なBarcodeTypesの列挙は必要ありません。フォーマットが既に知られていて、パフォーマンスが重要な場合、BarcodeReaderOptionsは最適化として検索空間を制限することができます。
IronBarcodeは別のライブラリなしでPDFからバーコードを読み取ることができますか?
BarcodeReader.Read("document.pdf")は、PDFファイルをネイティブに処理します。結果には、見つかった各バーコードの PageNumber、Format、Value、および Confidence が含まれます。外部のPDFレンダリングステップは必要ありません。
IronBarcodeはどのようにパラレルバーコード処理を行うのですか?
IronBarcodeの静的メソッドはステートレスでスレッドセーフです。Parallel.ForEachをスレッドごとのインスタンス管理なしにファイルリスト上で直接使用します。BarcodeReaderOptions.MaxParallelThreadsは内部のスレッドバジェットを制御します。
Infragistics BarCodeから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、ストリームなどの複数の出力形式をサポートしています。

