IRONSOFTWAREHOME
影片

從MessagingToolkit.Barcode遷移到IronBarcode

Curtis Chau
Curtis Chau
Updated: 2026年8月1日

MessagingToolkit.Barcode在2013年發佈了最後一個版本——1.7.0.2——之後就沒有再更新。 本指南涵蓋完整的遷移過程:為什麼需要遷移,程式碼中的變更,以及如何驗證遷移是否完成。 指南針對的是獨立遷移條碼功能的團隊以及進行.NET framework全面升級以滿足MessagingToolkit.Barcode作為阻止性依賴的團隊。

為什麼要從MessagingToolkit.Barcode遷移

**Framework相容性阻礙:**MessagingToolkit.Barcode針對.NET Framework 3.5、4.0和4.5開發。不支持.NET Standard和.NET Core。 當任何引用此程式包的專案文件設置為現代.NET目標框架——.NET 6、.NET 7、.NET 8或.NET 9時,NuGet恢復操作會因框架相容性錯誤而失敗。 無法進行構建。 這不是一個警告或運行時退化; 這是一個編譯時失敗,完全阻止專案的構建。 移除MessagingToolkit.Barcode是任何.NET framework升級的必要條件,而不是一個選擇性的清理步驟。

**安全風險:**自最後一次程式碼變更以來已經過去12年。 任何在2014年後發現的程式庫中的影像解析邏輯漏洞、其衍生自ZXing的解碼實現或其遞歸依賴,都無補丁、無建議,並且無維護者可以聯繫。 安全掃描工具將此程式包標記為已被放棄。 合規框架——PCI DSS、HIPAA、SOC 2、ISO 27001——要求對第三方軟體進行主動補丁管理。 即使沒有識別到具體的CVE,已放棄的程式包在過程基礎上未通過審核。

**終止的平台目標:**NuGet程式包元資料列出Silverlight 3、4 和 5作為目標平台; 這三者在2021年被終止。列出了Windows Phone 7.0、7.5、7.8和8.0; 對這些平台的支援已經於2014年到2017年之間結束。該程式庫從未更新過針對任何接替這些被終止環境的平台。

**能力缺口:**MessagingToolkit.Barcode只接受System.Drawing.Bitmap作為輸入,這在.NET 6及以後的版本中僅限於Windows。 它每次解碼調用只返回一個結果,且不支援多條碼影像。 它沒有PDF閱讀能力——需要從PDF文件中讀取條碼的應用需要單獨的提取步驟,才能調用此程式庫。 輸出生成返回一個System.Drawing.Imaging的導入,阻止跨平台部署。

基本問題

MessagingToolkit.Barcode強制依賴於System.Drawing並使用基於實例的工作流,這與現代.NET不相容:

// MessagingToolkit.Barcode: only compiles on .NET Framework 4.5 or earlier
// System.Drawing.Bitmap throws PlatformNotSupportedException on Linux/.NET 6+
using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))  // Windows-only in .NET 6+
{
    var result = decoder.Decode(bitmap);          // Single result or null
    if (result != null)
    {
        Console.WriteLine(result.Text);
    }
}

IronBarcode完全去除了System.Drawing依賴,在Windows、Linux、macOS和Docker容器上工作相同:

// IronBarcode: runs on .NET 6, 7, 8, 9 — Windows, Linux, macOS, Docker
using IronBarCode;

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

var results = BarcodeReader.Read("barcode.png");  //否Bitmap, no System.Drawing
foreach (var result in results)
{
    Console.WriteLine(result.Value);
}
C#

IronBarcode與MessagingToolkit.Barcode:功能比較

功能MessagingToolkit.BarcodeIronBarcode
最後更新20142026(活躍)
NuGet版本1.7.0.2(最終)目前,定期更新
.NET 6 / 7 / 8 / 9 支援
.NET Framework 4.6.2+
.NET Framework 3.5–4.5
.NET Core支援
ASP.NET Core
.NET MAUI
Blazor
跨平台(Linux, macOS)
Docker/容器支持
條碼閱讀輸入型別僅限Bitmap路徑、流、位元組陣列、PDF
PDF 條碼讀取是(原生)
多條形碼每影像
自動格式檢測
條碼生成輸出格式僅限BitmapPNG、JPEG、SVG、PDF、位元組陣列
System.Drawing依賴需要None
安全修補程式自2014年以來無定期補丁
商業支持None有專業支援可用
合規審核結果標記為已被放棄通過標準審核

