Accusoft BarcodeXpress 與 IronBarcode:C# 條碼庫比較
當您透過試用版評估條碼庫時,您希望在決定購買之前,先看看它是否真的能在您的影像上正常運作。 Accusoft BarcodeXpress 不提供此選項。 在評估模式下,解碼後的條碼值會被部分遮蔽-"1234567890"會顯示為"1234...XXX"。 您可以驗證庫是否找到了條碼,但您無法驗證它是否正確讀取了條碼。 這是在驗證之前就做出承諾的情況,而且在你還沒考慮價格之前,就已經造成了一個很大的摩擦點。
了解 Accusoft BarcodeXpress
Accusoft 數十年來一直致力於為企業環境開發文件影像軟體。 BarcodeXpress 是 PrizmDoc、ImageGear 和 Accusoft Imaging 等產品系列的一部分。 已經在使用這些產品的團隊會遇到熟悉的 API 接口,並且可以利用現有的 Accusoft 帳戶關係。但對於獨立使用條碼的團隊來說,這種優勢就沒那麼明顯了。
核心 SDK 以 NuGet 套件的形式提供,適用於 .NET Core。 此 API 是基於實例的-您建立一個 BarcodeXpress 對象,配置 Licensing 屬性,然後使用子 reader 和 writer 物件進行實際操作。 雙密鑰許可系統使 BarcodeXpress 與大多數替代方案區分開來。
BarcodeXpress 的主要架構特性:
-基於實例的 API:每個操作都需要一個 BarcodeXpress 實例; 靜態便利方法並非設計的一部分
-雙層許可: SDK 許可(SolutionName + SolutionKey)和運行時許可(UnlockRuntime)是獨立的系統,需要分別購買。
-評估模式混淆:在評估模式下,解碼值會被故意降低——例如,"1234567890"會顯示為"1234...XXX"——這使得購買前的準確性測試無法進行。
-手動格式規格:讀取器需要明確的 BarcodeTypes 配置來列舉要搜尋的符號系統; 未指定的格式無法偵測到。
-標準版每分鐘處理速度上限為 40 頁:標準版將處理速度限制為每分鐘 40 頁,大多數團隊在部署後而非部署前會遇到此限制。
-不支援原生 PDF: PDF 檔案必須先使用單獨的庫預先渲染成影像,閱讀器才能處理它們。
-至少需要五個運行時許可證:即使是單一伺服器部署也需要購買至少五個運行時許可證。
雙鑰匙系統詳解
BarcodeXpress 將許可證分為兩個概念上獨立的層次:
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
// BarcodeXpress: two separate license keys required
using Accusoft.BarcodeXpressSdk;
var barcodeXpress = new BarcodeXpress();
// Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"));
Imports Accusoft.BarcodeXpressSdk
Dim barcodeXpress As New BarcodeXpress()
' Step 1: SDK license (for development)
barcodeXpress.Licensing.SolutionName = "YourCompanyName"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Step 2: Runtime license (for production — minimum 5 purchased)
barcodeXpress.Licensing.UnlockRuntime("YourRuntimeKey", Convert.ToInt64("98765432109876"))
SolutionName 和 SolutionKey 對啟動 SDK 本身。 UnlockRuntime 調用,以自己的金鑰和自己的解決方案金鑰作為單獨的參數,啟動生產部署功能。 要使生產部署能夠傳回完整、清晰的條碼值,兩者都必須存在且有效。
在程式碼審查中,這種模式會引發一個意料之中的問題:"為什麼我們要用兩個不同的金鑰呼叫 UnlockRuntime?"答案是,Accusoft 將 SDK 授權和部署授權視為獨立的產品,並分別計費——但從 API 本身並不總是顯而易見的。 團隊在初始設定六個月後維護此程式碼時,通常需要追溯到文件才能了解哪個鍵對應哪個功能。
IsRuntimeUnlocked 屬性可讓您檢查執行時間層是否處於活動狀態:
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
if (!barcodeXpress.Licensing.IsRuntimeUnlocked)
{
// In this state, barcode values are partially obscured
// "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active");
}
If Not barcodeXpress.Licensing.IsRuntimeUnlocked Then
' In this state, barcode values are partially obscured
' "1234567890" returns as "1234...XXX"
Console.WriteLine("Warning: runtime license not active")
End If
當團隊意識到評估模式輸出默默地返回部分資料而不是拋出異常或明顯失敗時,就會添加此檢查作為保護措施。
了解 IronBarcode
IronBarcode 是一個獨立的 .NET 條碼庫,除了其 NuGet 套件之外沒有任何外部相依性。 它透過靜態工廠方法處理產生和讀取操作,這意味著無需管理實例生命週期,也無需在應用程式程式碼中散佈建構函式呼叫。
單密鑰授權模式意味著您在試用模式下測試的內容就是在生產環境中運行的內容——唯一的區別是試用期間生成的條碼圖像上會帶有浮水印。 解碼後的值始終是完整的,這意味著您可以在決定是否購買之前,對實際文件的讀取準確率進行基準測試。
IronBarcode的主要特點:
-靜態 API 設計: BarcodeReader.Read() 和 BarcodeWriter.CreateBarcode() 是無狀態靜態方法,無需實例管理
-單一許可證密鑰:一個密鑰即可同時用於開發和生產部署; 沒有單獨的運行時許可層
-完整試用值:試用模式傳回完整的解碼值; 水印僅適用於產生的輸出影像,不適用於讀取的結果。
-自動格式偵測:IronBarcode會自動偵測所有支援格式的符號系統; 無需枚舉 BarcodeTypes
-原生 PDF 支援: BarcodeReader.Read("document.pdf") 直接處理 PDF 文件,無需單獨的渲染步驟
-無吞吐量上限:處理速度僅受硬體和網路容量限制,不受軟體限制。
-線程安全設計:無狀態靜態方法可以由任意數量的線程並發調用,無需實例隔離。
功能比較
| 特點 | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| 許可模式 | SDK 許可 + 單獨的運行時許可 | 單永久鑰匙 |
| 評估模式行為 | 條碼值部分被遮蔽("1234...XXX") | 傳回完整值,僅在產生的輸出上新增浮水印 |
| 吞吐量限制(標準) | 每分鐘40頁 | 無吞吐量限制 |
| PDF 支援 | 需要外部 PDF 庫進行影像擷取 | 原生 — BarcodeReader.Read("doc.pdf") |
| API 風格 | 基於實例的詳細配置 | 靜態工廠方法,流暢 API |
| 線程安全 | 每個線程一個實例是必要的。 | 無狀態靜態方法-自然線程安全 |
| 定價切入點 | 1960 美元以上的 SDK + 2500 美元以上的運行時環境(至少 5 個) | $749 永久授權(精簡版,1 位開發者) |
詳細功能比較
| 特點 | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| 授權 | ||
| 許可模式 | SDK密鑰 + 運行時密鑰 | 單永久鑰匙 |
| 最低運行時許可 | 5(即使只有一台伺服器) | 無運行時許可概念 |
| 評估模式 | 數值被隱藏為"1234...XXX" | 完整數值,僅在輸出影像上顯示浮水印 |
| 永久授權 | 非標準配置-請聯絡銷售 | 是的,所有級別 |
| 年度續約 | 需要提供支持 | 選項 |
| 閱讀 | ||
| 格式自動偵測 | 手動操作-必須指定條碼類型 | 所有支援的格式均自動運行 |
| PDF閱讀 | 需要外部 PDF 庫 | 原生語言 |
| 每張圖片包含多個條碼 | 是的,使用 BarcodeTypes 配置 |
是的,使用 ExpectMultipleBarcodes 選項 |
| 結果屬性 | BarcodeValue, BarcodeType |
Value, Format, Confidence, PageNumber |
| 吞吐量限制 | 40 PPM(標準版) | 任何等級均無限制 |
| 世代 | ||
| 代碼 128 生成 | 是的,透過 writer.BarcodeType |
是的,透過 BarcodeWriter.CreateBarcode() |
| 二維碼生成 | 是 | 是的,透過 QRCodeWriter.CreateQrCode() |
| 帶有徽標的二維碼 | 需要手動疊加影像 | AddBrandLogo("logo.png") 內置 |
| 輸出格式 | 文件保存 | PNG、JPG、PDF、二進位資料、流 |
| 平台和部署 | ||
| .NET Framework | 獨立的舊版 SDK | .NET Framework4.6.2+ |
| .NET Core / .NET 5+ | 是的(.NET Core SDK) | .NET Core 3.1+,.NET 5/6/7/8/9 |
| Linux/Docker | 是 | 是的-Windows x64/x86、Linux x64、macOS x64/ARM |
| Docker 授權配置 | 許可證文件或許可證伺服器 | 環境變數 |
| CI/CD 集成 | 需要 SDK 密鑰和運行時密鑰。 | 一個秘密 |
| 批次處理 | ||
| 螺紋安全 | 每個線程一個實例是必要的。 | 無狀態 — Parallel.ForEach 安全 |
| 平行批次 | 需要逐執行緒實例管理 | 直接並行。 ForEach 支持 |
授權架構
BarcodeXpress 和IronBarcode在授權複雜性方面的差異在編寫將在生產環境中運行的初始化程式碼時最為明顯。
BarcodeXpress 方法
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
_barcodeXpress = new BarcodeXpress();
// Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp";
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
// Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime(
"RuntimeKey-XXXXXX",
Convert.ToInt64("98765432109876"));
// Guard against partial-value mode
if (!_barcodeXpress.Licensing.IsRuntimeUnlocked)
{
throw new InvalidOperationException(
"Runtime license not active — barcode values will be obscured");
}
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
_barcodeXpress = New BarcodeXpress()
' Layer 1: SDK license
_barcodeXpress.Licensing.SolutionName = "AcmeCorp"
_barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
' Layer 2: Runtime license — separate purchase, minimum 5
_barcodeXpress.Licensing.UnlockRuntime("RuntimeKey-XXXXXX", Convert.ToInt64("98765432109876"))
' Guard against partial-value mode
If Not _barcodeXpress.Licensing.IsRuntimeUnlocked Then
Throw New InvalidOperationException("Runtime license not active — barcode values will be obscured")
End If
End Sub
End Class
這是一個 15 行的建構函數,其存在完全是為了在進行任何條碼操作之前管理兩個獨立的許可證金鑰系統。 IsRuntimeUnlocked 保護不是可選的——如果沒有它,在任何運行時鍵缺失或配置錯誤的環境中,服務都會靜默地返回降級值。
IronBarcode方法
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
using IronBarCode;
// In Program.cs or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY";
Imports IronBarCode
' In Program.vb or startup configuration
IronBarCode.License.LicenseKey = "YOUR-KEY"
這就是完整的許可設定。沒有單獨的運行時解鎖,沒有解決方案名稱,也沒有雙參數 UnlockRuntime 呼叫。 在 Docker 中,這會成為啟動時讀取的環境變數。在 CI/CD 管線中,它是一個金鑰。 在容器編排器中,它是一個注入到 pod 中的環境變數。
讀取條碼
條碼讀取揭示了這兩個庫的配置理念之間的差異——BarcodeXpress 需要明確的格式枚舉和基於屬性的設定 API,而IronBarcode只需一次方法調用即可自動檢測所有內容。
BarcodeXpress 方法
使用 BarcodeXpress 讀取資料需要透過 SetPropertyValue 配置讀取器,該讀取器接受一個常數和一個值,然後呼叫 Analyze() 來檢索結果:
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
using Accusoft.BarcodeXpressSdk;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var barcodeXpress = new BarcodeXpress();
barcodeXpress.Licensing.SolutionName = "AcmeCorp";
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234");
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"));
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath);
barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode |
BarcodeType.DataMatrixBarcode |
BarcodeType.QRCodeBarcode;
var results = barcodeXpress.reader.Analyze();
return results.Select(r => r.BarcodeValue);
}
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim barcodeXpress = New BarcodeXpress()
barcodeXpress.Licensing.SolutionName = "AcmeCorp"
barcodeXpress.Licensing.SolutionKey = Convert.ToInt64("12345678901234")
barcodeXpress.Licensing.UnlockRuntime("RuntimeKey", Convert.ToInt64("98765432109876"))
barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, imagePath)
barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.DataMatrixBarcode Or BarcodeType.QRCodeBarcode
Dim results = barcodeXpress.reader.Analyze()
Return results.Select(Function(r) r.BarcodeValue)
End Function
cycBxeSetFilename 常數是 API 指定要處理的檔案的方式。 這種模式——將常數標識符和一個值傳遞給通用方法——讓人聯想到早期的基於 COM 的 API。如果文件包含未在 BarcodeTypes 中列出的格式,則無法找到該文件。 當文件來源發生變化時,這就會成為維護開銷。
IronBarcode方法
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
using IronBarCode;
public IEnumerable<string> ReadAllBarcodes(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.Select(r => r.Value);
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IEnumerable(Of String)
Dim results = BarcodeReader.Read(imagePath)
Return results.Select(Function(r) r.Value)
End Function
IronBarcode 可自動偵測所有支援的條碼格式。 如果影像包含 Code 128、QR 碼和 DataMatrix,則這三個都會在結果集合中返回,無需任何配置變更。 為了更好地控制讀取行為, BarcodeReaderOptions類別提供了速度、線程數和多條碼設定。
透過相同的方法也可以直接閱讀 PDF 文件:
using IronBarCode;
//原生語言PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
using IronBarCode;
//原生語言PDF support — no separate library needed
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in results)
{
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}");
}
Imports IronBarCode
'原生語言PDF support — no separate library needed
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each result In results
Console.WriteLine($"Page {result.PageNumber}: [{result.Format}] {result.Value}")
Next
BarcodeXpress 本身不支援讀取 PDF 檔案。 您需要先使用單獨的庫將每一頁渲染成圖像,然後將這些圖像傳遞給 BarcodeXpress 閱讀器。 這會增加一個依賴項,增加一個轉換步驟,根據所選的 PDF 庫,還會增加額外的授權費用。
批量處理和螺紋安全
大批量條碼處理暴露了 BarcodeXpress 的有狀態實例模型和IronBarcode的無狀態靜態 API 之間的架構差異。
BarcodeXpress 方法
BarcodeXpress 是基於實例的,其 reader 物件是有狀態的。 並行處理需要每個執行緒一個實例,並且在每個執行緒上下文中重複執行完整的雙層許可證初始化:
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using Accusoft.BarcodeXpressSdk;
using System.Collections.Generic;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
_barcodeXpress.reader.SetPropertyValue(
BarcodeXpress.cycBxeSetFilename, path);
_barcodeXpress.reader.BarcodeTypes =
BarcodeType.LinearBarcode | BarcodeType.QRCodeBarcode;
var barcodes = _barcodeXpress.reader.Analyze();
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports Accusoft.BarcodeXpressSdk
Imports System.Collections.Generic
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
_barcodeXpress.reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path)
_barcodeXpress.reader.BarcodeTypes = BarcodeType.LinearBarcode Or BarcodeType.QRCodeBarcode
Dim barcodes = _barcodeXpress.reader.Analyze()
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
Next
Return results
End Function
標準版也規定每分鐘最多只能列印 40 頁。 以每分鐘 40 頁的速度處理 10 萬份文件,大約需要 41 小時才能完成。 專業版取消了這項限制,但每個開發人員的成本更高——此外,還需要支付已購買的運行時許可證費用。
IronBarcode方法
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
//IronBarcode— parallel batch with thread-safe static API
var files = Directory.GetFiles("/incoming/scans", "*.png");
var allResults = new ConcurrentBag<string>();
Parallel.ForEach(files, file =>
{
var r = BarcodeReader.Read(file);
foreach (var barcode in r)
allResults.Add($"{file}: {barcode.Value}");
});
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
'IronBarcode— parallel batch with thread-safe static API
Dim files = Directory.GetFiles("/incoming/scans", "*.png")
Dim allResults = New ConcurrentBag(Of String)()
Parallel.ForEach(files, Sub(file)
Dim r = BarcodeReader.Read(file)
For Each barcode In r
allResults.Add($"{file}: {barcode.Value}")
Next
End Sub)
因為IronBarcode的靜態方法是無狀態的,所以對它們進行操作是安全的,不需要實例隔離。IronBarcode在任何定價層級都沒有吞吐量上限。 為了調整讀取效能, BarcodeReaderOptions類別提供了 ReadingSpeed 和 MaxParallelThreads 設定:
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var results = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim results = BarcodeReader.Read("warehouse-scan.png", options)
ReadingSpeed.Balanced 是預設值。 對於條碼清晰的高通量流程,請使用 ReadingSpeed.Faster;對於損壞或對比度低的圖像,請使用 ReadingSpeed.Detailed。
API 對應參考。
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress() |
靜態方法-無需實例 |
Licensing.SolutionName = "..." |
IronBarCode.License.LicenseKey = "key" |
Licensing.SolutionKey = longValue |
(removed — not needed) |
Licensing.UnlockRuntime(key, solutionKey) |
(removed — no runtime license concept) |
Licensing.IsRuntimeUnlocked |
(removed — license is always either valid or not) |
reader.SetPropertyValue(BarcodeXpress.cycBxeSetFilename, path) |
BarcodeReader.Read(path) |
| `reader.BarcodeTypes = BarcodeType.LinearBarcode | …… | (removed — auto-detection handles all formats) |
reader.Analyze() |
(part of BarcodeReader.Read) |
result.BarcodeValue |
result.Value |
result.BarcodeType |
result.Format |
writer.BarcodeType = BarcodeType.Code128 |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.SaveToFile(path) |
.SaveAsPng(path) |
| 40 ppm 標準限值 | 任何層級均無吞吐量限制 |
| 評估結果:數值已隱藏為"1234...XXX" | 試用版:完整數值,僅在輸出影像上新增浮水印 |
當團隊考慮從 Accusoft BarcodeXpress 遷移到IronBarcode時
突破 40 PPM 壁壘
標準版每分鐘 40 頁的限制聽起來很慷慨,但當一個業務團隊決定對一年的存檔發票進行每日批量處理時,就會發現這根本不算什麼。 以此速度處理 10 萬份文件,大約需要 41 小時才能完成。 升級到專業版可以取消上限,但每個開發者席位的成本會更高——這還不包括已經購買的運行時許可證。 團隊在簽署採購訂單後發現吞吐量上限,往往會發現解除上限的總成本遠遠超過最初的估計。
CI/CD 流水線許可複雜性
典型的 CI/CD 設定會在臨時容器中運行建置。 使用 BarcodeXpress 時,每個建置環境都需要 SDK 金鑰對和執行時間解鎖金鑰,並將它們作為單獨的金鑰進行管理。 如果運行時密鑰缺失或配置錯誤,建置可能會成功,但整合測試會返回模糊的值——這是一種靜默的失敗模式,如果測試斷言沒有針對實際條碼內容仔細編寫,則很容易在測試管道中被忽略。
實體隔離和安全部署要求
某些環境——例如處理病人記錄的醫療保健系統、政府文件工作流程、金融機構後台處理——不能進行出站網路呼叫的許可證驗證。 BarcodeXpress 的執行時間授權系統涉及 Accusoft 的授權基礎架構,這在網路出口限制嚴格的環境中可能是個合規性問題。 在這些環境下工作的團隊通常會選擇許可證驗證完全在本地進行的庫。
Docker 和容器部署
在 Docker 中使用 BarcodeXpress 通常需要將許可證檔案掛載到容器的已知路徑,或設定許可證伺服器並將容器指向該伺服器。 這兩種方法都會增加部署的複雜性——許可證文件需要分發並保持同步,而且許可證伺服器還需要維護額外的基礎設施。 團隊遷移到微服務架構或無伺服器部署模式時發現,設定檔方法無法乾淨俐落地轉換為不可變容器鏡像。
評估準確性要求
對於需要在購買前驗證自身文件讀取準確性的團隊來說,BarcodeXpress 的評估模式從根本上來說是有限的。 使用真實世界的文件掃描進行測試——檢查庫是否能處理低對比度條碼、傾斜圖像或多條碼頁面——需要完整的解碼值。 部分遮蔽的輸出結果只能顯示庫找到了條碼,而無法顯示它是否正確讀取了條碼。
常見的遷移考量
實例管理到靜態調用
BarcodeXpress 要求在進行任何操作之前建立並授權 BarcodeXpress 實例。IronBarcode的靜態方法不需要實例。 遷移團隊通常會有一個 BarcodeService 類,其建構函式主要是許可樣板程式碼-遷移後,該建構函式可以完全刪除,或簡化為單一許可證金鑰分配。
條碼類型枚舉移除
BarcodeXpress 的每次讀取操作都需要一個 BarcodeTypes 標誌賦值,以列舉要搜尋的條碼類型。IronBarcode預設會自動偵測所有支援的格式。 遷移過程中,所有 reader.BarcodeTypes = …… 賦值都可以刪除而不進行替換。 如果出於效能原因需要限制搜尋範圍,BarcodeReaderOptions` 支援將格式過濾作為明確選擇加入而不是必需的預設值。
結果屬性名稱更改
兩個屬性重新命名會影響所有結果處理代碼:result.BarcodeValue 變為 result.Value,result.BarcodeType 變為 result.Format。 解決方案範圍內的搜尋和取代功能可以同時處理這兩種情況。IronBarcode的結果也會顯示 result.Confidence 和 result.PageNumber,這些沒有 BarcodeXpress 等效項,可以在不更改現有結果處理程式碼的情況下用於額外的篩選。
Docker 授權配置
BarcodeXpress 的 Docker 部署通常使用掛載的授權設定檔。IronBarcode則使用環境變數。 遷移過程包括刪除設定檔中的 COPY 指令,並新增一個環境變數賦值。 在 Kubernetes 中,許可證金鑰會成為 pod 規範中的一個秘密引用,而不是一個掛載的磁碟區。
IronBarcode的其他功能
除了本次對比中涵蓋的核心功能外,IronBarcode 還提供了一些 BarcodeXpress 所不具備的功能:
-帶有Logo的二維碼: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") 將品牌圖像原生嵌入二維碼中,並具有可配置的糾錯級別,以確保掃描可靠性
-在 PDF 上新增條碼:無需單獨的 PDF 庫,即可直接在現有 PDF 文件上寫入條碼。
-批次匯出:一次處理整個 PDF 文檔,並取得包含頁碼、格式、值和置信度評分的逐頁結果
.NET相容性與未來準備
IronBarcode 支援.NET Framework4.6.2 及更高版本、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目標包括 Windows x64 和 x86、Linux x64 以及 macOS x64 和 ARM。 BarcodeXpress for .NET Core 是一個獨立於舊版.NET Framework的 SDK——升級應用程式目標框架的團隊需要考慮到這一點。IronBarcode的單一軟體包涵蓋了所有支援的執行環境。 定期更新可確保與預計於 2026 年底發布的 .NET 10 以及未來發布的 .NET 版本相容。
結論
BarcodeXpress 和IronBarcode代表了商業 .NET 條碼庫的兩種不同設計理念。 BarcodeXpress 將 SDK 存取和生產部署視為單獨的授權產品,具有單獨的計費方式、單獨的金鑰系統和單獨的最低購買要求。IronBarcode將該庫視為單一產品,使用一個金鑰即可涵蓋從開發到生產的每個環境。
對於已經融入 Accusoft 產品生態系統的團隊來說,BarcodeXpress 是一個合理的選擇——使用 PrizmDoc 或 ImageGear 的組織會發現 BarcodeXpress 的 API 很熟悉,並且他們與 Accusoft 的帳戶關係有助於獲得統一的支援。 對於這些車隊來說,雙密鑰許可系統是一種既定的營運模式,而不是新的摩擦。 SDK 也適用於文件來源控制良好且格式要求穩定的環境,使得手動 BarcodeTypes 規範成為可接受的一次性配置,而不是持續維護。
IronBarcode 更適合部署到容器、CI/CD 管道和雲端環境的團隊,因為在這些環境中,許可證管理的複雜性會直接影響營運成本。 自動偵測模型、靜態 API 和原生 PDF 支援減少了整合程式碼的面積,而單一金鑰授權模型簡化了跨開發、測試和生產環境的金鑰管理。 對於需要在購買前評估讀取準確性的團隊來說,完整的試驗輸出(生成的圖像上帶有浮水印,而不是讀取結果上帶有浮水印)可以實現真正的購買前基準測試。
每個檔次的價格差異都很大。 對於單一開發者而言,BarcodeXpress SDK 加上最低運行時許可證與IronBarcode的 Lite 層級之間存在著相當大的差距。 對於那些將成本差異置於 Accusoft 生態系統整合之上的團隊而言,BarcodeXpress 仍然是一個合理的選擇。而對於那些僅從條碼庫本身的效能來評估的團隊來說,IronBarcode 的評估模式限制、雙密鑰許可和吞吐量上限等因素,使其成為更直接的選擇。
常見問題解答
什麼是 Accusoft BarcodeXpress?
Accusoft BarcodeXpress 是一個 .NET 條碼庫,用於在 C# 應用程式中產生和讀取條碼。它是開發人員在為 .NET 專案選擇條碼解決方案時評估的幾個替代方案之一。
Accusoft BarcodeXpress 和 IronBarcode 的主要差異是什麼?
IronBarcode 使用靜態、無狀態的 API,無需實例管理,而 Accusoft BarcodeXpress 通常需要在使用前建立和設定實例。 IronBarcode 還提供原生 PDF 支援、自動格式偵測以及跨所有環境的單金鑰許可。
IronBarcode 的授權是否比 Accusoft BarcodeXpress 更容易?
IronBarcode 使用單一授權金鑰,同時涵蓋開發和生產部署。與將 SDK 金鑰與執行時間金鑰分開的授權系統相比,這簡化了 CI/CD 管線和 Docker 配置。
IronBarcode是否支援Accusoft BarcodeXpress支援的所有條碼格式?
IronBarcode 支援超過 30 種條碼符號體系,包括 QR 碼、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自動偵測功能意味著無需明確枚舉格式。
IronBarcode是否支援原生PDF條碼讀取?
是的。 IronBarcode 可以直接從 PDF 檔案讀取條碼,使用 `BarcodeReader.Read("document.pdf")` 方法,無需單獨的 PDF 渲染庫。每頁的讀取結果包括頁碼、條碼格式、數值和置信度評分。
與 Accusoft BarcodeXpress 相比,IronBarcode 在批次處理方面有何不同?
IronBarcode 的靜態方法是無狀態的,且天然執行緒安全,因此可以直接使用 Parallel.ForEach,而無需進行執行緒層級實例管理。所有定價層級均無吞吐量上限。
IronBarcode支援哪些.NET版本?
IronBarcode 在單一 NuGet 套件中支援 .NET Framework 4.6.2+、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目標包括 Windows x64/x86、Linux x64 和 macOS x64/ARM。
如何在.NET專案中安裝IronBarcode?
透過 NuGet 安裝 IronBarcode:在程式包管理器控制台中執行“Install-Package IronBarCode”,或在命令列介面中執行“dotnet add package IronBarCode”。無需其他 SDK 安裝程式或運行時檔案。
與 Accusoft BarcodeXpress 不同,我可以在購買前評估 IronBarcode 嗎?
是的。 IronBarcode 的試用模式會傳回完整的解碼條碼值-只有產生的輸出影像才會有浮水印。您可以在購買前,用自己的文件測試讀取準確率。
Accusoft BarcodeXpress 和 IronBarcode 的價格有什麼不同?
IronBarcode 的永久單開發者許可證起價為 749 美元,涵蓋開發和生產環境。定價詳情和大量許可選項請造訪 IronBarcode 授權頁面。無需單獨的運行時許可證。
從 Accusoft BarcodeXpress 遷移到 IronBarcode 是否簡單?
從 Accusoft BarcodeXpress 遷移到 IronBarcode 主要涉及將基於實例的 API 呼叫替換為 IronBarcode 的靜態方法、移除許可相關的樣板程式碼以及更新結果屬性名稱。大多數遷移工作都是減少程式碼,而不是增加程式碼。
IronBarcode 能產生帶有 logo 的二維碼嗎?
是的。 `QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以將品牌圖片原生嵌入二維碼中,並支援設定糾錯功能。此外,它還支援透過 `ChangeBarCodeColor()` 函數建立彩色二維碼。

