從Neodynamic Barcode遷移到IronBarcode
本指南提供了從Neodynamic.SDK.BarcodeReader遷移到IronBarcode的完整路徑。 它涵蓋了移除兩個Neodynamic套件,將雙重授權配置替換為單一金鑰,翻譯生成和讀取API呼叫,以及獲得Neodynamic產品集無法實現的2D條碼讀取能力的過程。 本指南是為已有Neodynamic程式碼的開發者撰寫的,需要逐個文件的系統方法來完成遷移。
為什麼要從Neodynamic Barcode遷移
**2D讀取缺口:**Neodynamic Barcode Professional SDK生成QR碼、DataMatrix、PDF417和Aztec條碼。 上述格式都無法由附帶的條碼讀取器SDK讀取。 生成產品標籤、運輸容器或文件跟踪的QR碼的項目無法通過與生成程式一起購買的讀取器讀回這些相同的碼。 IronBarcode通過同一個程式庫和同一個授權來讀取和生成QR碼、DataMatrix、PDF417、Aztec以及其他所有支持的2D格式。
**雙產品開銷:**所有使用這兩個Neodynamic SDK的項目都有兩個using指令、兩個授權塊和兩個單獨的更新週期。 此開銷在每個開發者機器、每個CI管線和每個生產環境中重複。 將具有單獨維護需求的兩個套件合併為具有單一依賴和單一授權的單一依賴,是此次遷移機械性的結果。
**第三庫問題:**遇到2D讀取缺口的團隊選擇解決該問題而非遷移,通常會新增第三個庫——ZXing.Net是最常見的選擇——專門為了覆蓋QR碼讀取。 這一決定將一個限制交換為另一個複雜性:三個與條碼相關的依賴,每個都有自己的版本約束、自己的版本說明,並在.NET運行時或依賴框架升級時都有可能引發衝突。 IronBarcode取代了所有三個。
**定價複雜性:**Neodynamic Barcode Professional SDK的定價按開發者計費(Basic約為$352,Ultimate通過ComponentSource約為$705)。 條碼讀取器SDK單獨收費。需要同時生成和1D讀取的項目必須購買兩者,且總成本會隨著團隊規模在讀取器費用的基礎上增長。 需要2D讀取的項目仍然無法在任何價格範圍內滿足Neodynamic產品家族的要求。IronBarcodeLite涵蓋了生成和讀取—1D和2D—在單一授權下。 當前價格在IronBarcode授權頁面上。
基本問題
用於完整條碼工作流程的任何程式碼庫中使用這兩個Neodynamic SDK的核心問題是始終無法讀取QR碼:
// Before: Neodynamic Barcode讀取器 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:IronBarcodereads 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;
}
對參考2D條碼讀取的每個throw new NotSupportedException(...)佔位符在此遷移期間被移除並替換為正常運行的讀取呼叫。
IronBarcode與Neodynamic Barcode:功能比較
| 功能 | Neodynamic Barcode專業版 | Neodynamic Barcode讀取器 | IronBarcode |
|---|---|---|---|
| Code 128、EAN-13、UPC-A生成 | 是 | N/A | 是 |
| QR碼、DataMatrix、PDF417生成 | 是 | N/A | 是 |
| 1D 條碼讀取 | N/A | 是 | 是 |
| QR碼讀取 | N/A | 否 | 是 |
| DataMatrix 讀取 | N/A | 否 | 是 |
| PDF417 讀取 | N/A | 否 | 是 |
| 原生PDF條碼讀取 | 否 | 否 | 是 |
| 自動格式檢測 | N/A | 否 | 是 |
| 需要的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條碼
Neodynamic方法:
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 Sub不再需要System.Drawing.Imaging導入。 BarcodeInfo實例及其屬性分配合併為單一方法調用。 有關尺寸、註解和輸出格式選項,請參閱建立1D條碼指南。
生成QRCode
Neodynamic方法:
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介面。 此遷移引入的關鍵差異是相同的應用程式現在也可以讀取其生成的QR code,通過相同的IronBarcode程式庫和相同的授權。 關於2D條碼建立的全面說明,請參閱建立2D條碼指南。
讀取1D條碼
Neodynamic方法:
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 Function移除了System.Drawing導入。 IronBarcode直接接受文件路徑。 兩個API中的result.Value屬性名稱相同,因此處理返回值的下游程式碼不會更改。 關於多條碼圖像讀取和預處理選項,請參閱從圖像讀取條碼指南。
讀取QR碼(以前不可能)
Neodynamic方法:
// 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 Function每一個參考2D條碼讀取的throw new NotSupportedException(...)佔位符都成為標準讀取呼叫。 方法體從拋出的異常更改為有效的實現。 QR碼不需要特殊處理; IronBarcode自動識別格式。
從PDF文件讀取條碼(新功能)
Neodynamic方法:
// 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映射參考
| Neodynamic 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 | 第二個參數 |
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) | 文件路徑替代Bitmap |
result.Value | result.Value | 相同的屬性名稱 |
Symbology.DataMatrix | BarcodeEncoding.DataMatrix | 生成僅→生成和讀取 |
throw new NotSupportedException(...) 用於2D讀取 | BarcodeReader.Read(imagePath) | 替換為有效的實現 |
常見遷移問題及解決方案
問題1:兩個套件的移除順序
**問題:**只移除一個Neodynamic套件而留下另一個會引起編譯錯誤,因為這兩個SDK不共享型別,但某些源文件可能在同一個文件中導入兩個命名空間。
**解決方案:**在進行任何源程式碼更改之前移除兩個套件。 在移除後,搜尋所有using Neodynamic.SDK.BarcodeReader指令並一同移除它們:
dotnet remove package Neodynamic.SDK.Barcode
dotnet remove package Neodynamic.SDK.BarcodeReader
然後審核:
grep -r "Neodynamic.SDK" --include="*.cs" .
問題2:雙重授權配置清理
**問題:**兩個Neodynamic授權塊通常出現在不同的位置—一個在應用啟動類中,另一個在服務初始化程式中。 如果僅刪除一個塊,剩下的程式碼會引用一個不再存在的命名空間,並且無法編譯。
**解決方案:**搜尋所有四個Neodynamic授權屬性分配,並在新增IronBarcode鍵之前一同移除它們:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" .
用單一分配替換所有四行:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"問題3:從Catch塊中移除NotSupportedException
**問題:**某些使用Neodynamic閱讀器的程式碼庫專門新增catch (NotSupportedException)塊來處理2D條碼讀取的靜默失敗。 那些捕獲塊必須與拋出的程式碼一起移除; 否則,捕獲語句引用一個不再可能發生的程式碼路徑。
**解決方案:**在條碼相關文件中搜尋NotSupportedException並審查每個出現。 如果異常是為響應2D格式讀取嘗試而引發的,則移除拋出的內容和捕獲:
grep -r "NotSupportedException" --include="*.cs" .
用BarcodeReader.Read(imagePath)替換拋出的方法體,並從任何調用者中移除相應的捕獲條款。
Neodynamic Barcode遷移清單
遷移前
- 搜尋所有Neodynamic套件參考:
grep -r "Neodynamic.SDK" --include="*.csproj" . - 搜尋所有Neodynamic使用指令:
grep -r "using Neodynamic" --include="*.cs" . - 搜尋授權配置位置:
grep -r "LicenseOwner\|LicenseKey" --include="*.cs" . - 搜尋所有
grep -r "new BarcodeInfo\(\)" --include="*.cs" . - 搜尋所有Neodynamic讀取呼叫:
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()+ 屬性分配 +barcode.GetImage().Save(...) - 使用
QRCodeWriter模式 - 通過移除
BarcodeReader.Read(bitmap)呼叫 - 移除所有用於2D讀取的
BarcodeReader.Read(imagePath) - 從調用者中移除相應的
catch (NotSupportedException)塊 - 移除任何僅為了覆蓋Neodynamic 2D讀取缺口而新增的第三方庫
遷移後測試
- 驗證Code 128條碼生成是否產生與先前尺寸和DPI設置相匹配的輸出
- 驗證QR Code生成是否產生可掃描輸出
- 驗證1D條碼讀取返回的值是否與先前Neodynamic讀取器實現的相同
- 驗證QR Code讀取在以前引發
NotSupportedException的圖像上是否成功 - 驗證DataMatrix和PDF417讀取是否成功(如果應用程式輸入中出現這些格式)
- 測試PDF條碼讀取(如果應用程式處理PDF文件)
- 確認配置文件和環境變數中徹底移除了Neodynamic授權鍵參考
- 確認已完全移除任何第三方2D庫(如果存在),無剩餘的導入引用它
遷移到IronBarcode的主要優勢
**統一讀寫能力:**遷移後,IronBarcode能生成的每一個符號可以通過相同的程式庫讀回。 消除了Neodynamic的生成器和讀取器之間的不對稱性——QR碼、DataMatrix、PDF417和Aztec可以生成但不能讀取。 以前需要為2D讀取使用變通辦法或第三方庫的應用程式在不需要任何額外整合工作的情況下獲得該能力。
**單一授權管理:**一個NuGet包、一個授權鍵和一個配置塊取代了兩個單獨的產品訂閱。 更新、金鑰輪替和環境變數管理的複雜性降低了一半。 管理開銷的減少是持續性的,而不是一次性獲利。
**原生PDF條碼讀取:**IronBarcode直接從PDF文件中讀取條碼,返回頁碼元資料和條碼值一起。 處理包含嵌入條碼的運單、發票文件或醫療記錄的應用程式不再需要中間圖像提取步驟或額外PDF庫來支持條碼讀取。 查看完整的支持的條碼格式列表,了解涵蓋的符號集和輸入型別的完整集合。
**刪除System.Drawing依賴:**Neodynamic的SDK依賴於System.Drawing,這在Linux和Docker容器中需要額外的原生庫配置。 IronBarcode不具有System.Drawing的依賴,這意味著相同的程式碼庫在Windows、Linux和容器化雲環境中運行,而無需平台特定的配置更改。
**簡化的授權成本,提供完整功能:**需要兩個Neodynamic SDK加上第三個庫來進行2D讀取的項目,正在支付三個依賴來完成IronBarcode在單一授權下提供的 對於需要生成加上2D讀取的項目,遷移將技術影響和授權成本都整合到單一商業產品中。 當前定價資訊可在IronBarcode授權頁面上查閱。

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。