USING IRONBARCODE C# USB BarCode 扫描器:完整的 IronBarcode 集成指南 Jordi Bardia 已发布:2026年1月21日 下载 IronBarcode NuGet 下载 DLL 下载 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 USB条形码扫描器可作为键盘输入设备,自动将扫描数据发送到C#应用程序。 IronBarcode处理此输入以验证格式、提取结构化数据并生成新的条形码,从而为库存管理系统创建完整的扫描解决方案,且部署复杂性极低。 零售、仓储和库存管理操作都依赖于高效的条形码扫描。 借助IronBarcode及其有效的验证和生成功能,开发人员可以构建可靠的 USB 条形码扫描器应用程序,这些应用程序的功能不仅限于简单的数据采集。 该库可以验证条形码数据,提取结构化信息,并即时生成新的条形码。 本指南演示如何在 C# 中将 USB 条形码扫描器与IronBarcode集成。 最终成果是一个可与.NET Framework 和 .NET 应用程序配合使用的实时扫描解决方案,可帮助团队高效地管理库存和跟踪物品。 无论是构建销售点系统还是企业库存管理解决方案,IronBarcode 的跨平台兼容性都能确保应用程序在Windows 、 Linux或macOS上流畅运行。 USB条码扫描仪如何与IronBarcode一起工作? 为什么键盘楔形模式对集成很重要? 大多数 USB 条形码扫描器以 HID 键盘楔形模式运行,模拟键盘输入,从而轻松扫描条形码。 扫描条形码时,扫描器会"输入"数据,然后按 Enter 键。 IronBarcode 通过验证格式、提取结构化数据以及响应扫描立即生成条形码来改进这种原始输入。 了解不同的扫描仪通信模式有助于企业应用。 专业扫描仪除了键盘楔形模式外,还支持串行通信和直接 USB HID 模式: // Example: Handling different scanner input modes public interface IScannerInput { event EventHandler<string> BarcodeScanned; void StartListening(); void StopListening(); } // Keyboard wedge implementation public class KeyboardWedgeScanner : IScannerInput { public event EventHandler<string> BarcodeScanned; private readonly TextBox _inputBox; public KeyboardWedgeScanner(TextBox inputBox) { _inputBox = inputBox; _inputBox.KeyPress += OnKeyPress; } private void OnKeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { BarcodeScanned?.Invoke(this, _inputBox.Text); _inputBox.Clear(); } } public void StartListening() => _inputBox.Focus(); public void StopListening() => _inputBox.Enabled = false; } // Serial port implementation for professional scanners public class SerialPortScanner : IScannerInput { public event EventHandler<string> BarcodeScanned; private System.IO.Ports.SerialPort _port; public SerialPortScanner(string portName, int baudRate = 9600) { _port = new System.IO.Ports.SerialPort(portName, baudRate); _port.DataReceived += OnDataReceived; } private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string data = _port.ReadLine().Trim(); BarcodeScanned?.Invoke(this, data); } public void StartListening() => _port.Open(); public void StopListening() => _port.Close(); } // Example: Handling different scanner input modes public interface IScannerInput { event EventHandler<string> BarcodeScanned; void StartListening(); void StopListening(); } // Keyboard wedge implementation public class KeyboardWedgeScanner : IScannerInput { public event EventHandler<string> BarcodeScanned; private readonly TextBox _inputBox; public KeyboardWedgeScanner(TextBox inputBox) { _inputBox = inputBox; _inputBox.KeyPress += OnKeyPress; } private void OnKeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { BarcodeScanned?.Invoke(this, _inputBox.Text); _inputBox.Clear(); } } public void StartListening() => _inputBox.Focus(); public void StopListening() => _inputBox.Enabled = false; } // Serial port implementation for professional scanners public class SerialPortScanner : IScannerInput { public event EventHandler<string> BarcodeScanned; private System.IO.Ports.SerialPort _port; public SerialPortScanner(string portName, int baudRate = 9600) { _port = new System.IO.Ports.SerialPort(portName, baudRate); _port.DataReceived += OnDataReceived; } private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { string data = _port.ReadLine().Trim(); BarcodeScanned?.Invoke(this, data); } public void StartListening() => _port.Open(); public void StopListening() => _port.Close(); } Imports System Imports System.Windows.Forms Imports System.IO.Ports ' Example: Handling different scanner input modes Public Interface IScannerInput Event BarcodeScanned As EventHandler(Of String) Sub StartListening() Sub StopListening() End Interface ' Keyboard wedge implementation Public Class KeyboardWedgeScanner Implements IScannerInput Public Event BarcodeScanned As EventHandler(Of String) Implements IScannerInput.BarcodeScanned Private ReadOnly _inputBox As TextBox Public Sub New(inputBox As TextBox) _inputBox = inputBox AddHandler _inputBox.KeyPress, AddressOf OnKeyPress End Sub Private Sub OnKeyPress(sender As Object, e As KeyPressEventArgs) If e.KeyChar = ChrW(Keys.Enter) Then RaiseEvent BarcodeScanned(Me, _inputBox.Text) _inputBox.Clear() End If End Sub Public Sub StartListening() Implements IScannerInput.StartListening _inputBox.Focus() End Sub Public Sub StopListening() Implements IScannerInput.StopListening _inputBox.Enabled = False End Sub End Class ' Serial port implementation for professional scanners Public Class SerialPortScanner Implements IScannerInput Public Event BarcodeScanned As EventHandler(Of String) Implements IScannerInput.BarcodeScanned Private _port As SerialPort Public Sub New(portName As String, Optional baudRate As Integer = 9600) _port = New SerialPort(portName, baudRate) AddHandler _port.DataReceived, AddressOf OnDataReceived End Sub Private Sub OnDataReceived(sender As Object, e As SerialDataReceivedEventArgs) Dim data As String = _port.ReadLine().Trim() RaiseEvent BarcodeScanned(Me, data) End Sub Public Sub StartListening() Implements IScannerInput.StartListening _port.Open() End Sub Public Sub StopListening() Implements IScannerInput.StopListening _port.Close() End Sub End Class $vbLabelText $csharpLabel 开发人员如何捕获和验证扫描仪输入? // Capture scanner input and validate with IronBarcode private async void ProcessScannerInput(string scannedData) { try { // Validate the scanned data format var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128); var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap()); if (results.Any()) { var result = results.First(); // Extract metadata for enterprise systems var scanMetadata = new ScanMetadata { BarcodeType = result.BarcodeType, Value = result.Value, Confidence = result.Confidence, ScanTimestamp = DateTime.UtcNow, ScannerDevice = GetCurrentScannerInfo() }; await ProcessValidBarcode(scanMetadata); } else { HandleInvalidScan(scannedData); } } catch (Exception ex) { LogScanError(ex, scannedData); } } // Capture scanner input and validate with IronBarcode private async void ProcessScannerInput(string scannedData) { try { // Validate the scanned data format var validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128); var results = await BarcodeReader.ReadAsync(validationBarcode.ToBitmap()); if (results.Any()) { var result = results.First(); // Extract metadata for enterprise systems var scanMetadata = new ScanMetadata { BarcodeType = result.BarcodeType, Value = result.Value, Confidence = result.Confidence, ScanTimestamp = DateTime.UtcNow, ScannerDevice = GetCurrentScannerInfo() }; await ProcessValidBarcode(scanMetadata); } else { HandleInvalidScan(scannedData); } } catch (Exception ex) { LogScanError(ex, scannedData); } } Imports System Imports System.Linq Imports System.Threading.Tasks Imports IronBarCode Private Async Sub ProcessScannerInput(scannedData As String) Try ' Validate the scanned data format Dim validationBarcode = BarcodeWriter.CreateBarcode(scannedData, BarcodeEncoding.Code128) Dim results = Await BarcodeReader.ReadAsync(validationBarcode.ToBitmap()) If results.Any() Then Dim result = results.First() ' Extract metadata for enterprise systems Dim scanMetadata As New ScanMetadata With { .BarcodeType = result.BarcodeType, .Value = result.Value, .Confidence = result.Confidence, .ScanTimestamp = DateTime.UtcNow, .ScannerDevice = GetCurrentScannerInfo() } Await ProcessValidBarcode(scanMetadata) Else HandleInvalidScan(scannedData) End If Catch ex As Exception LogScanError(ex, scannedData) End Try End Sub $vbLabelText $csharpLabel 这段代码通过各种方法捕获扫描器输入,并利用IronBarcode 的异步读取功能来验证扫描的数据,而不会阻塞 UI 线程。 置信度阈值功能确保生产环境中只处理高质量的扫描结果。 如何设置您的条码扫描仪项目? 有哪些必要的依赖项和配置? 首先,对于桌面场景,可以在 Visual Studio 中创建一个 Windows Forms 应用程序;对于基于 Web 的扫描应用程序,可以考虑使用Blazor 。 对于移动库存解决方案, .NET MAUI提供出色的跨平台支持,具备Android和iOS 功能。 然后通过 NuGet 包管理器控制台安装 IronBarcode : Install-Package BarCode 对于容器化部署, IronBarcode 可与 Docker 无缝协作,为企业环境提供部署清单。 快速入门:在 C# 中创建二维码图像 创建二维码会生成一个可视化的图像,将数据编码成可扫描的方块: 立即开始使用 NuGet 创建 PDF 文件: 使用 NuGet 包管理器安装 IronBarcode PM > Install-Package BarCode 复制并运行这段代码。 using IronBarCode; // Generate QR code from scanned inventory data string inventoryCode = "INV-2025-001"; var qrCode = BarcodeWriter.CreateQrCode(inventoryCode); // Apply styling for professional labels qrCode.ResizeTo(300, 300); qrCode.SetMargins(10); qrCode.ChangeQrCodeColor(IronSoftware.Drawing.Color.DarkBlue); // Add logo for branding qrCode.AddLogoToQrCode("company_logo.png", 60, 60); // Save as high-quality image qrCode.SaveAsPng("inventory_qr.png"); // Alternative: Save as PDF for printing qrCode.SaveAsPdf("inventory_qr.pdf"); 部署到您的生产环境中进行测试 立即开始在您的项目中使用 IronBarcode,免费试用! 免费试用30天 应用程序应该包含哪些命名空间? 请将以下必要的命名空间添加到表单中,并参考文档中的示例: using IronBarCode; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.IO.Ports; // For serial scanners using System.Diagnostics; // For performance monitoring using IronBarCode; using System.Drawing; using System.Linq; using System.Threading.Tasks; using System.IO.Ports; // For serial scanners using System.Diagnostics; // For performance monitoring Imports IronBarCode Imports System.Drawing Imports System.Linq Imports System.Threading.Tasks Imports System.IO.Ports ' For serial scanners Imports System.Diagnostics ' For performance monitoring $vbLabelText $csharpLabel 开发人员应该如何配置扫描器输入表单? 企业应用受益于支持多种扫描仪品牌的灵活扫描仪配置系统: public class ScannerConfiguration { public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID" public string PortName { get; set; } // For serial scanners public int BaudRate { get; set; } = 9600; public string Terminator { get; set; } = "\r\n"; public bool EnableBeep { get; set; } = true; // Brand-specific settings public Dictionary<string, string> BrandSettings { get; set; } = new(); // Common scanner brand configurations public static ScannerConfiguration GetHoneywellConfig() { return new ScannerConfiguration { ScannerType = "Serial", BaudRate = 115200, BrandSettings = new Dictionary<string, string> { {"Prefix", "STX"}, {"Suffix", "ETX"}, {"TriggerMode", "Manual"} } }; } public static ScannerConfiguration GetSymbolConfig() { return new ScannerConfiguration { ScannerType = "KeyboardWedge", BrandSettings = new Dictionary<string, string> { {"ScanMode", "Continuous"}, {"BeepVolume", "High"} } }; } } public class ScannerConfiguration { public string ScannerType { get; set; } // "KeyboardWedge", "Serial", "USB-HID" public string PortName { get; set; } // For serial scanners public int BaudRate { get; set; } = 9600; public string Terminator { get; set; } = "\r\n"; public bool EnableBeep { get; set; } = true; // Brand-specific settings public Dictionary<string, string> BrandSettings { get; set; } = new(); // Common scanner brand configurations public static ScannerConfiguration GetHoneywellConfig() { return new ScannerConfiguration { ScannerType = "Serial", BaudRate = 115200, BrandSettings = new Dictionary<string, string> { {"Prefix", "STX"}, {"Suffix", "ETX"}, {"TriggerMode", "Manual"} } }; } public static ScannerConfiguration GetSymbolConfig() { return new ScannerConfiguration { ScannerType = "KeyboardWedge", BrandSettings = new Dictionary<string, string> { {"ScanMode", "Continuous"}, {"BeepVolume", "High"} } }; } } Option Strict On Public Class ScannerConfiguration Public Property ScannerType As String ' "KeyboardWedge", "Serial", "USB-HID" Public Property PortName As String ' For serial scanners Public Property BaudRate As Integer = 9600 Public Property Terminator As String = vbCrLf Public Property EnableBeep As Boolean = True ' Brand-specific settings Public Property BrandSettings As Dictionary(Of String, String) = New Dictionary(Of String, String)() ' Common scanner brand configurations Public Shared Function GetHoneywellConfig() As ScannerConfiguration Return New ScannerConfiguration With { .ScannerType = "Serial", .BaudRate = 115200, .BrandSettings = New Dictionary(Of String, String) From { {"Prefix", "STX"}, {"Suffix", "ETX"}, {"TriggerMode", "Manual"} } } End Function Public Shared Function GetSymbolConfig() As ScannerConfiguration Return New ScannerConfiguration With { .ScannerType = "KeyboardWedge", .BrandSettings = New Dictionary(Of String, String) From { {"ScanMode", "Continuous"}, {"BeepVolume", "High"} } } End Function End Class $vbLabelText $csharpLabel 如何使用IronBarcode验证扫描的条码? 条形码验证的最佳方法是什么? IronBarcode 擅长验证和解析多种格式的条形码数据。 该库支持Code 128 、 EAN-13和Code 39等一维条形码,以及QR 码和Data Matrix等二维格式。 以下是一种改进的验证方法: public class BarcodeValidator { private readonly Dictionary<BarcodeType, Func<string, bool>> _validators; public BarcodeValidator() { _validators = new Dictionary<BarcodeType, Func<string, bool>> { { BarcodeType.Code128, ValidateCode128 }, { BarcodeType.EAN13, ValidateEAN13 }, { BarcodeType.UPCA, ValidateUPCA }, { BarcodeType.QRCode, ValidateQRCode } }; } public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText) { var result = new ValidationResult(); try { // Attempt multiple barcode formats for flexibility var encodings = new[] { BarcodeEncoding.Code128, BarcodeEncoding.EAN13, BarcodeEncoding.UPCA, BarcodeEncoding.QRCode }; foreach (var encoding in encodings) { try { var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding); var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap()); if (validationResults.Any()) { var validated = validationResults.First(); result.IsValid = true; result.Format = validated.BarcodeType; result.Value = validated.Value; result.Confidence = validated.Confidence; // Apply format-specific validation if (_validators.ContainsKey(validated.BarcodeType)) { result.PassesBusinessRules = _validators___PROTECTED_LINK_35___; } break; } } catch { /* Try next format */ } } // Handle GS1-128 for supply chain applications if (!result.IsValid && IsGS1Format(scannedText)) { result = await ValidateGS1BarcodeAsync(scannedText); } } catch (Exception ex) { result.Error = ex.Message; } return result; } private bool ValidateEAN13(string value) { // EAN-13 checksum validation if (value.Length != 13) return false; int sum = 0; for (int i = 0; i < 12; i++) { int digit = int.Parse(value[i].ToString()); sum += (i % 2 == 0) ? digit : digit * 3; } int checkDigit = (10 - (sum % 10)) % 10; return checkDigit == int.Parse(value[12].ToString()); } } public class BarcodeValidator { private readonly Dictionary<BarcodeType, Func<string, bool>> _validators; public BarcodeValidator() { _validators = new Dictionary<BarcodeType, Func<string, bool>> { { BarcodeType.Code128, ValidateCode128 }, { BarcodeType.EAN13, ValidateEAN13 }, { BarcodeType.UPCA, ValidateUPCA }, { BarcodeType.QRCode, ValidateQRCode } }; } public async Task<ValidationResult> ValidateScannedBarcodeAsync(string scannedText) { var result = new ValidationResult(); try { // Attempt multiple barcode formats for flexibility var encodings = new[] { BarcodeEncoding.Code128, BarcodeEncoding.EAN13, BarcodeEncoding.UPCA, BarcodeEncoding.QRCode }; foreach (var encoding in encodings) { try { var barcode = BarcodeWriter.CreateBarcode(scannedText, encoding); var validationResults = await BarcodeReader.ReadAsync(barcode.ToBitmap()); if (validationResults.Any()) { var validated = validationResults.First(); result.IsValid = true; result.Format = validated.BarcodeType; result.Value = validated.Value; result.Confidence = validated.Confidence; // Apply format-specific validation if (_validators.ContainsKey(validated.BarcodeType)) { result.PassesBusinessRules = _validators___PROTECTED_LINK_35___; } break; } } catch { /* Try next format */ } } // Handle GS1-128 for supply chain applications if (!result.IsValid && IsGS1Format(scannedText)) { result = await ValidateGS1BarcodeAsync(scannedText); } } catch (Exception ex) { result.Error = ex.Message; } return result; } private bool ValidateEAN13(string value) { // EAN-13 checksum validation if (value.Length != 13) return false; int sum = 0; for (int i = 0; i < 12; i++) { int digit = int.Parse(value[i].ToString()); sum += (i % 2 == 0) ? digit : digit * 3; } int checkDigit = (10 - (sum % 10)) % 10; return checkDigit == int.Parse(value[12].ToString()); } } Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Threading.Tasks Public Class BarcodeValidator Private ReadOnly _validators As Dictionary(Of BarcodeType, Func(Of String, Boolean)) Public Sub New() _validators = New Dictionary(Of BarcodeType, Func(Of String, Boolean)) From { {BarcodeType.Code128, AddressOf ValidateCode128}, {BarcodeType.EAN13, AddressOf ValidateEAN13}, {BarcodeType.UPCA, AddressOf ValidateUPCA}, {BarcodeType.QRCode, AddressOf ValidateQRCode} } End Sub Public Async Function ValidateScannedBarcodeAsync(scannedText As String) As Task(Of ValidationResult) Dim result As New ValidationResult() Try ' Attempt multiple barcode formats for flexibility Dim encodings = {BarcodeEncoding.Code128, BarcodeEncoding.EAN13, BarcodeEncoding.UPCA, BarcodeEncoding.QRCode} For Each encoding In encodings Try Dim barcode = BarcodeWriter.CreateBarcode(scannedText, encoding) Dim validationResults = Await BarcodeReader.ReadAsync(barcode.ToBitmap()) If validationResults.Any() Then Dim validated = validationResults.First() result.IsValid = True result.Format = validated.BarcodeType result.Value = validated.Value result.Confidence = validated.Confidence ' Apply format-specific validation If _validators.ContainsKey(validated.BarcodeType) Then result.PassesBusinessRules = _validators(validated.BarcodeType).Invoke(validated.Value) End If Exit For End If Catch ' Try next format End Try Next ' Handle GS1-128 for supply chain applications If Not result.IsValid AndAlso IsGS1Format(scannedText) Then result = Await ValidateGS1BarcodeAsync(scannedText) End If Catch ex As Exception result.Error = ex.Message End Try Return result End Function Private Function ValidateEAN13(value As String) As Boolean ' EAN-13 checksum validation If value.Length <> 13 Then Return False Dim sum As Integer = 0 For i As Integer = 0 To 11 Dim digit As Integer = Integer.Parse(value(i).ToString()) sum += If(i Mod 2 = 0, digit, digit * 3) Next Dim checkDigit As Integer = (10 - (sum Mod 10)) Mod 10 Return checkDigit = Integer.Parse(value(12).ToString()) End Function End Class $vbLabelText $csharpLabel 对于多页文档,IronBarcode 可以读取 PDF和多页 TIFF 文件中的条形码。 应用程序可以验证哪些条形码格式? 此验证方法支持所有主流的一维条形码格式和二维条形码格式。 对于特殊应用,IronBarcode 还支持供应链管理中常用的MSI 条码和GS1-128格式。 如何从扫描的输入生成响应条码? 应用程序何时应该根据扫描数据创建新的条形码? 将扫描数据转换为可用于标签、跟踪或库存管理的新条形码,并具备生产就绪功能。 IronBarcode 的生成功能支持从各种数据类型创建条形码。 将条形码导出为图像、 PDF 、 HTML或流: public class InventoryBarcodeGenerator { private readonly string _labelPath = "labels"; public InventoryBarcodeGenerator() { // Ensure proper licensing for production use IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; System.IO.Directory.CreateDirectory(_labelPath); } public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action) { try { // Generate structured inventory code var inventoryCode = GenerateStructuredCode(productCode, action); // Create high-quality barcode with production settings var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128); // Apply enterprise styling barcode.ResizeTo(400, 120); barcode.SetMargins(10); barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12); barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black); // Add data matrix for redundancy in warehouse environments var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix); dataMatrix.ResizeTo(100, 100); // Save with error handling var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss"); var fileName = $"{inventoryCode}_{timestamp}"; // Save as multiple formats for flexibility await Task.Run(() => { barcode.SaveAsPng($"{_labelPath}\\{fileName}.png"); barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf"); barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg"); }); return new GeneratedBarcode { Code = inventoryCode, LinearBarcodePath = $"{_labelPath}\\{fileName}.png", DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png", Timestamp = DateTime.UtcNow }; } catch (Exception ex) { throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex); } } private string GenerateStructuredCode(string productCode, InventoryAction action) { // Implement GS1 Application Identifiers for enterprise compatibility var ai = action switch { InventoryAction.Receive => "10", // Batch/Lot number InventoryAction.Ship => "400", // Customer purchase order InventoryAction.Count => "37", // Quantity _ => "91" // Internal use }; return $"({ai}){DateTime.Now:yyMMdd}{productCode}"; } } public class InventoryBarcodeGenerator { private readonly string _labelPath = "labels"; public InventoryBarcodeGenerator() { // Ensure proper licensing for production use IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; System.IO.Directory.CreateDirectory(_labelPath); } public async Task<GeneratedBarcode> GenerateInventoryLabelAsync(string productCode, InventoryAction action) { try { // Generate structured inventory code var inventoryCode = GenerateStructuredCode(productCode, action); // Create high-quality barcode with production settings var barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128); // Apply enterprise styling barcode.ResizeTo(400, 120); barcode.SetMargins(10); barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12); barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black); // Add data matrix for redundancy in warehouse environments var dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix); dataMatrix.ResizeTo(100, 100); // Save with error handling var timestamp = DateTime.Now.ToString("yyyyMMddHHmmss"); var fileName = $"{inventoryCode}_{timestamp}"; // Save as multiple formats for flexibility await Task.Run(() => { barcode.SaveAsPng($"{_labelPath}\\{fileName}.png"); barcode.SaveAsPdf($"{_labelPath}\\{fileName}.pdf"); barcode.SaveAsSvg($"{_labelPath}\\{fileName}.svg"); }); return new GeneratedBarcode { Code = inventoryCode, LinearBarcodePath = $"{_labelPath}\\{fileName}.png", DataMatrixPath = $"{_labelPath}\\{fileName}_dm.png", Timestamp = DateTime.UtcNow }; } catch (Exception ex) { throw new BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex); } } private string GenerateStructuredCode(string productCode, InventoryAction action) { // Implement GS1 Application Identifiers for enterprise compatibility var ai = action switch { InventoryAction.Receive => "10", // Batch/Lot number InventoryAction.Ship => "400", // Customer purchase order InventoryAction.Count => "37", // Quantity _ => "91" // Internal use }; return $"({ai}){DateTime.Now:yyMMdd}{productCode}"; } } Imports System Imports System.IO Imports System.Threading.Tasks Imports IronBarCode Public Class InventoryBarcodeGenerator Private ReadOnly _labelPath As String = "labels" Public Sub New() ' Ensure proper licensing for production use IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" Directory.CreateDirectory(_labelPath) End Sub Public Async Function GenerateInventoryLabelAsync(productCode As String, action As InventoryAction) As Task(Of GeneratedBarcode) Try ' Generate structured inventory code Dim inventoryCode = GenerateStructuredCode(productCode, action) ' Create high-quality barcode with production settings Dim barcode = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.Code128) ' Apply enterprise styling barcode.ResizeTo(400, 120) barcode.SetMargins(10) barcode.AddAnnotationTextAboveBarcode(inventoryCode, IronSoftware.Drawing.Font.Arial, 12) barcode.ChangeBarCodeColor(IronSoftware.Drawing.Color.Black) ' Add data matrix for redundancy in warehouse environments Dim dataMatrix = BarcodeWriter.CreateBarcode(inventoryCode, BarcodeEncoding.DataMatrix) dataMatrix.ResizeTo(100, 100) ' Save with error handling Dim timestamp = DateTime.Now.ToString("yyyyMMddHHmmss") Dim fileName = $"{inventoryCode}_{timestamp}" ' Save as multiple formats for flexibility Await Task.Run(Sub() barcode.SaveAsPng($"{_labelPath}\{fileName}.png") barcode.SaveAsPdf($"{_labelPath}\{fileName}.pdf") barcode.SaveAsSvg($"{_labelPath}\{fileName}.svg") End Sub) Return New GeneratedBarcode With { .Code = inventoryCode, .LinearBarcodePath = $"{_labelPath}\{fileName}.png", .DataMatrixPath = $"{_labelPath}\{fileName}_dm.png", .Timestamp = DateTime.UtcNow } Catch ex As Exception Throw New BarcodeGenerationException($"Failed to generate barcode for {productCode}", ex) End Try End Function Private Function GenerateStructuredCode(productCode As String, action As InventoryAction) As String ' Implement GS1 Application Identifiers for enterprise compatibility Dim ai As String = action Select Case action Case InventoryAction.Receive ai = "10" ' Batch/Lot number Case InventoryAction.Ship ai = "400" ' Customer purchase order Case InventoryAction.Count ai = "37" ' Quantity Case Else ai = "91" ' Internal use End Select Return $"({ai}){DateTime.Now:yyMMdd}{productCode}" End Function End Class $vbLabelText $csharpLabel 对于特殊需求,开发人员可以创建 1-BPP 条形码图像以进行高对比度打印,或在现有 PDF 上盖章条形码。 生成的条形码有哪些自定义选项? IronBarcode 提供丰富的自定义选项,包括颜色更改、边距设置以及带有徽标嵌入的二维码样式。 ![Windows Forms 应用程序界面,演示 IronBarcode 的双条形码生成功能。 界面显示已成功生成库存编号为"INV-20250917-helloworld"的 Code 128 线性条形码和二维码。 顶部的输入字段允许用户输入自定义库存代码,并有一个"生成"按钮来创建条形码。 成功消息"项目处理成功 - 已生成标签"确认操作已完成。 Code 128 条码被标记为主要的库存跟踪格式,而下方的二维码则被标记为移动友好型替代方案。该应用程序采用专业的灰色背景和清晰的视觉层次结构,展示了 IronBarcode 如何帮助开发人员创建多格式条码生成系统,以实现完整的库存管理。 如何构建完整的条码扫描应用程序? 生产就绪的扫描仪实施方案是什么样的? 这是一个企业级实现,具有完整的错误处理和性能优化功能。 这种方法利用IronBarcode 的性能特性和异步功能来提高吞吐量: using IronBarCode; using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace EnterpriseBarcodeScanner { public partial class HighVolumeScanner : Form { private readonly ConcurrentQueue<ScanData> _scanQueue = new(); private readonly SemaphoreSlim _processingSemaphore; private readonly CancellationTokenSource _cancellationTokenSource = new(); private IScannerInput _activeScanner; private int _maxConcurrentProcessing = Environment.ProcessorCount; public HighVolumeScanner() { InitializeComponent(); _processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing); InitializeScanner(); StartProcessingQueue(); } private void InitializeScanner() { // Auto-detect scanner type if (SerialPort.GetPortNames().Any(p => p.Contains("COM"))) { _activeScanner = new SerialPortScanner("COM3", 115200); } else { _activeScanner = new KeyboardWedgeScanner(txtScanner); } _activeScanner.BarcodeScanned += OnBarcodeScanned; _activeScanner.StartListening(); } private void OnBarcodeScanned(object sender, string barcode) { // Queue for async processing to maintain scanner responsiveness _scanQueue.Enqueue(new ScanData { RawData = barcode, ScanTime = DateTime.UtcNow }); } private async void StartProcessingQueue() { while (!_cancellationTokenSource.Token.IsCancellationRequested) { if (_scanQueue.TryDequeue(out var scanData)) { await _processingSemaphore.WaitAsync(); _ = Task.Run(async () => { try { await ProcessScanAsync(scanData); } finally { _processingSemaphore.Release(); } }, _cancellationTokenSource.Token); } else { await Task.Delay(10); // Prevent CPU spinning } } } private async Task ProcessScanAsync(ScanData scanData) { try { // Validate with timeout for performance using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2)); var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData); var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token)); if (completedTask == validationTask) { var result = await validationTask; if (result.Success) { // Update UI thread-safe BeginInvoke(new Action(() => { AddToInventory(result); GenerateLabelsIfNeeded(result); })); } else { LogScanError(scanData, result.Error); } } else { LogScanTimeout(scanData); } } catch (Exception ex) { LogCriticalError(ex, scanData); } } private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData) { // Implement smart caching for repeated scans if (BarcodeCache.TryGetCached(rawData, out var cachedResult)) { return cachedResult; } // Use IronBarcode with optimized settings var barcodeOptions = new BarcodeReaderOptions { Speed = ReadingSpeed.Balanced, ExpectMultipleBarcodes = false, ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode, MaxParallelThreads = 1 // Single barcode, no need for parallel }; // Generate and validate var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128); var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions); var result = new ProcessingResult { Success = results.Any(), BarcodeData = results.FirstOrDefault(), ProcessingTime = DateTime.UtcNow }; BarcodeCache.Add(rawData, result); return result; } } } using IronBarCode; using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace EnterpriseBarcodeScanner { public partial class HighVolumeScanner : Form { private readonly ConcurrentQueue<ScanData> _scanQueue = new(); private readonly SemaphoreSlim _processingSemaphore; private readonly CancellationTokenSource _cancellationTokenSource = new(); private IScannerInput _activeScanner; private int _maxConcurrentProcessing = Environment.ProcessorCount; public HighVolumeScanner() { InitializeComponent(); _processingSemaphore = new SemaphoreSlim(_maxConcurrentProcessing); InitializeScanner(); StartProcessingQueue(); } private void InitializeScanner() { // Auto-detect scanner type if (SerialPort.GetPortNames().Any(p => p.Contains("COM"))) { _activeScanner = new SerialPortScanner("COM3", 115200); } else { _activeScanner = new KeyboardWedgeScanner(txtScanner); } _activeScanner.BarcodeScanned += OnBarcodeScanned; _activeScanner.StartListening(); } private void OnBarcodeScanned(object sender, string barcode) { // Queue for async processing to maintain scanner responsiveness _scanQueue.Enqueue(new ScanData { RawData = barcode, ScanTime = DateTime.UtcNow }); } private async void StartProcessingQueue() { while (!_cancellationTokenSource.Token.IsCancellationRequested) { if (_scanQueue.TryDequeue(out var scanData)) { await _processingSemaphore.WaitAsync(); _ = Task.Run(async () => { try { await ProcessScanAsync(scanData); } finally { _processingSemaphore.Release(); } }, _cancellationTokenSource.Token); } else { await Task.Delay(10); // Prevent CPU spinning } } } private async Task ProcessScanAsync(ScanData scanData) { try { // Validate with timeout for performance using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2)); var validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData); var completedTask = await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token)); if (completedTask == validationTask) { var result = await validationTask; if (result.Success) { // Update UI thread-safe BeginInvoke(new Action(() => { AddToInventory(result); GenerateLabelsIfNeeded(result); })); } else { LogScanError(scanData, result.Error); } } else { LogScanTimeout(scanData); } } catch (Exception ex) { LogCriticalError(ex, scanData); } } private async Task<ProcessingResult> ValidateAndProcessBarcodeAsync(string rawData) { // Implement smart caching for repeated scans if (BarcodeCache.TryGetCached(rawData, out var cachedResult)) { return cachedResult; } // Use IronBarcode with optimized settings var barcodeOptions = new BarcodeReaderOptions { Speed = ReadingSpeed.Balanced, ExpectMultipleBarcodes = false, ExpectBarcodeTypes = BarcodeEncoding.Code128 | BarcodeEncoding.QRCode, MaxParallelThreads = 1 // Single barcode, no need for parallel }; // Generate and validate var testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128); var results = await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions); var result = new ProcessingResult { Success = results.Any(), BarcodeData = results.FirstOrDefault(), ProcessingTime = DateTime.UtcNow }; BarcodeCache.Add(rawData, result); return result; } } } Imports IronBarCode Imports System Imports System.Collections.Concurrent Imports System.Threading Imports System.Threading.Tasks Imports System.Windows.Forms Namespace EnterpriseBarcodeScanner Partial Public Class HighVolumeScanner Inherits Form Private ReadOnly _scanQueue As New ConcurrentQueue(Of ScanData)() Private ReadOnly _processingSemaphore As SemaphoreSlim Private ReadOnly _cancellationTokenSource As New CancellationTokenSource() Private _activeScanner As IScannerInput Private _maxConcurrentProcessing As Integer = Environment.ProcessorCount Public Sub New() InitializeComponent() _processingSemaphore = New SemaphoreSlim(_maxConcurrentProcessing) InitializeScanner() StartProcessingQueue() End Sub Private Sub InitializeScanner() ' Auto-detect scanner type If SerialPort.GetPortNames().Any(Function(p) p.Contains("COM")) Then _activeScanner = New SerialPortScanner("COM3", 115200) Else _activeScanner = New KeyboardWedgeScanner(txtScanner) End If AddHandler _activeScanner.BarcodeScanned, AddressOf OnBarcodeScanned _activeScanner.StartListening() End Sub Private Sub OnBarcodeScanned(sender As Object, barcode As String) ' Queue for async processing to maintain scanner responsiveness _scanQueue.Enqueue(New ScanData With { .RawData = barcode, .ScanTime = DateTime.UtcNow }) End Sub Private Async Sub StartProcessingQueue() While Not _cancellationTokenSource.Token.IsCancellationRequested Dim scanData As ScanData = Nothing If _scanQueue.TryDequeue(scanData) Then Await _processingSemaphore.WaitAsync() _ = Task.Run(Async Function() Try Await ProcessScanAsync(scanData) Finally _processingSemaphore.Release() End Try End Function, _cancellationTokenSource.Token) Else Await Task.Delay(10) ' Prevent CPU spinning End If End While End Sub Private Async Function ProcessScanAsync(scanData As ScanData) As Task Try ' Validate with timeout for performance Using cts As New CancellationTokenSource(TimeSpan.FromSeconds(2)) Dim validationTask = ValidateAndProcessBarcodeAsync(scanData.RawData) Dim completedTask = Await Task.WhenAny(validationTask, Task.Delay(Timeout.Infinite, cts.Token)) If completedTask Is validationTask Then Dim result = Await validationTask If result.Success Then ' Update UI thread-safe BeginInvoke(New Action(Sub() AddToInventory(result) GenerateLabelsIfNeeded(result) End Sub)) Else LogScanError(scanData, result.Error) End If Else LogScanTimeout(scanData) End If End Using Catch ex As Exception LogCriticalError(ex, scanData) End Try End Function Private Async Function ValidateAndProcessBarcodeAsync(rawData As String) As Task(Of ProcessingResult) ' Implement smart caching for repeated scans Dim cachedResult As ProcessingResult = Nothing If BarcodeCache.TryGetCached(rawData, cachedResult) Then Return cachedResult End If ' Use IronBarcode with optimized settings Dim barcodeOptions As New BarcodeReaderOptions With { .Speed = ReadingSpeed.Balanced, .ExpectMultipleBarcodes = False, .ExpectBarcodeTypes = BarcodeEncoding.Code128 Or BarcodeEncoding.QRCode, .MaxParallelThreads = 1 ' Single barcode, no need for parallel } ' Generate and validate Dim testBarcode = BarcodeWriter.CreateBarcode(rawData, BarcodeEncoding.Code128) Dim results = Await BarcodeReader.ReadAsync(testBarcode.ToBitmap(), barcodeOptions) Dim result As New ProcessingResult With { .Success = results.Any(), .BarcodeData = results.FirstOrDefault(), .ProcessingTime = DateTime.UtcNow } BarcodeCache.Add(rawData, result) Return result End Function End Class End Namespace $vbLabelText $csharpLabel 为了提高性能,可以实施裁剪区域,将扫描重点放在特定的图像区域。 条形码阅读器设置允许针对不同文档类型进行微调。 团队如何实施备用机制? 这款企业级扫描应用程序实现了以下几个关键模式: 1.异步队列处理:使用异步操作防止 UI 阻塞 2.并发处理:使用多个线程进行并行验证 3.智能缓存:减少频繁项的冗余处理 4.性能监控:使用读取速度选项跟踪扫描速率 5.灵活的扫描仪支持:自动检测可用硬件 *无效格式:*捕获 BarcodeWriter 遇到不支持的数据时抛出的异常 扫描仪断开连接:实现文本框焦点管理以处理扫描仪移除操作 数据验证:使用 IronBarcode 的特定格式编码,以确保数据兼容性 条形码生成失败:**将条形码生成过程封装在 try-catch 块中。 *超时处理:考虑实现按键计时,以区分扫描仪输入和键盘输入。 ![专业 Windows Forms 条形码扫描器应用程序,展示了 IronBarcode 的实时库存跟踪功能。 界面采用简洁的双面板设计,搭配精致的深蓝色标题栏。 左侧面板显示扫描历史记录列表,其中显示了四个成功扫描的库存项目(INV-001 至 INV-004),并带有精确的时间戳和扫描状态指示器。 每个项目都包含详细的元数据,例如条形码类型和置信度。 右侧面板显示动态生成的摘要条形码,显示"商品数量:4",并具有专业的样式和适当的边距。 底部的操作按钮包括"清除列表"、"导出数据"和"打印标签",用于完整的库存管理。 状态栏显示"扫描仪:已连接" | 模式:连续 | 上次扫描时间:2 秒前,这展示了 IronBarcode 为生产库存系统提供的实时监控功能和专业的企业级设计。 条形码扫描器项目的下一步是什么? IronBarcode将简单的 USB 条码扫描转化为智能数据处理应用。 通过将硬件扫描器输入与 IronBarcode 的验证、生成和格式转换功能相结合,开发人员可以为任何行业构建可靠的扫描解决方案。 该库对异步操作和多线程的支持确保应用程序能够随着业务需求的增长而扩展。 对于云部署,IronBarcode 为AWS Lambda和Azure Functions提供了出色的支持,从而能够大规模地进行无服务器条形码处理。 该库与Docker 容器无缝集成,可用于微服务架构。 在实施企业库存系统时,请考虑以下架构模式: 1.微服务:使用Docker 上的 IronBarcode将扫描功能部署为独立服务。 2.移动集成:扩展到支持Android和iOS 的设备 Web 应用程序:构建基于浏览器的扫描功能,并集成 Blazor。 4.高可用性:通过多种读取方式实现冗余 立即开始免费试用,在 C# 应用程序中实现专业的条形码扫描功能。 如需相关功能,请探索IronOCR ,它具有文本识别功能,可与条形码扫描工作流程相辅相成。 常见问题解答 什么是 IronBarcode,它与 USB 条码扫描器有何关系? IronBarcode 是一个库,可以让开发人员构建用于 USB 条码扫描的强大 C# 应用程序。它提供如条码验证、数据提取和条码生成等功能。 IronBarcode 能否验证来自 USB 扫描器的条码数据? 是的,IronBarcode 可以验证从 USB 扫描器捕获的条码数据,确保 C# 应用程序中的数据完整性和准确性。 IronBarcode 如何处理条码生成? IronBarcode 可以实时生成新的条码,开发人员可以在其 C# 应用程序中轻松创建和打印条码。 IronBarcode 在 USB 条码扫描中是否支持错误处理? 是的,IronBarcode 包括全面的错误处理,可以管理 USB 条码扫描和处理过程中可能出现的常见问题。 IronBarcode 可以扫描哪些类型的条形码? IronBarcode 支持扫描广泛的条码符号体系,包括二维码、UPC、Code 39 等,使其适用于各种应用程序。 IronBarcode 能否从扫描的条码中提取结构化信息? 是的,IronBarcode 可以从扫描的条码中提取结构化信息,有助于高效的数据处理和管理。 如何开始在 C# 中构建 USB 条码扫描器应用程序? 要开始在 C# 中构建 USB 条码扫描器应用程序,您可以利用 IronBarcode 以及提供的代码示例和文档来指导您的开发过程。 Jordi Bardia 立即与工程团队聊天 软件工程师 Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。 相关文章 已更新2026年1月22日 ASP.NET 条码扫描器教程:C# BarCode 生成器指南 Learn how to Scan Barcodes in ASP.NET using IronBarcode 阅读更多 已发布2026年1月21日 C# 中的数据矩阵生成器:IronBarcode 完整指南 数据矩阵生成器C#教程。了解如何使用IronBarcode创建ECC200数据矩阵条形码。简单的2D条码生成代码示例。 阅读更多 已发布2026年1月21日 使用 IronBarcode 的 Xamarin 条码生成器创建专业品质的条码 Learn how to create professional-quality barcodes with the Xamarin Barcode Generator using IronBarcode. 阅读更多 ASP.NET 条码扫描器教程:C# BarCode 生成器指南使用 IronBarcode 的 Xamarin 条...
已更新2026年1月22日 ASP.NET 条码扫描器教程:C# BarCode 生成器指南 Learn how to Scan Barcodes in ASP.NET using IronBarcode 阅读更多
已发布2026年1月21日 C# 中的数据矩阵生成器:IronBarcode 完整指南 数据矩阵生成器C#教程。了解如何使用IronBarcode创建ECC200数据矩阵条形码。简单的2D条码生成代码示例。 阅读更多
已发布2026年1月21日 使用 IronBarcode 的 Xamarin 条码生成器创建专业品质的条码 Learn how to create professional-quality barcodes with the Xamarin Barcode Generator using IronBarcode. 阅读更多