IRONSOFTWAREHOME
视频

从MessagingToolkit.Barcode迁移到IronBarcode

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

MessagingToolkit.Barcode在2013年发布了其最终版本1.7.0.2,自那时起未收到任何更新。 本指南涵盖了迁移到IronBarcode的完整路径:迁移的必要性、代码中的更改以及如何验证迁移是否完成。 本指南既适用于单独迁移条形码功能的团队,也适用于进行更广泛的.NET Framework升级且 MessagingToolkit.Barcode 是阻塞性依赖项的团队。

为什么要从 MessagingToolkit.Barcode 迁移?

框架兼容性障碍: 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升级的先决条件,而不是可选的清理步骤。

**安全隐患:**距离上次代码更改已经过去了十二年。 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
布雷泽
跨平台(Linux、macOS)
Docker/容器支持
条形码读取输入类型仅限位图路径、流、字节数组、PDF
PDF条形码读取是的(母语)
每张图片包含多个条形码
自动格式检测
条形码生成输出格式仅限位图PNG、JPEG、SVG、PDF、字节数组
系统绘图依赖项要求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:更新命名空间

用IronBarcode命名空间替换每个引用旧库的文件中的MessagingToolkit命名空间:

// 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.条形码方法:

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构造和对单个对象的空条件模式。 BarcodeReader.Read()返回一个集合 —— 当未找到任何内容时,一个空集合 —— 因此.FirstOrDefault()替代了旧单结果返回值的空检查。

从结果中获取格式信息

MessagingToolkit.Barcode通过result.BarcodeFormat公开检测到的格式。 IronBarcode通过result.Format公开它。 两者都是结果对象上的枚举值,但枚举类型名称不同。

MessagingToolkit.条形码方法:

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。 枚举类型从.Format.ToString()生成了一个可比较的人类可读字符串用于显示或日志记录。

生成条形码

MessagingToolkit.Barcode使用基于实例的.Encode()。 IronBarcode使用静态方法,并将编码类型作为参数。

MessagingToolkit.条形码方法:

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 和其他一维条形码时,采用相同的静态模式,但编码常量不同:

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

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

更新目标框架

一旦 MessagingToolkit.Barcode 被移除并且所有引用都被替换,就可以更新项目文件目标框架。 此更改之前受制于旧的依赖项,移除后即可实现:

MessagingToolkit.条形码方法(项目文件):

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

IronBarcode方案(项目文件):

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

IronBarcode支持.NET Framework 4.6.2 至.NET 9,因此可以在框架升级完成之前进行安装。 这样就可以分阶段进行迁移:将IronBarcode与 MessagingToolkit.Barcode 一起安装,替换所有用法,验证新代码,删除旧包,然后作为最后一步更改目标框架。

从PDF文档中读取条形码

MessagingToolkit.Barcode 不支持 PDF。 从 PDF 中读取条形码需要先通过单独的库从每一页中提取图像,然后再调用条形码解码器。 IronBarcode直接读取 PDF 文件,其方法与读取图像的方法相同。

MessagingToolkit.条形码方法:

// 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物业已更名; 枚举类型是BarcodeEncoding
new BarcodeEncoder()静态 — BarcodeWriter.CreateBarcode()无需实例
barcodeWriter.Format = BarcodeFormat.QrCodeBarcodeEncoding.QRCode(参数)作为参数传递的格式,而非属性
BitmapBarcodeWriter.CreateBarcode("data", BarcodeEncoding.QRCode)返回流畅的结果,而不是位图。
bitmap.Save("path.png").SaveAsPng("path.png")Fluent 方法在结果对象上
BarcodeFormat.QrCodeBarcodeEncoding.QRCode枚举命名空间和值已重命名
BarcodeFormat.Code128BarcodeEncoding.Code128相同的符号名称,不同的命名空间
BarcodeFormat.Ean13BarcodeEncoding.EAN13资本化方式不同
如果未找到,则返回 null。返回空集合检查.FirstOrDefault()
仅位图输入路径、流、字节数组、PDF无需系统图
仅限.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 IronBarCode;替换(注意大写C)。 在项目范围内搜索旧命名空间字符串,即可找到所有受影响的文件:

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.条形码迁移清单

迁移前任务

审核代码库,找出所有引用 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. bitmap.Save()
  11. 移除用于Bitmap输入到MessagingToolkit的地方的using System.Drawing;导入
  12. 如果迁移过程中进行框架升级,请更新项目文件中的<TargetFramework>

迁移后测试

  • 验证dotnet build完成且没有错误,并且没有引用MessagingToolkit
  • 运行grep -r "MessagingToolkit" --include="*.cs" .并确认无结果
  • 使用应用程序中的真实条形码图像测试条形码读取,并确认.Value返回预期的字符串
  • 使用多条形码图像测试条形码读取功能,并确认所有条形码均能被读取。
  • 测试条形码生成,并验证输出文件是否符合预期格式和编码。
  • 如果使用 PDF 阅读器,请使用具有代表性的 PDF 文档进行测试,并验证页码元数据是否正确。
  • 如果目标框架已更改,请在新运行时上运行完整的测试Suite,以识别任何其他兼容性问题。

迁移到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 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

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 天试用密钥
无需信用卡或创建账户