フッターコンテンツにスキップ
他のコンポーネントと比較する

Dynamsoft Barcode ReaderとIronBarcodeの比較:C#バーコードライブラリの比較

インフラジスティクス バーコード vs IronBarcode: WPF専用リーダー対プラットフォームに依存しないAPI

Infragisticsのバーコード読み取り機能はWPFで動作します。 そこに到達するには、BarcodeReader インスタンス、DecodeComplete イベントハンドラ、コールバックを非同期コードにブリッジする TaskCompletionSource<string> 、URIからの BitmapImage のロード、サポートしたい各 Symbology ファミリーのビット単位ORが必要です。それは Decode() への2つ目の引数として渡されます。 ファミリーを省くと—例えば、Symbology.QRCode をフラグから外す—画像内のQRバーコードは静かに何も返しません。 例外なし。 警告なし。 何も結果が表示されませんでした。

これはWPF側です。WinForms側では、Infragistics.Win.UltraWinBarcode パッケージは生成コントロールを含みますが、読み取りクラスは全く含まれていません。 WinFormsプロジェクトでバーコードを読み取る必要がある場合、Infragisticsバーコードパッケージには呼び出せる関数はありません。 これは、 ASP.NET Coreコントローラー、コンソールツール、Azure Functions、 Blazorサーバー コンポーネント、または Docker コンテナにも同様に当てはまります。 InfragisticsのバーコードサポートはUIフレームワークの境界内に存在します。WPFでは、生成とイベント駆動型の読み取りが実現されます。 WinFormsは生成機能のみを取得します。 それ以外のものには何も与えられない。

この比較では、その分割が実際には何を意味するのかを検証し、次にIronBarcodeがすべてのプロジェクトタイプで同じように動作する単一の静的APIを使用して同じ作業をどのように処理するかを見ていきます。

Infragisticsのバーコードサポートについて

Infragisticsは、最も実績のある.NET UIコンポーネントベンダーの1つです。 バーコード機能を提供するInfragistics UltimateSuite(サブスクリプション)には、WinForms、WPF、 ASP.NET、 Blazor、モバイル向けの数百ものコントロールが含まれています。Infragisticsのグリッド、チャート、スケジューラーを既に利用しているチームにとって、バーコードコントロールは論理的な追加機能です。なぜなら、既にサブスクリプション料金を支払っているからです。

しかし、バーコードのサポートは統一されたライブラリではありません。 これらは、それぞれ異なる機能を持ち、部分的にしか重複しない2つの独立したアセンブリである。

WinForms:ウルトラウィン・バーコード

Infragistics.Win.UltraWinBarcode パッケージは、UltraWinBarcode クラスを通じてWinFormsアプリケーションでのバーコード生成を提供します。 APIはシンプルです。

// InfragisticsWinFormsgeneration
using Infragistics.Win.UltraWinBarcode;

var barcode = new UltraWinBarcode();
barcode.Symbology = Symbology.Code128;
barcode.Data = "ITEM-12345";
barcode.SaveTo(outputPath);
// InfragisticsWinFormsgeneration
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

シンボロジーを設定し、データを割り当て、SaveTo() を呼び出します。 WinFormsにおける生成のみのシナリオでは、これは機能します。 Symbology 列挙型には、Code128、Code39、QR、EAN13、その他の一般的なフォーマットが含まれます。

このアセンブリには、リーダーが存在しない。 UltraBarcodeReader クラスは存在しません。 Scan() メソッドは存在しません。 WinFormsアプリケーションで Infragistics.Win.UltraWinBarcode パッケージのみを使用してバーコード画像を読もうとすると、呼び出すものは何もありません。

WPF: XamBarcodeとBarcodeReader

WPF側には、生成コントロール (XamBarcode) と別のリーダークラス (BarcodeReader イン Infragistics.WPF.BarcodeReader アセンブリから) の両方が含まれています。 このリーダーはイベント駆動型であり、WPFのスレッド処理およびイメージングモデルに基づいて設計されています。

WPFでバーコードを読むには、DecodeComplete イベントを配線し、画像をファイルパスではなく BitmapSource オブジェクトとしてロードし、コードが非同期の場合、コールバックパターンを待機可能なものに変換する必要があります。

