跳至页脚内容
USING IRONBARCODE

C# USB BarCode 扫描器:完整的 IronBarcode 集成指南

USB条形码扫描器可作为键盘输入设备,自动将扫描数据发送到C#应用程序。 IronBarcode处理此输入以验证格式、提取结构化数据并生成新的条形码,从而为库存管理系统创建完整的扫描解决方案,且部署复杂性极低。

零售、仓储和库存管理操作都依赖于高效的条形码扫描。 借助IronBarcode及其有效的验证和生成功能,开发人员可以构建可靠的 USB 条形码扫描器应用程序,这些应用程序的功能不仅限于简单的数据采集。 该库可以验证条形码数据提取结构化信息,并即时生成新的条形码

本指南演示如何在 C# 中将 USB 条形码扫描器与IronBarcode集成。 最终成果是一个可与.NET Framework 和 .NET 应用程序配合使用的实时扫描解决方案,可帮助团队高效地管理库存和跟踪物品。 无论是构建销售点系统还是企业库存管理解决方案,IronBarcode 的跨平台兼容性都能确保应用程序在WindowsLinuxmacOS上流畅运行。

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提供出色的跨平台支持,具备AndroidiOS 功能。 然后通过 NuGet 包管理器控制台安装 IronBarcode

Install-Package BarCode

对于容器化部署, IronBarcode 可与 Docker 无缝协作,为企业环境提供部署清单。

快速入门:在 C# 中创建二维码图像

创建二维码会生成一个可视化的图像,将数据编码成可扫描的方块:

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronBarcode

    PM > Install-Package BarCode

  2. 复制并运行这段代码。

    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");
  3. 部署到您的生产环境中进行测试

    立即开始在您的项目中使用 IronBarcode,免费试用!
    arrow pointer

应用程序应该包含哪些命名空间?

请将以下必要的命名空间添加到表单中,并参考文档中的示例:

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 128EAN-13Code 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 的生成功能支持从各种数据类型创建条形码。 将条形码导出为图像PDFHTML

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 LambdaAzure Functions提供了出色的支持,从而能够大规模地进行无服务器条形码处理。 该库与Docker 容器无缝集成,可用于微服务架构。

在实施企业库存系统时,请考虑以下架构模式:

1.微服务:使用Docker 上的 IronBarcode将扫描功能部署为独立服务。 2.移动集成:扩展到支持AndroidiOS 的设备

  1. 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 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。