如何在條碼中使用非同步和多執行緒C#
從QRCoder遷移到IronBarcode
本指南是為那些以QRCoder開始其專案並需要超越QR碼生成功能的開發團隊撰寫的。 QRCoder是一個維護良好且質量很高的程式庫,它在其預期範圍內表現出色,遷移與其質量無關。 這是對需求的回應——格式擴展、條碼讀取、PDF整合——這些都是QRCoder尚未涵蓋的功能。 本指南涵蓋了從QRCoder改為IronBarcode的完整技術路徑:套件替換、命名空間變更、每種常用模式的程式碼轉換、API對應列表以及遷移過程中出現問題的解決方案。
為何從QRCoder遷移
超越QR的格式需求:QRCoder僅生成QR碼。 當專案需要為物流使用Code 128標籤、零售產品識別使用EAN-13碼、製藥序列化使用DataMatrix或政府文件合規使用PDF417時,必須為每個額外格式引入單獨的程式庫。 隨著所需格式數量的增加,獨立套件、API和維護義務的數量也會增加。
條碼讀取需求:QRCoder沒有條碼讀取API —— 它本質上是一個僅生成的程式庫。 任何需要從傳入圖像中解碼QR碼、驗證掃描文件上條碼或處理運送標籤的應用都必須在QRCoder旁邊新增獨立的讀取程式庫。 這第二個程式庫帶來了自己的API介面、更新週期以及每次.NET升級時的相容性問題。
多程式庫維護:基於QRCoder的專案的現實累積模式是從QRCoder進行QR生成到1D條碼程式庫進行運送標籤,再到讀取程式庫進行解碼。 管理三到四個獨立套件意味著跟踪不同的版本說明,解決其中任何一個更新時的版本衝突,以及在開發團隊中保持對多個API的熟悉。 維護負擔隨時間增加,而在最初的整合估計中通常不明顯。
PDF支持:將條碼嵌入PDF文件或從傳入的PDF文件中提取條碼都在QRCoder的範圍之外。 文件處理流水線——發票處理、從PDF模板生成標籤、合規報告——在早期就會遇到此限制。 必須在QRCoder旁邊新增專用的PDF程式庫,或必須通過單獨的子系統進行條碼生成和PDF生成的路由。
基本問題
QRCoder有效地解決了QR生成問題。 當任何需求超出QR範圍時,程式碼庫必須開始引入其他套件以填補每個缺口:
//QRCoderhandles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
//QRCoderhandles QR generation well — but no further
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));
// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))
' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
IronBarcode將生成、讀取和PDF整合合併到一個API下:
//IronBarcode— one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
//IronBarcode— one library covers all of the above
using IronBarCode;
// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
.SaveAsPng("qr.png");
// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
.SaveAsPng("label.png");
// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode
' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode).SaveAsPng("qr.png")
' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128).SaveAsPng("label.png")
' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
IronBarcode與QRCoder:功能比較
| 功能 | QRCoder | IronBarcode |
|---|---|---|
| QR碼生成 | 是的 — 優異 | 是 |
| 微型QR | 是 | 否 |
| Code 128 / Code 39 | 否 | 是 |
| EAN-13 / UPC-A | 否 | 是 |
| DataMatrix | 否 | 是 |
| PDF417 | 否 | 是 |
| Aztec | 否 | 是 |
| 總格式數量 | 1 | 50+ |
| 條碼讀取 | 否 | 是的 — 自動檢測 |
| PDF條碼提取 | 否 | 是 |
| PDF條碼加印 | 否 | 是 |
| Logo嵌入 | 是 | 是 |
| 顏色自定義 | 是 | 是 |
| SVG輸出 | 是 | 是 |
| PayloadGenerator輔助工具 | 是 | 否 — 手動字串構造 |
| 零外部依賴 | 是 | 自包含 |
| 授權 | MIT — 無限制 | 商業 — Lite等級涵蓋單一開發者 |
快速開始:從QRCoder遷移到IronBarcode
步驟 1:替換 NuGet 包
從專案中移除QRCoder:
dotnet remove package QRCoder
dotnet remove package QRCoder
安裝IronBarcode:
dotnet add package IronBarcode
dotnet add package IronBarcode
如果專案曾使用ZXing.Net與QRCoder搭配進行條碼讀取,此階段也可將該套件移除:
dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
步驟 2:更新命名空間
將QRCoder命名空間導入替換為IronBarcode命名空間:
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;
// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder
' After (IronBarcode)
Imports IronBarCode
步驟 3:初始化授權
在應用啟動時新增授權初始化——Program.cs, Startup.cs, 或靜態構造函式:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
無需註冊即可獲取免費試用金鑰。 生產部署需要購買授權。
程式碼遷移範例
基本QR碼生成
最常見的QRCoder模式需要三個物件:一個PngByteQRCode。 在IronBarcode中,單個靜態調用即可替代這個鏈。
QRCoder方法:
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
using QRCoder;
public class BarcodeService
{
private readonly QRCodeGenerator _generator = new QRCodeGenerator();
public byte[] GenerateQR(string content)
{
var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
return qrCode.GetGraphic(10); // 10px per module
}
}
Imports QRCoder
Public Class BarcodeService
Private ReadOnly _generator As New QRCodeGenerator()
Public Function GenerateQR(content As String) As Byte()
Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrCodeData)
Return qrCode.GetGraphic(10) ' 10px per module
End Function
End Class
IronBarcode 方法:
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
using IronBarCode;
public class BarcodeService
{
public byte[] GenerateQR(string content)
{
return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
.ResizeTo(200, 200)
.ToPngBinaryData();
}
}
Imports IronBarCode
Public Class BarcodeService
Public Function GenerateQR(content As String) As Byte()
Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
.ResizeTo(200, 200) _
.ToPngBinaryData()
End Function
End Class
BarcodeWriter是一個靜態類——不需要實例,也不需要中間資料物件。 GetGraphic中接受的每模組像素整數。 在這裡QRCoder依照模組計數來調整輸出大小(例如,GetGraphic(10)為每模組10px圖像),IronBarcode採用絕對像素尺寸。
將QR碼保存到檔案
QRCoder僅通過終端步驟將記憶體中的位元組與文件輸出分開——渲染鏈相同。 IronBarcode在同一鏈上使用不同的終端方法。
QRCoder方法:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
IronBarcode 方法:
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
using IronBarCode;
// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("output.png");
// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.ToPngBinaryData();
Imports IronBarCode
' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("output.png")
' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.ToPngBinaryData()
SaveAsPng方法是一個直接寫入磁碟的終端。 byte[]用於流傳輸、HTTP響應或資料庫儲存。
SVG輸出
QRCoder方法:
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;
var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO
Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
IronBarcode 方法:
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
using IronBarCode;
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsImage("output.svg");
Imports IronBarCode
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsImage("output.svg")
.svg擴展名會產生SVG輸出)。
錯誤校正等級映射
QRCoder在每次QRCodeGenerator.ECCLevel列舉。 IronBarcode在使用QRCodeWriter.QrErrorCorrectionLevel提供顯式控制。
QRCoder方法:
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;
var generator = new QRCodeGenerator();
// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder
Dim generator As New QRCodeGenerator()
' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
IronBarcode 方法:
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;
// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
.SaveAsPng("default-ecc.png");
// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
"https://example.com",
500,
QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode
' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
.SaveAsPng("default-ecc.png")
' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
"https://example.com", _
500, _
QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
等級映射為:ECCLevel.L → Low, ECCLevel.M → Medium, ECCLevel.Q → High, ECCLevel.H → Highest。
Logo嵌入
這兩個程式庫都支持QR碼上的Logo嵌入。 QRCoder通過System.Drawing.Bitmap參數。 IronBarcode提供QRCodeWriter.CreateQrCodeWithLogo()作為接受URL和Logo檔案路徑的專用工廠方法。 QR碼風格自定義指南涵蓋了Logo大小、定位和顏色組合選項。
QRCoder方法:
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;
var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging
Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
IronBarcode 方法:
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
using IronBarCode;
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
.SaveAsPng("qr-logo.png");
Imports IronBarCode
QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
.SaveAsPng("qr-logo.png")
CreateQrCodeWithLogo接受內容和Logo影像的檔案路徑字串。 錯誤校正會自動設置為Logo嵌入所需的級別; 不需要顯式的ECC配置。
PayloadGenerator.WiFi遷移
QRCoder的PayloadGenerator.WiFi格式化標準WiFi QR有效載荷字串。 輸出格式是QR碼規範定義的公共標準(WIFI:T:{auth};S:{ssid};P:{password};;)。 在遷移時,這些字串可以直接構建。
QRCoder方法:
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;
var wifi = new PayloadGenerator.WiFi(
ssid: "OfficeNetwork",
password: "SecurePass123",
authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder
Dim wifi = New PayloadGenerator.WiFi(
ssid:="OfficeNetwork",
password:="SecurePass123",
authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;
Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
IronBarcode 方法:
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
using IronBarCode;
// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
.ResizeTo(300, 300)
.SaveAsPng("wifi.png");
Imports IronBarCode
' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
.ResizeTo(300, 300) _
.SaveAsPng("wifi.png")
對於使用多種型別的團隊(vCard、CalendarEvent、Geo、SMS),方法相同:識別每個生成器使用其.ToString()輸出生成的格式化字串,然後直接構建該字串或通過小靜態輔助方法。
QRCoderAPI到IronBarcode的對應參考
| QRCoder | IronBarcode | 注意事項 |
|---|---|---|
new QRCodeGenerator() |
靜態類——無實例 | BarcodeWriter不需要實例建立 |
qrGenerator.CreateQrCode(data, ECCLevel.M) |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) |
直接替換 |
new PngByteQRCode(qrCodeData) |
不需要 | 渲染是流暢鏈的一部分 |
byte[] |
.ToPngBinaryData() |
通過.ResizeTo(w, h)設置大小 |
File.WriteAllBytes(path, bytes)模式 |
.SaveAsPng(path) |
在GeneratedBarcode上的終端方法 |
new SvgQRCode(qrCodeData).GetGraphic(10) |
.SaveAsImage(path) |
為SVG輸出傳遞.svg擴展名 |
new QRCode(qrCodeData).GetGraphic(...) |
QRCodeWriter.CreateQrCode(data, size, level) |
用於Logo和顏色自定義 |
QRCodeGenerator.ECCLevel.L |
QRCodeWriter.QrErrorCorrectionLevel.Low |
|
QRCodeGenerator.ECCLevel.M |
QRCodeWriter.QrErrorCorrectionLevel.Medium |
預設在未指定時 |
QRCodeGenerator.ECCLevel.Q |
QRCodeWriter.QrErrorCorrectionLevel.High |
|
QRCodeGenerator.ECCLevel.H |
QRCodeWriter.QrErrorCorrectionLevel.Highest |
Logo嵌入所需 |
PayloadGenerator.WiFi(...).ToString() |
"WIFI:T:WPA;S:{ssid};P:{pass};;" |
直接構建標準字串 |
PayloadGenerator.ContactData(...).ToString() |
"BEGIN:VCARD\n..." |
vCard是公共標準 |
| 無讀取 API | BarcodeReader.Read(path) |
新功能——無需額外的程式庫 |
| 僅QR格式 | 通過BarcodeEncoding.*支持超過50種格式 |
新功能 |
常見遷移問題及解決方案
問題1:PayloadGenerator字串格式變更
QRCoder:PayloadGenerator.WiFi, PayloadGenerator.ContactData等幫助器自動生成格式化字串。 程式碼將輔助物件的CreateQrCode。
解決方案:識別每個PayloadGenerator型別生成的字串 - 其格式在QR碼規範中有記載,容易重現。 對於WiFi:WIFI:T:WPA;S:{ssid};P:{password};;。 對於vCard:標準BEGIN:VCARD / END:VCARD塊。 如果許多調用點使用同一種有效承載型別,可以編寫靜態助手方法:
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
=> $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
問題2:ECCLevel枚舉映射
QRCoder:L, M, Q, H的巢狀枚舉。 它是每次CreateQrCode調用中的必填參數。
解決方案:在使用QRCodeWriter.QrErrorCorrectionLevel等效值。 在使用BarcodeWriter.CreateBarcode時,ECC級別預設為中等,無需參數。 更新每個調用點:
//QRCoderECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
//QRCoderECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
//QRCoderECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);
//QRCoderECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
'QRCoderECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
'QRCoderECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
問題3:渲染器類移除
QRCoder:每個輸出格式都需要其渲染器類的實例化—QRCode。 這些類接受GetGraphic,具有不同的返回型別。
解決方案:移除所有渲染器類的實例化。 IronBarcode將格式輸出內建在流暢鏈的終端方法中。 將.ResizeTo()之後。 將.svg擴展名。 QRCodeData中間物件也消失了——在IronBarcode中不需要。
問題4:PngByteQRCode移除及基於模組的尺寸調整
QRCoder:PngByteQRCode.GetGraphic(int pixelsPerModule)以每QR模組像素數量進行調整。 其結果影像尺寸取決於模組數量,這會隨著內容長度和ECC級別而變化。
解決方案:替換基於模組的尺寸調整為ResizeTo(int width, int height)絕對像素維度。 如果您的程式碼通過模組數計算預期輸出尺寸,則切換到能滿足輸出需求的固定目標尺寸:
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);
// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
.ResizeTo(400, 400)
.ToPngBinaryData();
Imports System
' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)
' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
.ResizeTo(400, 400) _
.ToPngBinaryData()
QRCoder遷移檢查清單
遷移前任務
在做出任何變更之前核對程式碼庫中所有的QRCoder使用:
# Find allQRCodernamespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find allQRCodernamespace imports
grep -r "using QRCoder" --include="*.cs" .
# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .
# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .
# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .
# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
- 用文件記錄所有
PayloadGenerator型別的使用情況,並註明其字串輸出格式 - 記錄所有ECC級別值的使用情況及其調用點
- 確認任何與QRCoder搭配使用的ZXing.Net讀碼程式碼——這可以同時被替換掉
- 獲取IronBarcode授權金鑰(無需註冊即可獲得試用金鑰)
程式碼更新任務
- 運行
dotnet remove package QRCoder - 如果僅與QRCoder一起使用讀碼功能,運行
dotnet remove package ZXing.Net - 運行
dotnet add package IronBarcode - 在應用程式啟動時加入
IronBarCode.License.LicenseKey = "YOUR-KEY"; - 用
using QRCoder;匯入 - 移除所有
BarcodeWriter是靜態的 - 用
generator.CreateQrCode(data, ECCLevel.X)+ 渲染器鏈模式 - 將
.ResizeTo(w, h) - 將
.SaveAsPng(path)終端方法 - 將
.svg擴展名) - 將
PayloadGenerator.WiFi(...)及其他輔助器初始化替換為直接格式字串 - 將每個
QRCodeWriter.QrErrorCorrectionLevel等效值 - 將任何ZXing.Net
BarcodeReader.Read(path) - 對於Logo嵌入,將
QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)
遷移後測試
- 使用至少兩個獨立的QR碼掃描應用程式掃描所有生成的QR碼以驗證可讀性
- 驗證嵌入Logo的QR碼能正確掃描——確認錯誤校正級別是
Highest - 比較生成的碼的視覺輸出與遷移前的樣本,在需要外觀一致性的地方
- 測試所有
PayloadGenerator替換——確認WiFi、vCard和其他有效負載字串在目標裝置上解碼正確 - 如果同時移除ZXing.Net,則驗證所有條碼讀取路徑通過
BarcodeReader.Read功能 - 在乾淨的環境中運行應用程式以確認沒有殘留的QRCoder或ZXing.Net引用引發綁定失敗
- 確認IronBarcode授權金鑰在工商環境及預備環境中正確載入
遷移到IronBarcode的主要優勢
所有條碼操作的單一API:遷移後,每個條碼任務——生成、讀取、PDF加印——都使用相同的IronBarCode命名空間和相同的進入點。 新加入該專案的開發者學習一個API而非三個。 條碼子系統的程式碼審查變得一致。 文件查詢被集中化。
不需要第二個程式庫進行條碼讀取:BarcodeReader.Read處理圖像文件、PDF頁面、流及記憶體位圖,具有自動格式檢測能力。 先前需要ZXing.Net的讀取能力——其格式規範要求及執行緒安全考量——現在可通過單一方法調用立即獲得。 從圖像讀取條碼指南涵蓋多條碼檢測、圖像預處理和PDF頁面掃描。
無需新依賴的格式擴展:遷移後新增Code 128、EAN-13、DataMatrix、PDF417或任何其他支持的格式只需不同的BarcodeEncoding參數值。 沒有需要安裝的新套件、沒有需要學習的新API,也沒有需要管理的版本相容性問題。 新格式需求變為一行程式碼的改變,而非新程式庫的整合。
簡化的QR碼自定義:Logo嵌入、顏色更改和靜默區域控製作為QRCodeWriter結果上的命名方法可用。 QRCoder為Logo嵌入要求的System.Drawing.Bitmap依賴被簡單的檔案路徑字串所取代。 QR碼風格自定義指南文件化了所有可用的自定義選項。
內建的PDF整合:條碼可以從傳入的PDF文件中讀取並加印到現有的PDF文件中,而無需新增PDF程式庫。 之前需要單獨PDF依賴的文件處理工作流程,現在則將條碼和PDF功能合併。
減少長期維護負擔:從三到四個獨立包遷移到一個,消除了跟踪多個發布周期、解決跨程式庫版本衝突及在.NET版本更新時更新多個測試套件的複合開銷。 條碼子系統的維護成本減至單個程式庫依賴。
常見問題
為什麼我應該從QRCoder.NET遷移到IronBarcode?
常見的理由包括簡化授權(去除SDK +運行時鑰匙的複雜性)、消除吞吐量限制、獲得原生PDF支持、改善Docker/CI/CD部署,並減少生產程式碼中的API樣板。
我該如何用IronBarcode取代QRCoder的API呼叫?
用IronBarCode.License.LicenseKey = "key"替換實例建立和授權樣板。用BarcodeReader.Read(path)替換讀取呼叫,用BarcodeWriter.CreateBarcode(data, encoding)替換寫入呼叫。靜態方法不需要實例管理。
從QRCoder.NET遷移到IronBarcode需要多少程式碼變更?
大多數遷移會導致較少的程式碼行。授權樣板、實例構造函式和顯式格式配置被移除。核心讀/寫操作映射為較短的IronBarcode等價物,且結果物件更清晰。
在遷移過程中,我需要同時安裝QRCoder.NET和IronBarcode嗎?
不需要。大多數遷移是直接替換而不是並行操作。一次遷移一個服務類,替換NuGet引用,並更新實例化和API呼叫模式後再移動到下一個類。
IronBarcode的NuGet包名稱是什麼?
包名是'IronBarCode'(大寫B和C)。可以用'Install-Package IronBarCode'或'dotnet add package IronBarCode'安裝。程式碼中的using指令是'using IronBarCode;'。
與QRCoder.NET相比,IronBarcode如何簡化Docker的部署?
IronBarcode是沒有外部SDK文件或掛載許可配置的NuGet封裝。在Docker中,設置IRONBARCODE_LICENSE_KEY環境變數,包在啟動時處理許可驗證。
從QRCoder遷移後,IronBarcode會自動檢測所有的條碼格式嗎?
是的。IronBarcode自動檢測所有支持的格式的符號學。不需要顯式的BarcodeTypes枚舉。如果格式已經知道並且性能很重要,BarcodeReaderOptions允許限制搜索空間作為優化。
IronBarcode是否可以不使用單獨的庫讀取PDF中的條碼?
可以。BarcodeReader.Read("document.pdf")原生處理PDF文件。結果包括每個條碼發現的頁碼、格式、值和置信度。不需要外部PDF渲染步驟。
IronBarcode如何處理並行條碼處理?
IronBarcode的靜態方法是無狀態且執行緒安全的。直接使用Parallel.ForEach遍歷文件列表,不需要每個執行緒的實例管理。BarcodeReaderOptions.MaxParallelThreads控制內部執行緒預算。
從QRCoder.NET遷移到IronBarcode時,結果的屬性有何變更?
常見的重命名:BarcodeValue變為Value,BarcodeType變為Format。IronBarcode結果還新增了Confidence和PageNumber。整個解決方案的搜索和替換可處理現有結果處理程式碼中的重新命名。
我如何在CI/CD管道中設置IronBarcode授權?
將IRONBARCODE_LICENSE_KEY作為管道機密儲存,在應用程式啟動程式碼中分配IronBarCode.License.LicenseKey。一個機密涵蓋所有環境,包括開發、測試、分期和生產。
IronBarcode是否支持生成帶有自定義樣式的QR碼?
支持。QRCodeWriter.CreateQrCode()支持通過ChangeBarCodeColor()自定義顏色,通過AddBrandLogo()嵌入logo,可配置錯誤校正級別,以及包括PNG、JPG、PDF和流在內的多種輸出格式。