ASP.NET Core、コンソール、Docker: なし

WPFやWinForms UIアセンブリなしで net8.0 を対象とするInfragisticsバーコードパッケージは存在しません。 ASP.NET Coreプロジェクト、コンソールツール、Azure Functions、 Blazor Server、およびLinux Dockerコンテナには、Infragisticsバーコードオプションがありません。 このライブラリはUIフレームワークと連携しています。

WPFの読み方パターン

Infragisticsを使用したWPFでバーコードを読み取ると、実際には次のような画面になります。

// InfragisticsWPFreading: event-driven, requiresWPFassemblies
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>();

    // Load asWPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? e.Value : "No barcode found");
}

public void Dispose()
{
    if (_reader != null)
    {
        _reader.DecodeComplete -= OnDecodeComplete;
        _reader = null;
    }
}
// InfragisticsWPFreading: event-driven, requiresWPFassemblies
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>();

    // Load asWPFBitmapSource — not a file path
    var bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));

    // Build the Symbology flags. The enum is [Flags];
    // EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    // and Code 39 is exposed as Code39Ext. Use Symbology.All
    // to search every supported family.
    var symbologies = Symbology.Code128 |
                      Symbology.Code39Ext |
                      Symbology.QRCode |
                      Symbology.EanUpc |
                      Symbology.Interleaved2Of5;

    // Symbology is the second argument to Decode/DecodeAsync,
    // not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies);

    return await _result.Task;
}