快速開始:從MessagingToolkit.Barcode到IronBarcode的遷移

步驟 1:替換 NuGet 包

移除MessagingToolkit.Barcode程式包:

dotnet remove package MessagingToolkit.Barcode
SHELL

如果專案是通過在MessagingToolkit.Barcode.dll, 也需要移除該引用。

安裝IronBarcode:

dotnet add package IronBarcode
SHELL

IronBarcode支援.NET Framework 4.6.2到.NET 9。它作為一個單獨的程式包安裝,包含所有依賴項——不需要另加圖形程式庫或ZXing引用。

步驟 2:更新命名空間

在每個引用舊程式庫的文件中將MessagingToolkit命名空間替換為IronBarcode命名空間:

// Remove this
using MessagingToolkit.Barcode;
using System.Drawing;  // if used only for Bitmap input to MessagingToolkit

// Add this
using IronBarCode;

僅為了MessagingToolkit.Barcode使用的System.Drawing匯入的文件,可在IronBarcode處於妥當的位置後移除這一匯入。

步驟 3:初始化授權

在應用程式啟動時新增一次授權初始化——在Startup.cs或等效的進入點。 需要授權金鑰才能在生產中使用; 程式庫在沒有授權金鑰的情況下運行在試用模式。

// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

程式碼遷移範例

從圖像文件讀取條碼

舊方法需要從文件路徑構建一個BarcodeDecoder實例。 IronBarcode直接接受文件路徑。

MessagingToolkit.Barcode方法:

using MessagingToolkit.Barcode;
using System.Drawing;

public string ReadBarcodeValue(string imagePath)
{
    var decoder = new BarcodeDecoder();
    using (var bitmap = new Bitmap(imagePath))
    {
        var result = decoder.Decode(bitmap);
        return result?.Text;
    }
}

IronBarcode 方法:

using IronBarCode;

public string ReadBarcodeValue(string imagePath)
{
    var results = BarcodeReader.Read(imagePath);
    return results.FirstOrDefault()?.Value;
}

IronBarcode版本去除了Bitmap構建和對單一物件的空條件模式。 在未找到時,.FirstOrDefault()替代了對舊單結果返回值的空檢查。

從結果中存取格式資訊

MessagingToolkit.Barcode通過result.BarcodeFormat公開了檢測到的格式。 IronBarcode通過result.Format公開。 兩者都是結果物件上的enum列舉值,具有不同的enum型別名。

MessagingToolkit.Barcode方法:

using MessagingToolkit.Barcode;
using System.Drawing;

var decoder = new BarcodeDecoder();
using (var bitmap = new Bitmap("barcode.png"))
{
    var result = decoder.Decode(bitmap);
    if (result != null)
    {
        Console.WriteLine($"Value: {result.Text}");
        Console.WriteLine($"Format: {result.BarcodeFormat}");
    }
}

IronBarcode 方法:

using IronBarCode;

var results = BarcodeReader.Read("barcode.png");
var first = results.FirstOrDefault();
if (first != null)
{
    Console.WriteLine($"Value: {first.Value}");
    Console.WriteLine($"Format: {first.Format}");
}

屬性名稱從.Format。 enum型別從.Format.ToString()生成了一個可供展示或記錄使用的可比較的可讀字串。

生成條碼

MessagingToolkit.Barcode在調用BarcodeEncoder,並設置屬性格式。 IronBarcode使用靜態方法,將編碼型別作為參數。

MessagingToolkit.Barcode方法:

using MessagingToolkit.Barcode;

public void GenerateQrCode(string data, string outputPath)
{
    var encoder = new BarcodeEncoder();
    encoder.Format = BarcodeFormat.QrCode;
    var bitmap = encoder.Encode(data);
    bitmap.Save(outputPath);
}

IronBarcode 方法:

using IronBarCode;

public void GenerateQrCode(string data, string outputPath)
{
    BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
        .SaveAsPng(outputPath);
}

建立Code 128和其他1D條碼時,相同的靜態模式適用於不同的編碼常數:

// Code 128
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("code128.png");

// EAN-13
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("ean13.png");

更新目標框架

一旦移除了MessagingToolkit.Barcode並替換了所有引用,可以更新專案文件目標框架。 這一變化曾被舊依賴項阻止,移除後變得可能:

MessagingToolkit.Barcode方法(專案文件):

<PropertyGroup>
  <TargetFramework>net472</TargetFramework>
</PropertyGroup>
XML

IronBarcode方法(專案文件):

<PropertyGroup>
  <TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
XML

IronBarcode支援.NET Framework 4.6.2到.NET 9,因此在框架升級完成之前可以提前安裝。 這允許分步遷移:與MessagingToolkit.Barcode一起安裝IronBarcode,替換所有使用,驗證新程式碼,移除舊程式包,最後更改目標框架。

從PDF文件中讀取條碼

MessagingToolkit.Barcode不支援PDF。 從PDF中讀取條碼需通過單獨的程式庫從每頁提取圖像後才能調用條碼解碼器。 IronBarcode通過與影像相同的方法直接讀取PDF文件。

MessagingToolkit.Barcode方法:

// Not supported — required external PDF page extraction before decode
//否equivalent exists in MessagingToolkit.Barcode
C#

IronBarcode 方法:

using IronBarCode;

// Read all barcodes from every page of a PDF document
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}

處理掃描文件、運輸清單或多頁發票批次的應用在遷移過程中獲得了這一功能,而無需新增新程式庫或配置。

MessagingToolkit.Barcode API到IronBarcode映射參考

MessagingToolkit.BarcodeIronBarcode注意事項
new BarcodeDecoder()靜態——BarcodeReader.Read()不需要實例
barcodeReader.Decode(bitmap)BarcodeReader.Read(path)接受路徑、流、位元組陣列或PDF
result.Textresult.Value屬性已重命名
result.BarcodeFormatresult.Format屬性重命名; enum型別是BarcodeEncoding
new BarcodeEncoder()靜態——BarcodeWriter.CreateBarcode()不需要實例
barcodeWriter.Format = BarcodeFormat.QrCodeBarcodeEncoding.QRCode(參數)格式以參數形式傳遞,而非屬性
BitmapBarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)返回流暢結果,而不是Bitmap
bitmap.Save("path.png").SaveAsPng("path.png")結果物件上的流暢方法
BarcodeFormat.QrCodeBarcodeEncoding.QRCodeenum命名空間和值重命名
BarcodeFormat.Code128BarcodeEncoding.Code128相同的符號名稱,不同的命名空間
BarcodeFormat.Ean13BarcodeEncoding.EAN13大小寫不同
未找到時返回null返回空集合檢查.FirstOrDefault()
僅限Bitmap輸入路徑、流、位元組陣列、PDF不需要System.Drawing
僅限.NET Framework 3.5–4.5.NET 4.6.2到.NET 9完全支持現代.NET

常見遷移問題及解決方案

問題1:更新包後找不到命名空間

**問題:**移除CS0246: The type or namespace name 'BarcodeDecoder' could not be found

**解決方案:**必須在每個引用舊程式庫的文件中用using MessagingToolkit.Barcode;。 全專案範圍搜索舊命名空間字串將定位所有受影響的文件:

grep -r "using MessagingToolkit.Barcode" --include="*.cs" .
grep -r "BarcodeDecoder\|BarcodeEncoder" --include="*.cs" .
SHELL

問題2:條碼讀取器在命名空間之間的歧義

**問題:**如果專案在分步遷移期間同時引用BarcodeReader可能會在這兩個命名空間之間不明確。

**解決方案:**在過渡期間顯式限定引用:

// Use the fully qualified name while both packages are installed
var results = IronBarCode.BarcodeReader.Read("barcode.png");

一旦替換了所有對MessagingToolkit.Barcode的引用並移除了舊的程式包,限定詞可以被刪除,using IronBarCode;指令就足夠了。

問題3:移除程式包後目標框架仍設置為net472

**問題:**移除MessagingToolkit.Barcode並安裝IronBarcode後,專案文件仍然以net472為目標。 構建警告表明現代.NET API不可用。

**解決方案:**在一旦移除依賴項後更新.csproj文件中。 IronBarcode同時支持net472(通過.NET Framework 4.6.2相容性)和現代目標。 更改為net8.0需要驗證專案中沒有其他遺留依賴項剩留:

<!-- Update this line in the .csproj file -->
<TargetFramework>net8.0</TargetFramework>
XML

在更改後運行dotnet build以識別任何需要解決的其餘遺留依賴項。

MessagingToolkit.Barcode遷移清單

遷移前任務

審核程式碼庫以識別所有引用MessagingToolkit.Barcode的地方:

# Find all using statements
grep -r "using MessagingToolkit.Barcode" --include="*.cs" .

# Find decoder instantiations
grep -r "BarcodeDecoder" --include="*.cs" .

# Find encoder instantiations
grep -r "BarcodeEncoder" --include="*.cs" .

# Find decode calls
grep -r "\.Decode(" --include="*.cs" .

# Find encode calls
grep -r "\.Encode(" --include="*.cs" .

# Find project file references
grep -r "MessagingToolkit" --include="*.csproj" .
grep -r "MessagingToolkit" --include="packages.config" .
SHELL

紀錄所有需要更改的文件。 註記任何用System.Drawing.Bitmap作為解碼器輸入的地方——這些用法也需要更新。

程式碼更新任務

  1. 運行dotnet remove package MessagingToolkit.Barcode以移除程式包
  2. 運行dotnet add package IronBarcode以安裝IronBarcode
  3. 在應用啟動時新增IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
  4. 將所有using IronBarCode;
  5. 將所有BarcodeReader.Read()靜態調用
  6. 將所有BarcodeWriter.CreateBarcode()靜態調用
  7. 更新所有result.Value
  8. 更新所有result.Format
  9. 更新所有barcodeWriter.Format = BarcodeFormat.X模式以通過參數傳遞編碼
  10. .SaveAsPng()或IronBarcode結果上的適當輸出方法
  11. 移除using System.Drawing;匯入如果只是為了MessagingToolkit的Bitmap輸入
  12. 如果框架升級是遷移的一部分,更新專案文件中的<TargetFramework>

遷移後測試

  • 驗證dotnet build完成且沒有錯誤和沒有引用MessagingToolkit
  • 運行grep -r "MessagingToolkit" --include="*.cs" .並確認零結果
  • 使用應用的真實條碼圖像測試條碼閱讀並確認.Value返回所需的字串
  • 使用多條碼圖像測試條碼閱讀並確認集合中的所有條碼均被返回
  • 測試條碼生成並驗證輸出文件是否符合所需格式和編碼
  • 如果使用PDF閱讀,請使用代表性PDF文件測試並驗證頁碼元數是否正確
  • 如果改變了目標框架,在新的運行時上運行完整測試套件以識別任何其他相容性問題

遷移到IronBarcode的主要優勢

**解除框架升級阻礙:**一旦MessagingToolkit.Barcode被移除,專案文件的目標框架可以更新為任何現代.NET版本。 這一單一變更允許存取.NET 8性能改進、C# 12語言特性、本地異步模式以及需要.NET Standard 2.0或更晚版本的完整NuGet程式包生態系統。

**跨平台部署:**IronBarcode的內部影像管道不依賴於System.Drawing,這在.NET 6及以後的版本中僅限於Windows。 遷移後,應用程式可部署到Linux伺服器、macOS開發環境、Docker容器和雲函式運行時,而不會遇到條碼程式庫中的PlatformNotSupportedException

**解決的合規性發現:**IronBarcode透過記錄的維護過程定期接收安全更新。 將被放棄的依賴項替換為主動維護的依賴項解決了PCI DSS、HIPAA、SOC 2和類似框架下要求對第三方程式庫進行主動補丁管理的審核結果。

本地PDF支援:BarcodeReader.Read()直接接受PDF文件路徑,消除了在條碼解碼前需要單獨進行PDF影像提取步驟的必要。 處理掃描文件或發票批次的應用從此能力中獲益而無需新增新程式庫或管道階段。

**擴展的輸出選項:**生成的條碼可以通過BarcodeWriter.CreateBarcode()回傳的流暢結果物件以PNG、JPEG、SVG、PDF或base64編碼字串形式提供。 這替代了MessagingToolkit.Barcode的System.Drawing.Bitmap回傳型別,去除了僅限於Windows的輸出限制,及使得可直接嵌入網路回應或資料庫儲存。

請注意: MessagingToolkit和ZXing.NET是其各自擁有者的註冊商標。 此網站非MessagingToolkit或ZXing.NET認可、贊助或以任何方式與之相關聯。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開可用的資訊。
Curtis Chau
技術作家

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

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費即時演示
Booking Badge

全球數百萬工程師信賴

Iron Software的客戶標誌
獲取您的無義務諮詢
完成下方表單或發送電子郵件至sales@ironsoftware.com
您的詳細資訊將始終保密。
全球數百萬工程師信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立