フッターコンテンツにスキップ
ビデオ

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
SHELL

プロジェクトファイルが両方を参照している場合は、両方とも削除してください。 他のInfragisticsコンポーネントを使用している場合、バーコード固有のパッケージを削除してもInfragistics Ultimateライセンスには影響しません。

ステップ2: IronBarcodeをインストールする

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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
$vbLabelText   $csharpLabel

ステップ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"
$vbLabelText   $csharpLabel

コード移行の例

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)
$vbLabelText   $csharpLabel

(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)
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

(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")
$vbLabelText   $csharpLabel

サービスクラス全体—インスタンス管理、イベントワイヤリング、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
$vbLabelText   $csharpLabel

result.Valuee.Value に取って代わります。 result.Formate.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
$vbLabelText   $csharpLabel

追加のパッケージは不要で、フレームワーク固有のセットアップもありません。同じ 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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

(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
$vbLabelText   $csharpLabel
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)
$vbLabelText   $csharpLabel

廃棄パターンの削除

コードに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)()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

コンストラクタの注入なし、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)
$vbLabelText   $csharpLabel

ビットマップ画像の読み込みは不要です

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"))
$vbLabelText   $csharpLabel

バーコード関連の画像読み込みのためだけに存在していた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";
$vbLabelText   $csharpLabel

スレッドをブロックせずに、下流の呼び出し元に対して非同期インターフェースを維持したい場合は、次の手順に従ってください。

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
$vbLabelText   $csharpLabel

物件名の変更

インフラジスティクス 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" .
SHELL

各試合を順に進めてください。

  • BarcodeWriter.CreateBarcode()に置き換えます
  • new BarcodeReader() + BarcodeReader.Read()に置き換えます
  • SymbologyTypeフラグリスト:完全に削除します
  • バーコード入力に使用されたBitmapImageロード:直接パス/ストリーム/バイトに置き換えます
  • e.Valuee.Symbologyresult.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はその所有者の登録商標です。 このサイトは、Infragisticsとは関連付けられておらず、支持されたものでもスポンサー提供されたものでもありません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

なぜ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、ストリームなどの複数の出力形式をサポートしています。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね