Neodynamic Barcode から IronBarcode への移行
このガイドは、Neodynamic.SDK.BarcodeReaderからIronBarcodeへの完全な移行パスを提供します。 これには、Neodynamicパッケージの削除、デュアルライセンス構成のシングルキーへの置き換え、生成および読み取りAPI呼び出しの翻訳、そしてNeodynamic製品セットでは不可能だった2Dバーコード読み取り機能の取得プロセスが含まれます。 このガイドは、既存のNeodynamicコードを所有しており、移行を完了するために体系的なファイルごとのアプローチを必要とする開発者向けに書かれています。
Neodynamic Barcodeから移行する理由
2D読み取りギャップ: ネオダイナミック バーコードProfessional SDKは、QRコード、DataMatrix、PDF417、およびAztecバーコードを生成します。 これらのフォーマットはいずれも、付属のバーコードリーダーSDKでは読み取ることができません。 製品ラベル、輸送コンテナ、または文書追跡用のQRコードを生成するプロジェクトは、生成器と同時に購入したリーダーで、生成した同じコードを読み取ることはできません。 IronBarcodeは、同じライブラリとライセンスを使用して、QRコード、DataMatrix、PDF417、Aztec、およびその他サポートされているすべての2Dフォーマットの読み取りと生成を行います。
二重製品のオーバーヘッド: ネオダイナミックSDKを使用するプロジェクトごとに、2つのusingディレクティブ、2つのライセンスブロック、2つの別々の更新サイクルがあります。 このオーバーヘッドは、すべての開発者マシン、すべてのCIパイプライン、すべての本番環境で繰り返されます。 メンテナンス要件が異なる2つのパッケージを、単一のライセンスを持つ単一の依存関係に統合することが、この移行の機械的な結果である。
サードライブラリの問題: 2D読み取りのギャップに直面し、移行ではなく回避策を選択したチームは、通常、QRコードの読み取りを具体的にカバーするために、サードライブラリ(最も一般的な選択肢はZXing .NET)を追加しました。 この決定は、一つの制約と引き換えに、別の複雑さを生み出す。それは、バーコード関連の依存関係が3つ増えることであり、それぞれに独自のバージョン制約、リリースノート、そして.NETランタイムや依存フレームワークが更新された際に発生する可能性のある競合の可能性が存在する。 IronBarcodeはこれら3つすべてを置き換えます。
価格の複雑性: ネオダイナミック バーコードProfessional SDKは開発者ごとに価格が設定されています(Basicは約$352、Ultimateは約$705、ComponentSource経由)。 Barcode Reader SDKは別途コストがかかります。生成と1D読み取りの両方が必要なプロジェクトは両方を購入しなければならず、Reader料金の上にチームサイズに応じたコストが追加されます。 2D読み取りが必要なプロジェクトは、Neodynamic製品ファミリー内でその要件を満たすことができません。 IronBarcode Liteは、1Dおよび2Dの生成と読み取りを単一のライセンスでカバーします。 現在の価格はIronBarcodeライセンスページにあります。
基本的な問題
Neodynamic SDKを両方使用して完全なバーコードワークフローを実現したコードベースにおける根本的な問題は、QRコードの読み取りがそもそも不可能だったことである。
// Before: ネオダイナミックバーコードリーダー does not support QR codes
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string ReadQrCode(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
// Results are always null or empty for 2D barcodes
if (results == null || !results.Any())
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}
return results.First().Value;
}
IronBarcodeへの移行後、同じ操作はフォーマット固有の処理のない標準的な読み取り呼び出しになります。
// After: IronBarcode reads QR codes with the same call used for all formats
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function2Dバーコード読み取りを参照するコードベースのすべてのthrow new NotSupportedException(...)プレースホルダは、この移行中に削除され、動作する読み取り呼び出しに置き換えられます。
IronBarcodeとNeodynamic Barcode:機能比較
| フィーチャー | ネオダイナミック バーコードProfessional | ネオダイナミックバーコードリーダー | IronBarcode |
|---|---|---|---|
| コード128、EAN-13、UPC-A世代 | はい | 該当なし | はい |
| QRコード、データマトリックス、PDF417生成 | はい | 該当なし | はい |
| 1次元バーコード読み取り | 該当なし | はい | はい |
| QRコードの読み取り | 該当なし | いいえ | はい |
| データマトリックスの読み取り | 該当なし | いいえ | はい |
| PDF417の閲覧 | 該当なし | いいえ | はい |
| ネイティブPDFバーコード読み取り | なし | なし | はい |
| 自動フォーマット検出 | 該当なし | なし | はい |
| 必要なNuGetパッケージ | 1 | 1 | 1(両方をカバー) |
| ライセンスキーが必要です | 1 | 1(別添) | 1(すべてを網羅) |
| System.Drawing の依存関係 | はい | はい | なし |
| Linux / Docker のサポート | 制限的 | 制限的 | はい |
| .NET 8 / .NET 9 のサポート | はい | 制限的 | はい |
| 非同期バッチ読み取り | なし | なし | はい |
クイックスタート:Neodynamic BarcodeからIronBarcodeへの移行
ステップ1:両方のNeodynamicパッケージを削除する
両方の荷物を取り除かなければなりません。 削除順序に影響を与える共通の依存関係はありません。
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
続行する前に、.csprojファイルから両方のエントリが削除されていることを確認してください。
ステップ2: IronBarcodeを追加する
dotnet add package IronBarcode
ステップ3:デュアルライセンス構成の置き換え
両方のNeodynamicライセンスブロックを削除し、代わりに単一のIronBarcodeキー割り当てに置き換えてください。 この割り当ては、アプリケーションのスタートアップ時に一度行われます—Startup.cs、またはアプリケーションのコンポジションルートで:
// Before: two license blocks, two products
using Neodynamic.SDK.Barcode;
using Neodynamic.SDK.BarcodeReader;
BarcodeProfessional.LicenseOwner = "Your Company";
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company";
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY";Imports Neodynamic.SDK.Barcode
Imports Neodynamic.SDK.BarcodeReader
BarcodeProfessional.LicenseOwner = "Your Company"
BarcodeProfessional.LicenseKey = "GEN-LICENSE-KEY"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner = "Your Company"
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey = "READ-LICENSE-KEY"// After: one key covers generation and reading across all formats
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
' After: one key covers generation and reading across all formats
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"Neodynamicのライセンスキーを保持している設定ファイル、環境変数、またはシークレットストアは、移行が検証された後に廃止できます。
コード移行の例
Code 128バーコードの生成
新力学的アプローチ:
using Neodynamic.SDK.Barcode;
using System.Drawing.Imaging;
public void GenerateCode128(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.Code128;
barcode.BarcodeUnit = BarcodeUnit.Pixel;
System.Drawing.Image image = barcode.GetBarcodeImage();
image.Save(outputPath, ImageFormat.Png);
}Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateCode128(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.Code128
barcode.BarcodeUnit = BarcodeUnit.Pixel
Dim image As System.Drawing.Image = barcode.GetBarcodeImage()
image.Save(outputPath, ImageFormat.Png)
End SubIronBarcodeのアプローチ:
using IronBarCode;
public void GenerateCode128(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateCode128(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.SaveAsPng(outputPath)
End SubSystem.Drawing.Imagingインポートはもう必要ありません。 BarcodeInfoインスタンスとそのプロパティの割り当ては、単一のメソッド呼び出しに統合されます。 サイズ設定、注釈、出力フォーマットのオプションについては、 "1Dバーコードの作成ガイド"を参照してください。
QRコードの生成
新力学的アプローチ:
using Neodynamic.SDK.Barcode;
public void GenerateQrCode(string data, string outputPath)
{
var barcode = new BarcodeProfessional();
barcode.Code = data;
barcode.Symbology = Symbology.QRCode;
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H;
barcode.GetBarcodeImage().Save(outputPath, System.Drawing.Imaging.ImageFormat.Png);
}Imports Neodynamic.SDK.Barcode
Imports System.Drawing.Imaging
Public Sub GenerateQrCode(data As String, outputPath As String)
Dim barcode As New BarcodeProfessional()
barcode.Code = data
barcode.Symbology = Symbology.QRCode
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H
barcode.GetBarcodeImage().Save(outputPath, ImageFormat.Png)
End SubIronBarcodeのアプローチ:
using IronBarCode;
public void GenerateQrCode(string data, string outputPath)
{
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
.SaveAsPng(outputPath);
}Imports IronBarCode
Public Sub GenerateQrCode(data As String, outputPath As String)
QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest) _
.SaveAsPng(outputPath)
End Sub世代変換はAPIの表面のみを変更します。 今回の移行によってもたらされる決定的な違いは、同じアプリケーションが、同じIronBarcodeライブラリとライセンスを通じて、自身が生成したQRコードを読み取ることができるようになった点です。 2Dバーコードの作成に関する詳細な説明については、 "2Dバーコードの作成ガイド"を参照してください。
1次元バーコードの読み取り
新力学的アプローチ:
using Neodynamic.SDK.BarcodeReader;
using System.Drawing;
public string[] Read1DBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
var reader = new BarcodeReader();
var results = reader.Read(bitmap);
return results?.Select(r => r.Value).ToArray() ?? Array.Empty<string>();
}Imports Neodynamic.SDK.BarcodeReader
Imports System.Drawing
Public Function Read1DBarcodes(imagePath As String) As String()
Using bitmap As New Bitmap(imagePath)
Dim reader As New BarcodeReader()
Dim results = reader.Read(bitmap)
Return If(results?.Select(Function(r) r.Value).ToArray(), Array.Empty(Of String)())
End Using
End FunctionIronBarcodeのアプローチ:
using IronBarCode;
public string[] Read1DBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value).ToArray();
}Imports IronBarCode
Public Function Read1DBarcodes(imagePath As String) As String()
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value).ToArray()
End FunctionSystem.Drawingインポートは削除されます。 IronBarcodeはファイルパスを直接受け付けます。 両方のAPIでresult.Valueプロパティ名が同じであるため、返された値を処理する下流のコードは変更されません。 複数のバーコード画像の読み取りと前処理オプションについては、 "画像からのバーコード読み取りガイド"を参照してください。
QRコードの読み取り(これまで不可能だったこと)
新力学的アプローチ:
// This method could not be implemented with Neodynamic Barcode Reader
public string ReadQrCode(string imagePath)
{
throw new NotSupportedException(
"Neodynamic Barcode Reader does not support QR codes");
}' This method could not be implemented with Neodynamic Barcode Reader
Public Function ReadQrCode(imagePath As String) As String
Throw New NotSupportedException("Neodynamic Barcode Reader does not support QR codes")
End FunctionIronBarcodeのアプローチ:
using IronBarCode;
public string ReadQrCode(string imagePath)
{
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}Imports IronBarCode
Public Function ReadQrCode(imagePath As String) As String
Dim result = BarcodeReader.Read(imagePath).FirstOrDefault()
Return If(result?.Value, Nothing)
End Function2Dバーコード読み取りを参照するすべてのthrow new NotSupportedException(...)プレースホルダは、標準的な読み取り呼び出しになります。 メソッド本体は、スローされる例外から、動作する実装へと変更されます。 QRコードには特別な取り扱いは必要ありません。 IronBarcodeはフォーマットを自動的に識別します。
PDF文書からのバーコード読み取り(新機能)
新力学的アプローチ:
// Neodynamic Reader cannot read barcodes from PDF files directly
// An image extraction step using a separate library was required before reading
// なし direct equivalent exists
IronBarcodeのアプローチ:
using IronBarCode;
public void ReadBarcodesFromPdf(string pdfPath)
{
var results = BarcodeReader.Read(pdfPath);
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}");
}
}Imports IronBarCode
Public Sub ReadBarcodesFromPdf(pdfPath As String)
Dim results = BarcodeReader.Read(pdfPath)
For Each result In results
Console.WriteLine($"Value: {result.Value} | Format: {result.Format} | Page: {result.PageNumber}")
Next
End SubIronBarcodeは、PDF文書の全ページからバーコードを直接読み取ります。 結果として、各バーコードが検出されたページ番号が返されます。 この機能には、追加のライブラリや中間的な画像抽出手順は一切必要ありません。
Neodynamic Barcode API からIronBarcodeへのマッピングリファレンス
| ネオダイナミックAPI | IronBarcode相当品 | ノート |
|---|---|---|
BarcodeInfo.LicenseOwner = "..." | IronBarCode.License.LicenseKey = "key" | 単一のキーに統合 |
BarcodeInfo.LicenseKey = "..." | (part of single key above) | 所有者欄は別途ありません |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseOwner | (removed) | 不要 |
Neodynamic.SDK.BarcodeReader.BarcodeReader.LicenseKey | (removed) | 不要 |
new BarcodeInfo() | BarcodeWriter.CreateBarcode(data, encoding) | 静的、インスタンスなし |
barcode.Value = data | 最初のパラメータCreateBarcode | 建設段階で合格 |
barcode.Symbology = Symbology.Code128 | BarcodeEncoding.Code128 | 2番目のパラメータ |
barcode.Symbology = Symbology.QRCode | BarcodeEncoding.QRCode | 往復全行程に対応 |
barcode.QRCodeECL = QRCodeErrorCorrectionLevel.H | QRCodeWriter.QrErrorCorrectionLevel.Highest | 異なるクラスのエントリーポイント |
barcode.GetImage().Save(path, ImageFormat.Png) | .SaveAsPng(path) | 流暢、ImageFormat 列挙なし |
BarcodeReader.Read(bitmap) | BarcodeReader.Read(imagePath) | ファイルパスがビットマップを置き換えます |
result.Value | result.Value | 同じプロパティ名 |
Symbology.DataMatrix | BarcodeEncoding.DataMatrix | 世代のみ → 世代と読書 |
2D読み取り用throw new NotSupportedException(...) | BarcodeReader.Read(imagePath) | 動作する実装に置き換える |
一般的な移行の問題と解決策
問題1:2つの荷物の撤去命令
**問題点:**開発者が一方のNeodynamicパッケージのみを削除し、もう一方を残した場合、2つのSDKは型を共有していないにもかかわらず、一部のソースファイルでは両方の名前空間が同じファイル内でインポートされている可能性があるため、コンパイルエラーが発生します。
**解決策:**ソースコードを変更する前に、両方のパッケージを削除してください。 両方を削除した後、すべてのusing Neodynamic.SDK.BarcodeReaderディレクティブを検索し、一緒に削除します:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
次に、以下の方法で監査を行います。
grep -r "Neodynamic.SDK" --include="*.cs" .
問題2:デュアルライセンス構成のクリーンアップ
**問題:**2つのNeodynamicライセンスブロックが異なる場所に表示されることが多い — 1つはアプリケーション起動クラス、もう1つはサービスイニシャライザ内。 ブロックを1つだけ削除した場合、残りのコードは既に存在しない名前空間を参照するため、コンパイルエラーが発生します。
解決策: Neodynamicライセンスのプロパティ割り当て4つすべてを検索し、 IronBarcodeキーを追加する前にそれらをまとめて削除します。
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
4行すべてを1つの代入文に置き換えてください。
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"問題3:CatchブロックからのNotSupportedExceptionの削除
問題: ネオダイナミックリーダーを使用した一部のコードベースは、2Dバーコード読み取りのサイレントフェイルに対処するためにcatch (NotSupportedException)ブロックを追加しました。 それらのcatchブロックは、例外をスローするコードとともに削除する必要があります。 そうでない場合、catch節は発生することのないコードパスを参照しています。
解決策: バーコード関連のファイルでNotSupportedExceptionを検索し、各出現を確認します。 2Dフォーマットの読み取り試行に応答して例外が発生した場合は、throwとcatchの両方を削除してください。
grep -r "NotSupportedException" --include="*.cs" .
例外を投げるメソッドの本体をBarcodeReader.Read(imagePath)に置き換え、コーラーから対応するキャッチ節を削除します。
Neodynamicバーコード移行チェックリスト
移行前
- すべてのネオダイナミックパッケージ参照を検索:
grep -r "Neodynamic.SDK" --include="*.csproj" . - すべてのネオダイナミック使用ディレクティブを検索:
grep -r "using Neodynamic" --include="*.cs" . - ライセンス構成の場所を検索します:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - すべての
grep -r "new BarcodeInfo\(\)" --include="*.cs" . - すべてのネオダイナミック読み取り呼び出しを検索:
grep -r "BarcodeReader.Read" --include="*.cs" . - バーコードパスでのすべての
grep -r "NotSupportedException" --include="*.cs" . - 2D読み取りギャップを埋めるために特別に追加されたサードパーティライブラリ(ZXing .NETなど)を特定します。これは移行後に削除できます。
- すべての Neodynamic ライセンス キーを記録し、検証後にシークレット ストアから削除できるようにします。
コード更新タスク
dotnet remove package Neodynamic.SDK.Barcodeを実行dotnet remove package Neodynamic.SDK.BarcodeReaderを実行dotnet add package IronBarcodeを実行- すべての
using Neodynamic.SDK.BarcodeReaderディレクティブを削除 - バーコード操作を行うすべてのファイルに
using IronBarCodeを追加 - 両方の Neodynamic ライセンス構成ブロックを削除します。
- アプリケーションのスタートアップ時に一度
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"を追加 new BarcodeInfo()+ プロパティの割り当て +BarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path)に置き換えQRCodeWriter.CreateQrCode()を使用して適切に置き換えるBarcodeReader.Read(imagePath)に渡すことにより置き換える- 2D読み取り用のすべての
BarcodeReader.Read(imagePath)に置き換える - コーラーから対応する
catch (NotSupportedException)ブロックを削除 - Neodynamic 2D の読み取りギャップを埋めるためだけに追加されたサードパーティライブラリをすべて削除します。
移行後のテスト
コード128バーコード生成の結果が、以前の寸法とDPI設定に一致することを確認する
- QRコード生成がスキャン可能な出力を生成することを確認する
- 1Dバーコード読み取りが、以前のNeodynamic Reader実装と同じ値を返すことを検証します。
- 以前に
NotSupportedExceptionを投げた画像でQRコードの読み取りが成功することを確認 アプリケーションの入力にDataMatrixおよびPDF417形式が含まれている場合、これらの形式の読み取りが成功することを確認します。 アプリケーションがPDFドキュメントを処理する場合、PDFバーコードの読み取りをテストします。 - 設定ファイルおよび環境変数から、Neodynamicのライセンスキーに関するすべての参照が削除されていることを確認してください。 サードパーティ製の2Dライブラリ(存在する場合)が完全に削除され、残りのインポートで参照されていないことを確認してください。
IronBarcodeへの移行の主なメリット
**統合された読み書き機能:**移行後、 IronBarcodeが生成できるすべてのシンボルは、同じライブラリを通して読み戻すことができます。 Neodynamicのジェネレーターとリーダー間の非対称性(QRコード、DataMatrix、PDF417、Aztecは生成できるが消費できない)は解消される。 これまで2D読み取りのために回避策やサードパーティライブラリを必要としていたアプリケーションは、追加の統合作業なしにその機能を利用できるようになります。
単一ライセンス管理: 1つのNuGetパッケージ、1つのライセンスキー、および1つの構成ブロックで、2つの別々の製品サブスクリプションを置き換えることができます。 更新、キーローテーション、環境変数管理の複雑さが半分になる。 管理費の削減は、一時的な利益ではなく、継続的な効果をもたらす。
ネイティブPDFバーコード読み取り: IronBarcodeはPDF文書からバーコードを直接読み取り、バーコード値とともにページ番号のメタデータを返します。 出荷明細書、請求書、または医療記録など、バーコードが埋め込まれた書類を処理するアプリケーションでは、中間的な画像抽出ステップや、バーコード読み取りをサポートするための追加のPDFライブラリは不要になりました。 サポートされているバーコード形式の完全なリストを参照して、対応するシンボル体系と入力タイプの全セットを確認してください。
System.Drawing依存の排除: ネオダイナミックのSDKはSystem.Drawingに依存しており、LinuxおよびDockerコンテナでの追加のネイティブライブラリ設定が必要です。 IronBarcodeにはSystem.Drawingの依存がないため、同じコードベースがWindows、Linux、およびクラウド環境のコンテナ内でプラットフォーム固有の設定変更なしに実行されます。
完全な機能を実現するための簡素化されたライセンス費用: Neodynamic SDKと2D読み取り用の3つ目のライブラリの両方を必要とするプロジェクトでは、 IronBarcodeが単一のライセンスで提供する機能を実現するために、3つの依存関係に対して費用を支払っていました。 生成機能と2D読み取り機能の両方を必要とするプロジェクトの場合、この移行によって技術的なフットプリントとライセンス費用が単一の商用製品に統合されます。 最新の価格情報は、IronBarcodeのライセンスページでご確認いただけます。

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