private void OnDecodeComplete(object sender, ReaderDecodeArgs e)
{
    _result?.TrySetResult(e.SymbolFound ? 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)()

    ' Load as WPF BitmapSource — not a file path
    Dim bitmap As New BitmapImage(New Uri(imagePath, UriKind.Absolute))

    ' Build the Symbology flags. The enum is [Flags];
    ' EAN-8/EAN-13/UPC-A/UPC-E share a single EanUpc flag,
    ' and Code 39 is exposed as Code39Ext. Use Symbology.All
    ' to search every supported family.
    Dim symbologies = Symbology.Code128 Or
                      Symbology.Code39Ext Or
                      Symbology.QRCode Or
                      Symbology.EanUpc Or
                      Symbology.Interleaved2Of5

    ' Symbology is the second argument to Decode/DecodeAsync,
    ' not a property on the reader. Result comes via callback.
    _reader.DecodeAsync(bitmap, symbologies)

    Return Await _result.Task
End Function

Private Sub OnDecodeComplete(sender As Object, e As ReaderDecodeArgs)
    _result?.TrySetResult(If(e.SymbolFound, 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

これは、1つのバーコードを読み取るために約35本のインフララインが必要になることを意味します。 実際に何が起こっているのかを数えてみましょう。

  1. BarcodeReader インスタンスが作成され、フィールドとして生存します。
  2. コンストラクタにイベントハンドラが組み込まれています。
  3. ReadBarcodeAsync へのすべての呼び出しは、共有フィールドに割り当てられる新しい TaskCompletionSource<string> を作成します — つまり、このサービスは書かれたままではスレッドセーフではありません。 同時呼び出しは _result を上書きします。
  4. 画像は、ファイルパスの文字列でもバイト配列でもストリームでもなく、BitmapImage として Uri からロードする必要があります。
  5. DecodeAsync() はイベントを非同期に発火します。 TaskCompletionSource はコールバックの世界と非同期/待機の世界を結びつける接着剤です。
  6. コールバックは e.SymbolFound が真であるときに e.Value を抽出します。
  7. Dispose() メソッドは、メモリリークを防ぐためにイベントハンドラをデタッチする必要があります。

この論理はどれもバーコードとは関係ありません。 これは、イベント駆動型設計に対応するために必要なインフラストラクチャです。 本番コードでは、_result.Task が完了しない場合に備えて、タイムアウト、キャンセレーショントークン、またはイベントが発火しないことを防ぐ何かを処理する必要があります。

WinFormsのギャップ

WinFormsの性能差は、一見したところよりもずっと顕著だ。 WinFormsアプリケーションを開発するチームは、Infragisticsのバーコードページにアクセスした際、両方のUIフレームワークでバーコードの生成と読み取りが対称的に行えることを期待することが多い。 彼らが見つけたのは、Infragistics.Win.UltraWinBarcode が全く読み取り機能を提供しないということです。

これは文書上の見落としではありません。 WinFormsのバーコードアセンブリは、生成制御として設計されました。 WinFormsアプリケーションでバーコードをスキャンする必要がある場合(例えば、ユーザーがアップロードした画像ファイルからバーコードを読み取ったり、カメラ映像からバーコードをデコードしたりする場合)、Infragisticsのバーコードツールでは実行できません。 そうなると、全く別のライブラリを導入する必要が生じ、Infragisticsを生成ツールとして使用する根拠が弱まることになる。

この非対称性により、混合フレームワークプロジェクトを運営するチームにカバレッジギャップが生じます。 WPFデスクトップクライアントとWinFormsデスクトップクライアントの両方を使用しているチームは、他のすべての場所でInfragisticsを使用している場合でも、WinFormsプロジェクトではInfragisticsを使用してバーコードを読み取ることはできません。

シンボル仕様:サイレント障害モード

WPFリーダーでの Decode() への Symbology フラグ引数は、失敗モードがサイレントであるため、その独自のセクションに値します。欠落しているフラグは、エラーなしで空の結果を返します。

リーダーにコールするときは、検索したいすべてのバーコードファミリーをOR演算子で結合します。 サポートされているファミリーは、QR、EAN/UPC (EanUpc)、Code 39 (Code39Ext)、Code 128、MaxiCode、Interleaved 2 of 5です — DataMatrixは列挙型には全く含まれていないので、WPFリーダーではデコードできません。 Symbology.All は列挙型のすべてをカバーします:

// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
// Build flags explicitly, or use Symbology.All to search every family
var symbologies = Symbology.Code128 |
                  Symbology.Code39Ext |
                  Symbology.QRCode |
                  Symbology.EanUpc |
                  Symbology.Interleaved2Of5;

_reader.DecodeAsync(bitmap, symbologies);
' Build flags explicitly, or use Symbology.All to search every family
Dim symbologies = Symbology.Code128 Or
                  Symbology.Code39Ext Or
                  Symbology.QRCode Or
                  Symbology.EanUpc Or
                  Symbology.Interleaved2Of5

_reader.DecodeAsync(bitmap, symbologies)
$vbLabelText   $csharpLabel

バーコード画像がQRコードを含んでいても、フラグに Symbology.QRCode が含まれていない場合、e.SymbolFound は偽となり、e.Value は空です。 デコードイベントは引き続き発生します。 例外は発生しません。 発信者は"バーコードが見つかりません"というメッセージを受け取りますが、画像が読み取れなかったのか、単に設定されていなかったのかは分かりません。

実際には、これは次のことを意味します。 開発者がテストしたフォーマットでは、初期設定は問題なく動作します。

  • 新しいバーコード形式がシステムに導入される(サプライヤーがラベルの種類を変更したり、新しい製品ラインで異なるシンボル体系が使用される場合など)。
  • リーダーは、そのファミリーの画像すべてに対してサイレントに失敗します。
  • このエラーは、"フォーマットが設定されていません"ではなく、"画像にバーコードがありません"というエラーと全く同じように見えます。

これをデバッグするチームは、フラグリストにファミリーが存在しないことに気付くまで、画像品質の確認に時間を費やします。特にDataMatrixは、追加するフラグがないため、WPFリーダーが全くサポートしていない尖ったケースです。

IronBarcodeはフォーマット引数を必要としません。 読取りごとにサポートされているすべてのフォーマットを自動検出します。 忘れるべき旗など存在しない。

プラットフォームマトリックス

プラットフォーム間の機能格差を理解することが、アーキテクチャ上の制約を理解する最も明確な方法である。

プラットフォーム インフラジスティクス・ジェネレーション インフラジスティクス読解 IronBarcode生成 IronBarcodeの読み取り
WPF XamBarcodeコントロール バーコードリーダー(イベント駆動型) はい はい
WinForms ウルトラウィンバーコード 利用不可 はい はい
.NET Core 利用不可 利用不可 はい はい
コンソール 利用不可 利用不可 はい はい
Blazorサーバー 利用不可 利用不可 はい はい
Docker / Linux 利用不可 利用不可 はい はい
Azure Functions 利用不可 利用不可 はい はい

この表は、純粋なWPFデスクトップアプリケーション以外のアプリケーションを実行しているチームが、Infragisticsのバーコードサポートでは不十分だと感じる理由を示しています。 プロジェクトがWinFormsとASP.NET Core 、あるいはWPFとバックグラウンドワーカーサービスにまたがる場合、Infragisticsのバーコードライブラリはコードベースの一部しかカバーしません。

IronBarcodeを理解する

IronBarcodeは、WinForms、WPF、またはUIフレームワークに依存しない、 .NET専用のバーコードライブラリです。 同じNuGetパッケージ、同じ名前空間、同じ API は、WinForms、WPF、 ASP.NET Core、コンソール、 Blazor Server、Docker、Azure Functions、AWS Lambda など、あらゆる.NETプロジェクトで動作します。

// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
// IronBarcode: identical code in WinForms, WPF, ASP.NET Core, console, Docker
// NuGet: dotnet add package BarCode
using IronBarCode;

// Read — 2 lines, any platform
var results = BarcodeReader.Read(imagePath);
return results.FirstOrDefault()?.Value ?? "No barcode found";
Imports IronBarCode

' Read — 2 lines, any platform
Dim results = BarcodeReader.Read(imagePath)
Return If(results.FirstOrDefault()?.Value, "No barcode found")
$vbLabelText   $csharpLabel

BarcodeReader.Read() は静的メソッドです。 管理するインスタンスもなく、配線するイベントもなく、コールバックパターンをブリッジする TaskCompletionSource もありません。 ファイルパス文字列、バイト配列、Stream、またはそのいずれかのバッチ処理用の配列を受け入れます。

生成用には、BarcodeWriter.CreateBarcode() はPNG、JPEG、SVGに保存することができるバーコードオブジェクトを返すか、バイナリデータとして取得することができます:

using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
using IronBarCode;

// Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
             .ResizeTo(400, 100)
             .SaveAsPng("barcode.png");

// Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .SaveAsPng("qr.png");
Imports IronBarCode

' Generate Code 128
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
             .ResizeTo(400, 100) _
             .SaveAsPng("barcode.png")

' Generate QR code
QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

ライセンスの初期化は、アプリケーションの起動時に一度だけ行われます。

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

並列表示:バッチ処理

バッチ処理は、Infragistics WPFリーダーにおける別の構造的な制約を露呈する。 リーダーが共有イベントハンドラを使用し、すべての呼び出しで _result フィールドが上書きされるため、上記のサービスクラスは複数の画像を同時に安全に処理することができません。 呼び出しは順番に行う必要があります。

// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
// Infragistics: must process sequentially — shared event handler and TaskCompletionSource
// field mean concurrent calls would overwrite _result before the previous decode completes
var service = new InfragisticsBarcodeService();
var results = new List<string>();

foreach (var file in imageFiles)
{
    // Each call must await before starting the next
    var value = await service.ReadBarcodeAsync(file);
    results.Add(value);
}
Imports System.Collections.Generic
Imports System.Threading.Tasks

' Infragistics: must process sequentially — shared event handler and TaskCompletionSource
' field mean concurrent calls would overwrite _result before the previous decode completes
Dim service As New InfragisticsBarcodeService()
Dim results As New List(Of String)()

For Each file In imageFiles
    ' Each call must await before starting the next
    Dim value As String = Await service.ReadBarcodeAsync(file)
    results.Add(value)
Next
$vbLabelText   $csharpLabel

これを同時に行うには、以前のデコードがまだ進行中の間に _result が上書きされないようにするためのロック、キュー、またはセマフォなど、大幅な追加インフラストラクチャが必要です。 これは、本来単純な入出力操作であるはずなのに、決して軽視できない並行処理の問題である。

IronBarcodeの静的 BarcodeReader.Read() はスレッドセーフです。 追加の同期処理なしに、複数のスレッドから同時に呼び出すことができます。 バッチワークロードの場合、Parallel.ForEach を直接利用できます:

using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
using IronBarCode;

// IronBarcode: parallel batch with thread-safe static API
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

Parallel.ForEach(imageFiles, file =>
{
    var barcodeResults = BarcodeReader.Read(file);
    foreach (var result in barcodeResults)
    {
        results.Add(result.Value);
    }
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks

' IronBarcode: parallel batch with thread-safe static API
Dim results As New ConcurrentBag(Of String)()

Parallel.ForEach(imageFiles, Sub(file)
    Dim barcodeResults = BarcodeReader.Read(file)
    For Each result In barcodeResults
        results.Add(result.Value)
    Next
End Sub)
$vbLabelText   $csharpLabel

また、1回の呼び出しで複数のファイルを渡し、BarcodeReaderOptions によって並行処理を設定できます:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read(imageFiles, options);
foreach (var result in results)
{
    Console.WriteLine($"{result.Value} ({result.Format})");
}
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read(imageFiles, options)
For Each result In results
    Console.WriteLine($"{result.Value} ({result.Format})")
Next
$vbLabelText   $csharpLabel

機能比較

フィーチャー インフラジスティクス バーコード IronBarcode
WinFormsでのバーコード読み取り 不可 はい
WPFバーコード読み取り はい(イベント駆動型) はい(同期)
.NET Coreのサポート 不可 はい
コンソール/ワーカーサービス 不可 はい
Docker / Linux 不可 はい
Azure Functions 不可 はい
Blazorサーバー 不可 はい
自動フォーマット検出 いいえ — SymbologyフラグをDecode()に渡す必要があります はい — フォーマットは自動検出されます
PDFバーコード読み取り 不可 はい、ネイティブで追加パッケージは不要です。
スレッドセーフな読書 いいえ(共有イベントハンドラ) はい(静的API)
イベント駆動型APIが必要 はい(WPF) なし
明示的な画像読み込み(BitmapSource) はい いいえ — ファイルパス、バイト、ストリームを受け入れます
同時読書 いいえ(TaskCompletionSource を介してブリッジする必要があります) はい
バッチ処理 逐次処理のみ(並行処理は安全ではありません) 組み込みの並列処理
サイレントフォーマットエラー はい(省略されたSymbologyファミリー) なし
Suiteの依存関係が必要です はい — Infragistics Ultimate サブスクリプション いいえ — 単体パッケージ
永久ライセンスオプション いいえ - 年間購読 はい
おおよそのライセンス費用 年間サブスクリプション(Infragistics Ultimate) 749ドルから(Lite、永久ライセンス)

APIマッピングリファレンス

WinForms(UltraWinBarcode) からIronBarcodeへ

InfragisticsWinForms- UltraWinBarcode IronBarcode
new UltraWinBarcode() BarcodeWriter.CreateBarcode(data, encoding)
barcode.Symbology = Symbology.Code128 BarcodeEncoding.Code128 ( CreateBarcode のパラメータ)
barcode.Data = "ITEM-12345" CreateBarcode() の第一引数
barcode.SaveTo(outputPath) .SaveAsPng(outputPath)
読み取りAPIは存在しません BarcodeReader.Read(imagePath)

WPF(BarcodeReader) からIronBarcodeへ

InfragisticsWPF— バーコードリーダー IronBarcode
new BarcodeReader() 静的クラス - インスタンスは不要
_reader.DecodeComplete += OnDecodeComplete 不要
_reader.DecodeAsync(bitmap, Symbology.X |Symbology.Y) 自動検出 - 設定不要
new BitmapImage(new Uri(path)) + _reader.Decode(bitmap, ...) BarcodeReader.Read(path)
e.Value ( ReaderDecodeArgs に) result.Value
e.Symbology ( ReaderDecodeArgs に) result.Format
TaskCompletionSource<string> 非同期ラッパー 同期処理 - ラッパー不要
Dispose() — イベントハンドラをデタッチします 不要 — インスタンスまたはイベントなし
WPFプロジェクトのみ あらゆる.NETプロジェクトタイプ

チームが切り替わるとき

いくつかの特定の状況が、一貫してチームをInfragisticsのバーコードサポートから遠ざけている。

WinFormsでは、読解力が必要です。これは最も一般的なシナリオです。 WinFormsアプリケーションは UltraWinBarcode でバーコードを正常に生成しますが、新しい要件が到着します: アップロードされた画像からバーコードをスキャンしたり、印刷前にラベルを検証したりする必要があります。 InfragisticsにはWinForms用の読み取りAPIはありません。 チームは別のライブラリを取り込むか、両方の機能を備えた生成コードを置き換えるかのどちらかを選択する。

新しいASP.NET Coreエンドポイント。Infragisticsのバーコード生成機能を搭載したデスクトップアプリケーションに、専用のWeb APIが追加されました。 エンドポイントは、画像のアップロードを受け付けてバーコード値を返すか、必要に応じてバーコード画像を生成する必要があります。 ASP.NET CoreプロジェクトでInfragisticsのバーコードパッケージを使用する場合、どちらも不可能です。 IronBarcodeは dotnet add package BarCode でインストールされ、コンソールメソッドと同じ方法でコントローラーアクションで動作します。

Dockerデプロイメント。WPFアプリケーションがコンテナ化されるか、そのバーコードロジックがマイクロサービスに抽出されます。WPFアセンブリはLinux Dockerコンテナ内では実行されません。 InfragisticsWPFBarcodeReader が彼らについていきます。 IronBarcodeはLinux x64をネイティブターゲットとしています。

バッチ処理のパフォーマンス。ワークフローは、数百または数千のバーコード画像を処理します。 イベント駆動型のInfragisticsリーダーは、それらを順次処理します。 IronBarcodeの静的リーダーはスレッドセーフで、 Parallel.ForEach または組み込みの MaxParallelThreads オプションを使用することができ、同時実行インフラストラクチャは不要です。

本番での静かなフォーマットの失敗。 チームは、特定のファミリーのバーコードが数週間にわたり静かに失敗していたことを発見しました。これは、Symbology フラグが Decode() に渡されるときにそのファミリーが含まれていなかったためです。 自動検出に切り替えることで、この故障モードは完全に解消されます。

Infragisticsのサブスクリプション範囲を縮小する。一部のチームは、バーコード制御機能が含まれているという理由だけで、Infragistics Ultimateのサブスクリプション料金を支払っている。 バーコードが必要なことだけが契約の理由である場合、はるかに低コストで利用できる専用のバーコードライブラリを検討する価値がある。

結論

Infragisticsのバーコードサポートにおける中心的な問題は、機能面ではなく、アーキテクチャ面にある。WPFBarcodeReader はバーコードを読み取ります。WinFormsUltraWinBarcode はそれらを生成します。 各コンポーネントは、それぞれ設計された狭い範囲内においてのみ機能します。 問題は、これら2つのコンテキストでは、ほとんど for .NETチームが実際に必要としているものを網羅できないという点です。

現代 for .NETアプリケーションにおけるバーコード機能は、単一のUIフレームワーク内に存在することは稀である。 これはWinFormsクライアントとWeb APIに登場します。 これはDockerコンテナとデスクトップ上で動作します。ASP.NETエンドポイントにASP.NETされた画像をスキャンし、コンソールツールからラベルを印刷する必要があります。 これらの方法はどれもInfragisticsのバーコードパッケージでは機能せず、WPFリーダーのイベント駆動型パターンと必須シンボルフラグは、機能する唯一の状況においても、著しい複雑さを増す。

IronBarcodeは、バーコードの読み取りと生成という同じ問題を、あらゆる.NETプロジェクトタイプで同じようにコンパイルおよび実行される静的APIによって解決します。 WPFサービスクラスで書いた BarcodeReader.Read() コールは、ASP.NET Coreコントローラーで書いたものと同じであり、Linux Dockerコンテナで書いたものとも同じです。 イベントもフラグも TaskCompletionSource もありません。 バーコードのロジックは35行ではなく2行で構成されており、その2行はどこでも機能します。

よくある質問

Infragistics BarCodeとは?

Infragistics BarCode は、C# アプリケーションでバーコードを生成および読み取るための .NET バーコードライブラリです。開発者が .NET プロジェクトのバーコードソリューションを選択する際に評価するいくつかの選択肢の 1 つです。

Infragistics BarCodeとIronBarcodeの主な違いは何ですか?

IronBarcodeはインスタンス管理が不要な静的なステートレスAPIを使用していますが、Infragistics BarCodeは通常、使用前にインスタンスの作成と設定が必要です。IronBarcodeはまた、ネイティブPDFサポート、自動フォーマット検出、およびすべての環境でのシングルキーライセンスを提供します。

IronBarcodeはInfragistics Barcodeよりもライセンスが簡単ですか?

IronBarcodeは単一のライセンスキーで開発環境と本番環境の両方をカバーします。これは、SDKキーとランタイムキーを分離するライセンスシステムと比較して、CI/CDパイプラインとDocker構成を簡素化します。

IronBarcodeはInfragistics Barcodeがサポートしているすべてのバーコードフォーマットをサポートしていますか?

IronBarcodeはQRコード、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1など30以上のバーコードシンボロジーをサポートしています。フォーマットの自動検出は、明示的なフォーマットの列挙が不要であることを意味します。

IronBarcodeはネイティブPDFバーコード読み取りをサポートしていますか?

IronBarcodeは、別のPDFレンダリングライブラリを必要とせず、BarCodeReader.Read("document.pdf")を使用してPDFファイルから直接バーコードを読み取ります。ページごとの結果には、ページ番号、バーコードフォーマット、値、信頼度スコアが含まれます。

IronBarcodeはInfragistics BarCodeと比べてどのようにバッチ処理を行いますか?

IronBarcodeの静的メソッドはステートレスで当然スレッドセーフであり、スレッドごとのインスタンス管理なしにParallel.ForEachを直接使用できます。どの価格帯でもスループットの上限はありません。

IronBarcode はど for .NETバージョンをサポートしていますか?

IronBarcodeは.NET Framework 4.6.2+、.NET Core 3.1、.NET 5、6、7、8、9を単一のNuGetパッケージでサポートしています。プラットフォーム・ターゲットには、Windows x64/x86、Linux x64、macOS x64/ARMが含まれます。

.NETプロジェクトにIronBarcodeをインストールするには?

NuGet経由でIronBarcodeをインストールする:パッケージマネージャーコンソールで'Install-Package IronBarCode'を実行するか、CLIで'dotnet add package IronBarCode'を実行する。追加のSDKインストーラーやランタイムファイルは必要ありません。

Infragisticsとは異なり、購入前にIronBarcodeを評価することはできますか?

IronBarcodeのトライアルモードでは、完全なデコードされたバーコード値を返します。購入を決定する前に、ご自身のドキュメントで読み取り精度をベンチマークすることができます。

Infragistics BarCodeとIronBarcodeの価格の違いは何ですか?

IronBarcodeは、開発および量産をカバーする永続的なシングルデベロッパーライセンスで749ドルからご利用いただけます。価格の詳細とボリュームオプションはIronBarcodeのライセンスページでご覧いただけます。別途ランタイムライセンスは必要ありません。

Infragistics BarCodeからIronBarcodeへの移行は簡単ですか?

Infragistics BarCodeからIronBarcodeへの移行は、主にインスタンスベースのAPIコールをIronBarcodeの静的メソッドに置き換え、ライセンスの定型文を削除し、結果のプロパティ名を更新します。ほとんどの移行はコードを追加するのではなく、コードを削減します。

IronBarcodeはロゴ入りQRコードを生成できますか?

はい。QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")は、設定可能なエラー修正機能付きで、ブランド画像をネイティブにQRコードに埋め込みます。カラーQRコードもChangeBarCodeColor()でサポートされています。

Curtis Chau
テクニカルライター

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

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

アイアンサポートチーム

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