.NET MAUI를 사용하여 C#에서 바코드를 읽고 스캔하는 방법
BarcodeLib에서 IronBarcode로의 마이그레이션
이 가이드는 .NET 개발자를 위해 BarcodeLib에서IronBarcode로의 완벽한 마이그레이션 경로를 제공합니다. 이 문서에서는 팀이 이러한 전환을 하는 이유, 단계별 패키지 교체, 일반적인 바코드립 패턴에 대한 코드 마이그레이션 예제, 전체 API 매핑 참조 및 코드베이스 전체 마이그레이션 관리를 위한 구조화된 체크리스트를 다룹니다.
BarcodeLib에서 마이그레이션해야 하는 이유
BarcodeLib에서IronBarcode로 마이그레이션하는 팀들이 보고하는 주요 원인은 다음과 같습니다.
읽기 API 없음: BarcodeLib에는 읽기 또는 디코딩 기능이 포함되어 있지 않습니다. 바코드 이미지를 생성하는 프로젝트에서 업로드된 이미지, 창고 스캐너 또는 공급업체 문서에서 바코드를 스캔해야 하는 새로운 요구 사항이 발생할 경우, BarcodeLib은 이를 충족할 수 없습니다. 유일한 해결책은 ZXing .NET 과 같은 두 번째 라이브러리를 추가하는 것인데, 이는 BarcodeLib과 함께 유지 관리해야 할 두 번째 종속성 그래프와 두 번째 API 표면을 도입하는 결과를 초래합니다.
SkiaSharp 버전 충돌: 바코드립 3.x는 SkiaSharp을 System.Drawing.Common을 대체하는 그래픽 백엔드로 도입했습니다. 이 라이브러리는 특정 SkiaSharp 버전 범위에 고정됩니다. MAUI 프로젝트, Blazor 프로젝트, 그리고 다른 종속성에서도 SkiaSharp를 사용하는 모든 프로젝트에서, 최종 버전이 BarcodeLib에서 예상하는 범위를 벗어나는 경우가 자주 발생합니다. 이로 인해 복원 중에 NU1608 경고가 발생하고, 최악의 경우 장치에서 런타임 어셈블리 바인딩 오류가 발생할 수 있습니다.
PDF 미지원: 송장, 작업 지시서, 배송 명세서 등 바코드가 포함된 PDF 문서를 생성하는 애플리케이션은 후속 처리 과정에서 해당 바코드를 다시 읽어야 하는 경우가 있습니다. BarcodeLib은 바코드 이미지를 생성하지만 PDF를 지원하지 않습니다. BarcodeLib을 사용하여 PDF에서 바코드를 추출하려면 별도의 PDF 라이브러리를 사용하여 PDF 페이지를 이미지로 렌더링한 다음 해당 이미지를 별도의 읽기 라이브러리에 전달해야 합니다.
바이트 배열 출력에 대한 스트림 인코딩 단계: 바코드립 3.x는 SKImage을 반환하며, HTTP 응답, 데이터베이스 BLOB 열 및 대부분의 다운스트림 소비자가 실제로 필요한 byte[] 출력을 생성하기 위해 SkiaSharp를 MemoryStream으로 인코딩하는 단계가 필요합니다. IronBarcode는 생성 체인에서 .ToPngBinaryData()을 직접 제공하니다.
근본적인 문제
BarcodeLib의 생성 전용 아키텍처는 스캔 기능을 추가하려면 스택에 두 번째 라이브러리를 추가해야 함을 의미합니다.
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
// BarcodeLib: generation only — reading requires a completely separate library
using BarcodeStandard;
using SkiaSharp;
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100);
using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
// To read it back, a separate scanning library such as ZXing.Net is required —
// separate API, separate dependency graph to maintain alongside BarcodeLib.
Imports BarcodeStandard
Imports SkiaSharp
Dim b = New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, "PRODUCT-12345", 300, 100)
Using stream = File.OpenWrite("barcode.png")
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
IronBarcode는 동일한 패키지에서 동일한 using 구문으로 둘 다 처리합니다:
// IronBarcode: generation and reading — no second library needed
using IronBarCode;
// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("barcode.png");
// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result); // "PRODUCT-12345"
// IronBarcode: generation and reading — no second library needed
using IronBarCode;
// Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("barcode.png");
// Read back — same package, same namespace
var result = BarcodeReader.Read("barcode.png").First().Value;
Console.WriteLine(result); // "PRODUCT-12345"
Imports IronBarCode
' Generate
BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng("barcode.png")
' Read back — same package, same namespace
Dim result = BarcodeReader.Read("barcode.png").First().Value
Console.WriteLine(result) ' "PRODUCT-12345"
IronBarcode와 BarcodeLib의 기능 비교
| 기능 | 바코드립 | IronBarcode |
|---|---|---|
| 바코드 생성 | 예 | 예 |
| 바코드 판독/스캔 | 아니요 | 예 (BarcodeReader.Read()) |
| QR 코드 생성 | 아니요 (1D만) | 예 (고급 기능, 로고 삽입 포함) |
| PDF 바코드 읽기 | 아니요 | 예 (네이티브 앱이며, 추가 라이브러리가 필요하지 않습니다) |
| PDF 바코드 생성 출력 | 아니요 | 예 |
| SkiaSharp 종속성 | 예 (버전 충돌 위험 있음) | 아니요 |
| MAUI 프로젝트 호환성 | 분쟁 위험 (NU1608) | 충돌 없음 |
| Fluent 체인형 API | 아니요 | 예 |
byte[] 출력을 직접 제공합니다 |
수동 (via MemoryStream) |
.ToPngBinaryData() |
| 다중 바코드 감지 | 아니요 | 예 (ExpectMultipleBarcodes) |
| 읽기 속도 조정 | 해당 없음 | 예 (ReadingSpeed 열거형) |
| Linux/macOS 지원 | 부분적(SkiaSharp에 따라 다름) | 전체 |
| Docker/컨테이너 지원 | 구성 필요 | 예 |
| 활발한 유지보수 | 예 (커뮤니티) | 예 (상업용) |
| 상업적 지원 / 서비스 수준 계약(SLA) | 아니요 | 예 |
| 라이선스 | Apache 2.0 (무료) | $999–$5,999 영구 |
빠른 시작: BarcodeLib에서IronBarcode로 마이그레이션
이러한 기본 단계를 통해 즉시 이주를 시작할 수 있습니다.
1단계: NuGet 패키지 교체
BarcodeLib 패키지를 먼저 제거하십시오:
dotnet remove package BarcodeLib
dotnet remove package BarcodeLib
참조 방법을 모를 경우, .csproj 파일을 확인하세요:
grep -n "BarcodeLib" YourProject.csproj
grep -n "BarcodeLib" YourProject.csproj
모든 바코드립 관련 <PackageReference> 항목을 제거하세요. BarcodeLib의 NU1608 경고를 해결하기 위해 명시적인 <PackageReference Include="SkiaSharp"> 재정의를 추가한 경우, 이를 제거하세요. IronBarcode를 설치한 후 다른 이유로 SkiaSharp이 여전히 필요한지 평가하세요. 다음으로IronBarcode설치하세요.
dotnet add package IronBarcode
dotnet add package IronBarcode
단계 2: 네임스페이스 업데이트
각 파일에서 바코드립 using 디렉티브를 다음으로 대체하세요:
// Before
using BarcodeStandard;
using SkiaSharp;
// After
using IronBarCode;
// Before
using BarcodeStandard;
using SkiaSharp;
// After
using IronBarCode;
Imports IronBarCode
Imports SkiaSharp
단계 3: 라이선스 초기화
애플리케이션 시작 시 라이선스 초기화를 추가합니다:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
ASP.NET Core 애플리케이션의 경우, Program.cs 전에 builder.Build()을(를) 여기에 넣으세요. 콘솔 애플리케이션의 경우, Main()의 맨 위에 넣으세요. 다른 앱에서 호출되는 클래스 라이브러리의 경우, 호스트 애플리케이션이 시작되는 위치에서 초기화해야 합니다.
코드 마이그레이션 예제
기본 코드128 생성
가장 일반적인 바코드립 패턴: 인스턴스를 생성하고, 속성을 설정하고, Encode()을 호출합니다.
BarcodeLib 접근 방식:
using BarcodeStandard;
using SkiaSharp;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
using var stream = File.OpenWrite(outputPath);
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
using BarcodeStandard;
using SkiaSharp;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(Type.Code128, trackingNumber, 400, 120);
using var stream = File.OpenWrite(outputPath);
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
}
Imports BarcodeStandard
Imports SkiaSharp
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(Type.Code128, trackingNumber, 400, 120)
Using stream = File.OpenWrite(outputPath)
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
End Sub
IronBarcode 접근 방식:
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.AddAnnotationTextBelowBarcode(trackingNumber)
.SaveAsPng(outputPath);
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;
public void GenerateShippingLabel(string trackingNumber, string outputPath)
{
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.AddAnnotationTextBelowBarcode(trackingNumber)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateShippingLabel(trackingNumber As String, outputPath As String)
BarcodeWriter.CreateBarcode(trackingNumber, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.AddAnnotationTextBelowBarcode(trackingNumber) _
.SaveAsPng(outputPath)
End Sub
속성 설정 블록은 유연한 체인으로 축소됩니다. .AddAnnotationTextBelowBarcode()은 b.IncludeLabel = true을 대체합니다 — 이는 바 아래의 텍스트를 제어할 수 있도록 레이블 문자열을 명시적으로 받아들입니다. .ResizeTo()는 너비/높이 인수를 대체합니다. 고급 바코드 생성 옵션에 대해서는 IronBarcode 바코드 생성 설명서를 참조하십시오.
바이트 배열(byte[]) 반환 — 일반적인 웹 API 패턴
BarcodeLib 3.x는 SKImage을 반환합니다. 이것으로부터 바이트를 얻으려면 SkiaSharp을 통해 MemoryStream으로 인코딩해야 합니다. IronBarcode는 .ToPngBinaryData()을 직접 제공합니다.
BarcodeLib 접근 방식:
using BarcodeStandard;
using SkiaSharp;
using System.IO;
public byte[] GetBarcodeBytes(string data)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;
using System.IO;
public byte[] GetBarcodeBytes(string data)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
Public Function GetBarcodeBytes(data As String) As Byte()
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
End Function
IronBarcode 접근 방식:
using IronBarCode;
public byte[] GetBarcodeBytes(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
}
using IronBarCode;
public byte[] GetBarcodeBytes(string data)
{
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
}
Imports IronBarCode
Public Function GetBarcodeBytes(data As String) As Byte()
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
End Function
MemoryStream 중간 단계가 사라졌습니다. .ToPngBinaryData()는 byte[]을 직접 반환하며, 이는 HTTP 응답 본문, 데이터베이스 BLOB 열 및 파일 작성자가 실제로 원하는 것입니다.
웹 API 컨트롤러 액션
BarcodeLib 접근 방식:
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, sku, 400, 120);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return File(ms.ToArray(), "image/png");
}
}
using BarcodeStandard;
using SkiaSharp;
using Microsoft.AspNetCore.Mvc;
using System.IO;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
var b = new Barcode();
SKImage img = b.Encode(Type.Code128, sku, 400, 120);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return File(ms.ToArray(), "image/png");
}
}
Imports BarcodeStandard
Imports SkiaSharp
Imports Microsoft.AspNetCore.Mvc
Imports System.IO
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim b As New Barcode()
Dim img As SKImage = b.Encode(Type.Code128, sku, 400, 120)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return File(ms.ToArray(), "image/png")
End Using
End Function
End Class
IronBarcode 접근 방식:
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
using IronBarCode;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/labels")]
public class LabelsController : ControllerBase
{
[HttpGet("{sku}")]
public IActionResult GetLabel(string sku)
{
byte[] pngBytes = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.ToPngBinaryData();
return File(pngBytes, "image/png");
}
}
Imports IronBarCode
Imports Microsoft.AspNetCore.Mvc
<ApiController>
<Route("api/labels")>
Public Class LabelsController
Inherits ControllerBase
<HttpGet("{sku}")>
Public Function GetLabel(sku As String) As IActionResult
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(sku, BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.ToPngBinaryData()
Return File(pngBytes, "image/png")
End Function
End Class
컨트롤러 동작은 MemoryStream 블록 및 SkiaSharp 인코딩 단계를 제거함으로써 줄어듭니다. 바이트 배열은 .ToPngBinaryData()에서 File()으로 직접 전달됩니다.
QR 코드 생성
BarcodeLib 3.x는 QR 코드를 생성하지 않습니다 — BarcodeStandard.Type 열거형에는 2D 항목이 없습니다. BarcodeLib과 함께 QR이 필요한 프로젝트들은 QRCoder 같은 두 번째 라이브러리를 추가하는 것이 일반적이었습니다. IronBarcode는 로고 임베딩 및 스타일링을 위한 추가 옵션이 있는 전용 QRCodeWriter 클래스를 사용합니다.
BarcodeLib 접근 방식:
// 바코드립 has no QR Code (or any 2D) support.
// Generating a QR code from a 바코드립 project required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
// 바코드립 has no QR Code (or any 2D) support.
// Generating a QR code from a 바코드립 project required adding a
// second library such as QRCoder:
//
// using QRCoder;
// var qrGen = new QRCodeGenerator();
// var data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q);
// // ... separate API, separate dependency to maintain.
' 바코드립 has no QR Code (or any 2D) support.
' Generating a QR code from a 바코드립 project required adding a
' second library such as QRCoder:
'
' Imports QRCoder
' Dim qrGen As New QRCodeGenerator()
' Dim data = qrGen.CreateQrCode("https://example.com/product/42", QRCodeGenerator.ECCLevel.Q)
' ' ... separate API, separate dependency to maintain.
IronBarcode 접근 방식:
using IronBarCode;
// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.SaveAsPng("qr.png");
// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
using IronBarCode;
// Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.SaveAsPng("qr.png");
// QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
Imports IronBarCode
' Basic QR code
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.SaveAsPng("qr.png")
' QR code with embedded brand logo (not possible with BarcodeLib)
QRCodeWriter.CreateQrCode("https://example.com/product/42", 300) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
QRCodeWriter.CreateQrCode()은 데이터 문자열과 픽셀 크기를 매개변수로 사용합니다. 로고 삽입, 색상 맞춤 설정, 오류 수정 수준 조정은 모두 연결된 방식을 통해 가능합니다. QR 코드 스타일링 옵션에 대한 자세한 내용은IronBarcode QR 코드 설명서를 참조하십시오.
EAN-13 및 UPC-A
이러한 기능은 소매 재고 관리 시스템에서 흔히 볼 수 있습니다. 열거형 이름은 바뀌지만 값은 동일합니다.
BarcodeLib 접근 방식:
using BarcodeStandard;
using SkiaSharp;
// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
using BarcodeStandard;
using SkiaSharp;
// EAN-13 product barcode
var b = new Barcode();
SKImage ean = b.Encode(Type.Ean13, "5901234123457", 250, 100);
using (var s = File.OpenWrite("product-ean.png"))
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
// UPC-A for US retail
SKImage upc = b.Encode(Type.UpcA, "012345678905", 250, 100);
using (var s = File.OpenWrite("product-upc.png"))
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s);
Imports BarcodeStandard
Imports SkiaSharp
Imports System.IO
' EAN-13 product barcode
Dim b As New Barcode()
Dim ean As SKImage = b.Encode(Type.Ean13, "5901234123457", 250, 100)
Using s = File.OpenWrite("product-ean.png")
ean.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
' UPC-A for US retail
Dim upc As SKImage = b.Encode(Type.UpcA, "012345678905", 250, 100)
Using s = File.OpenWrite("product-upc.png")
upc.Encode(SKEncodedImageFormat.Png, 100).SaveTo(s)
End Using
IronBarcode 접근 방식:
using IronBarCode;
// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.ResizeTo(250, 100)
.SaveAsPng("product-ean.png");
// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
.ResizeTo(250, 100)
.SaveAsPng("product-upc.png");
using IronBarCode;
// EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
.ResizeTo(250, 100)
.SaveAsPng("product-ean.png");
// UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA)
.ResizeTo(250, 100)
.SaveAsPng("product-upc.png");
Imports IronBarCode
' EAN-13 product barcode
BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
.ResizeTo(250, 100) _
.SaveAsPng("product-ean.png")
' UPC-A for US retail
BarcodeWriter.CreateBarcode("012345678905", BarcodeEncoding.UPCA) _
.ResizeTo(250, 100) _
.SaveAsPng("product-upc.png")
바코드 판독 기능 추가 (새로운 기능)
BarcodeLib에는 읽기 API가 없습니다. 업로드된 이미지, 창고 스캐너 또는 스캔한 PDF 문서에서 바코드를 스캔해야 하는 새로운 요구 사항으로 인해 마이그레이션을 진행하는 경우 두 번째 라이브러리 없이 이 기능을 추가하세요.
BarcodeLib 접근 방식:
// 바코드립 — no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
// 바코드립 — no reading API exists
// Adding reading requires a separate library such as ZXing.Net:
// dotnet add package ZXing.Net
// using ZXing;
// var reader = new BarcodeReader();
// // ... separate API, separate dependency graph to manage
' 바코드립 — no reading API exists
' Adding reading requires a separate library such as ZXing.Net:
' dotnet add package ZXing.Net
' Imports ZXing
' Dim reader As New BarcodeReader()
' ... separate API, separate dependency graph to manage
IronBarcode 접근 방식:
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
using IronBarCode;
// Read a barcode from an image file
var results = BarcodeReader.Read("incoming-label.png");
foreach (var result in results)
{
Console.WriteLine($"Value: {result.Value}");
Console.WriteLine($"Format: {result.Format}");
}
// Read all barcodes from a multi-page PDF — no PDF library required
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var result in pdfResults)
{
Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}
// Configure for high-volume scanning with multiple barcodes per image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true
};
var warehouseResults = BarcodeReader.Read("dock-scan.png", options);
Imports IronBarCode
' Read a barcode from an image file
Dim results = BarcodeReader.Read("incoming-label.png")
For Each result In results
Console.WriteLine($"Value: {result.Value}")
Console.WriteLine($"Format: {result.Format}")
Next
' Read all barcodes from a multi-page PDF — no PDF library required
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each result In pdfResults
Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next
' Configure for high-volume scanning with multiple barcodes per image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim warehouseResults = BarcodeReader.Read("dock-scan.png", options)
BarcodeReader.Read()은 이미지 파일, PDF 파일, 스트림, 그리고 System.Drawing.Bitmap 객체를 허용합니다. ReadingSpeed 열거형은 많은 양을 스캔할 때 철저함과 성능을 교환할 수 있게 합니다. 읽기 구성 옵션에 대한 자세한 내용은IronBarcode읽기 설명서를 참조하십시오.
SkiaSharp 분쟁 해결
NU1608 경고로 인해 마이그레이션을 진행하는 경우, 패키지를 전환한 후 충돌이 해결되었는지 확인하십시오. dotnet remove package BarcodeLib과 dotnet add package IronBarcode을 실행한 후 재구성하고 출력을 확인하세요:
dotnet build 2>&1 | grep -i "NU1608\|SkiaSharp"
dotnet build 2>&1 | grep -i "NU1608\|SkiaSharp"
아무런 출력이 나타나지 않으면 충돌이 해결된 것입니다. SkiaSharp 경고가 계속 표시되는 경우, 해당 경고는 종속성 그래프의 다른 패키지에서 발생하는 것이며IronBarcode원인이 아닙니다.
BarcodeLib 접근 방식:
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="BarcodeLib" Version="3.1.5" />
<PackageReference Include="SkiaSharp" Version="3.116.1" />
</ItemGroup>
IronBarcode 접근 방식:
<ItemGroup>
<PackageReference Include="IronBarcode" Version="*" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="IronBarcode" Version="*" />
<PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
바코드립 API와IronBarcode매핑 참조
| 바코드립 | IronBarcode |
|---|---|
new Barcode() |
정적 API - 인스턴스가 필요하지 않습니다. |
b.Encode(Type.Code128, "data", w, h) |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
b.IncludeLabel = true |
.AddAnnotationTextBelowBarcode("text") |
Width/height는 Encode()에 전달되었습니다 |
.ResizeTo(width, height) |
Returns SKImage |
.SaveAsPng(path) / .ToPngBinaryData() |
Type.Code128 |
BarcodeEncoding.Code128 |
Type.Code39 |
BarcodeEncoding.Code39 |
Type.Ean13 |
BarcodeEncoding.EAN13 |
Type.UpcA |
BarcodeEncoding.UPCA |
| QR 지원 없음 (1D만) | BarcodeEncoding.QRCode (또한 QRCodeWriter) |
Type.Itf14 |
BarcodeEncoding.ITF14 |
Type.Codabar |
BarcodeEncoding.Codabar |
| 읽기 API 없음 | BarcodeReader.Read(path) |
| MAUI에서 SkiaSharp 버전 충돌 발생 | 충돌하는 종속성이 없습니다. |
img.Encode(...).SaveTo(stream) |
.SaveAsPng(path) |
MemoryStream + SkiaSharp 인코드 |
.ToPngBinaryData() |
일반적인 마이그레이션 문제와 해결책
문제 1: Type Enum 네임스페이스 변경
BarcodeLib 3.x: BarcodeStandard.Type.Code128을 사용합니다 (PascalCase, BarcodeStandard 네임스페이스에 있습니다). 이전 2.x 코드는 BarcodeLib.TYPE.CODE128(대문자 상수, BarcodeLib 네임스페이스)를 사용할 수 있습니다 — 두 형태는 실제 코드베이스에서 중간 마이그레이션 중에 나타날 수 있습니다.
솔루션: BarcodeEncoding.Code128으로 대체하세요. .cs 파일을 통한 grep은 모든 발생을 식별합니다:
grep -rn "Type\.\|TYPE\." --include="*.cs" .
grep -rn "Type\.\|TYPE\." --include="*.cs" .
일반적인 대체: Type.Code128 / TYPE.CODE128 → BarcodeEncoding.Code128, Type.Ean13 / TYPE.EAN13 → BarcodeEncoding.EAN13, Type.UpcA / TYPE.UPCA → BarcodeEncoding.UPCA, Type.Itf14 / TYPE.ITF14 → BarcodeEncoding.ITF14, Type.Codabar / TYPE.CO/DABAR → BarcodeEncoding.Codabar. BarcodeLib에는 QR 항목이 없습니다; 모든 TYPE.QR_Code은 2.x 버전 또는 포크에서 나온 더 이상 사용하지 않는 코드입니다 — BarcodeEncoding.QRCode으로 대체하거나 스타일화된 출력을 위해 QRCodeWriter을 사용하세요.
문제 2: SKImage / Image 반환 유형
BarcodeLib: b.Encode()은 3.x에서 SKImage을 반환하고 2.x에서는 System.Drawing.Image을 반환합니다. 두 형식 모두 IronBarcode와 컴파일되지 않을 것입니다.
해결책: 중간 이미지 변수를 제거하고, 플루언트 체인의 적절한 최종 메소드로 저장 논리를 교체하십시오:
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
// Before (BarcodeLib 3.x)
SKImage img = b.Encode(Type.Code128, data, 300, 100);
using var ms = new MemoryStream();
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
return ms.ToArray();
// After
return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.ToPngBinaryData();
Imports System.IO
' Before (BarcodeLib 3.x)
Dim img As SKImage = b.Encode(Type.Code128, data, 300, 100)
Using ms As New MemoryStream()
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
Return ms.ToArray()
End Using
' After
Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.ToPngBinaryData()
SKImage img = b.Encode 및 Image img = b.Encode 패턴을 검색하여 영향을 받는 모든 위치를 찾습니다.
문제 3: 폭과 높이 매개변수
BarcodeLib: 3.x에서 너비와 높이는 Encode(Type, string, int, int)의 위치 인수이고, 2.x 이전 코드에서는 별도의 b.Width / b.Height 속성 할당입니다. 어느 형식이든 포팅이 필요합니다.
Solution: 너비/높이는 .ResizeTo(width, height)이(가) CreateBarcode() 이후 단일 호출체로 변경됩니다. 호출 사이트 찾기:
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
# Find Encode() calls and any Width/Height property assignments
grep -n "\.Encode(\|\.Width = \|\.Height = " --include="*.cs" -r .
그런 다음 크기 인수 또는 속성 쌍을 단일 .ResizeTo(width, height) 체인 호출로 교체하세요.
문제 4: IncludeLabel 부울 토글
BarcodeLib: b.IncludeLabel = true은/는 바 아래의 가시적인 텍스트로 인코딩된 데이터 문자열을 자동으로 렌더링하는 불리언입니다.
Solution: 레이블 문자열을 명시적으로 사용하는 .AddAnnotationTextBelowBarcode("text")을 사용하세요. 대부분의 경우 바코드에 인코딩된 것과 동일한 데이터 문자열을 전달합니다. 원래 코드가 IncludeLabel = true을 사용하고 BarcodeLib이 데이터를 레이블로 자동 렌더링하는 것에 의존했다면, 똑같은 데이터 문자열을 명시적으로 전달하세요:
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.AddAnnotationTextBelowBarcode(data) // pass the same string
.SaveAsPng(outputPath);
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.AddAnnotationTextBelowBarcode(data) // pass the same string
.SaveAsPng(outputPath);
Dim barcodeWriter = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
barcodeWriter.AddAnnotationTextBelowBarcode(data) ' pass the same string
barcodeWriter.SaveAsPng(outputPath)
문제 5: 바코드립 제거 후 남은 SkiaSharp 참조
BarcodeLib: 각 프로젝트에 대해 실행된 명시적인 <PackageReference Include="SkiaSharp"> 항목을 주로 BarcodeLib의 버전 제약을 무시하기 위해 누적되었습니다. BarcodeLib이 제거되면 이러한 파일들은 더 이상 사용되지 않게 됩니다.
해결 방법:IronBarcode로 전환한 후, SkiaSharp에 대한 명시적 참조를 제거하기 전에 다른 패키지에서 SkiaSharp가 여전히 필요한지 확인하십시오.
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
# Check if SkiaSharp is still referenced by anything other than the explicit override
dotnet list package --include-transitive 2>&1 | grep -i skia
이제 제거된 명시적 <PackageReference>로 인해 SkiaSharp이 나타난 경우 해당 항목을 제거하세요. MAUI 또는 다른 종속성에서 여전히 해당 파일을 가져오는 경우 그대로 두십시오.IronBarcode해당 파일과 충돌하지 않습니다.
바코드립 마이그레이션 체크리스트
이동 전 작업
변경해야 할 범위R를 파악하기 전에 다음 검색을 실행하십시오.
# Find all 바코드립 using directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .
# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .
# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .
# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .
# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .
# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .
# Find NU1608 evidence in lock files
grep -rn "NU1608" .
# Find all 바코드립 using directives (both 3.x BarcodeStandard and older BarcodeLib)
grep -rn "using BarcodeStandard\|using BarcodeLib" --include="*.cs" .
# Find Barcode object instantiation
grep -rn "new Barcode()" --include="*.cs" .
# Find Encode calls
grep -rn "\.Encode(" --include="*.cs" .
# Find Type enum usage (3.x PascalCase and 2.x uppercase)
grep -rn "Type\.Code128\|Type\.Ean13\|Type\.UpcA\|TYPE\.CODE128\|TYPE\.EAN13\|TYPE\.UPCA" --include="*.cs" .
# Find IncludeLabel usage
grep -rn "IncludeLabel" --include="*.cs" .
# Find the package references in project files
grep -rn "BarcodeLib" --include="*.csproj" .
# Find NU1608 evidence in lock files
grep -rn "NU1608" .
각 검색으로 인해 영향을 받는 모든 파일을 기록하십시오. 어떤 프로젝트가 BarcodeLib를 직접 참조하고 어떤 프로젝트가 이를 간접적으로 상속하는지 확인하십시오. 바코드립 충돌 해결을 위해 추가된 SkiaSharp 버전 재정의 사항을 명시적으로 확인하십시오.
코드 업데이트 작업
- 각 프로젝트에 대해
dotnet remove package BarcodeLib실행 - 바코드립 충돌 해결을 위해 추가된 SkiaSharp 버전 재정의 참조를 모두 제거하십시오.
- 각 프로젝트에 대해
dotnet add package IronBarcode실행 - 애플리케이션 시작 시 각 프로젝트에
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";추가 - 모든
.cs파일에서using BarcodeStandard;(또는 오래된 코드의 경우using BarcodeLib;)과(와)using SkiaSharp;을using IronBarCode;로 대체 - 2.x
ImageFormat.Png사용에서 남은using System.Drawing.Imaging;가져오기 제거 new Barcode()+Encode()호출을BarcodeWriter.CreateBarcode()유창한 체인으로 대체Type.Code128/TYPE.CODE128→BarcodeEncoding.Code128및 모든 다른 열거형 값 대체- 폭/높이 인수 (또는 2.x
b.Width = N; b.Height = M;) with.ResizeTo(N, M)체인 호출 b.IncludeLabel = true;을.AddAnnotationTextBelowBarcode(data)으로 교체img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(...)을.SaveAsPng(path)또는.ToPngBinaryData()으로 교체SKImage/Image중간 변수 및MemoryStream블록 제거,.ToPngBinaryData()이(가) 이를 대체할 때- 바코드 읽기 코드는 필요한 경우 추가 (
BarcodeReader.Read())
마이그레이션 후 테스트
- 프로젝트를 빌드하고 복원 출력에 NU1608 경고가 하나도 남지 않았는지 확인합니다.
dotnet build 2>&1을 실행하세요 | grep -i "NU1608|SkiaSharp 충돌이 완전히 해결되었는지 확인하려면 SkiaSharp를 사용하십시오.- 생성된 바코드의 시각적 결과물을 BarcodeLib의 정상 샘플과 비교합니다.
- 모바일 스캐너 또는
BarcodeReader.Read()메서드를 사용하여 QR 코드가 올바르게 디코딩되는지 검증 - 해당되는 경우 소매점 스캐너 하드웨어를 사용하여 EAN-13 및 UPC-A 바코드를 테스트하십시오.
- 이미지가 파일 시스템, HTTP 응답, 데이터베이스 저장소 등 모든 출력 대상에서 올바르게 표시되는지 확인합니다.
- @
BarcodeReader.Read("file.pdf")을(를) 실제 문서에 사용하여 모든 PDF 바코드 읽기 시나리오 테스트 - 프로젝트가 Linux 또는 macOS를 대상으로 하는 경우, 크로스 플랫폼 빌드가 성공하는지 확인합니다.
- Android 및 iOS 대상에서 SkiaSharp 바인딩 오류 없이 MAUI 빌드가 완료되는지 확인합니다.
IronBarcode로 마이그레이션할 때의 주요 이점
두 번째 라이브러리 없이 바코드 판독: 판독 기능이 필요했던 팀에게 가장 즉각적인 이점은 두 번째 라이브러리에 대한 의존성을 없앨 수 있다는 것입니다. BarcodeReader.Read()은(는) 동일한 패키지에 있으며, 동일한 using IronBarCode; 구문을 사용하고, 추가적인 NuGet 설치가 필요하지 않습니다. ZXing .NET 및 해당 종속성 그래프는 더 이상 프로젝트의 일부가 아닙니다.
SkiaSharp 버전 충돌 없음:IronBarcode애플리케이션 코드와 SkiaSharp 종속성 그래프를 공유하지 않습니다. MAUI 프로젝트, Blazor 프로젝트, 그리고 여러 패키지가 SkiaSharp에 집중되는 모든 프로젝트는 NU1608 경고나 런타임 바인딩 오류 없이IronBarcode설치할 수 있습니다. BarcodeLib에서 도입했던 버전 협상 기능이 사라졌습니다.
직접 바이트 배열 출력: .ToPngBinaryData()은(는) 유창한 체인의 끝에 byte[]을(를) 반환합니다. BarcodeLib이 바이트 배열 출력을 위해 요구했던 MemoryStream 중개자가 모든 바코드를 생성하는 컨트롤러 동작, 서비스 메서드, 및 API 처리기에서 제거되었습니다.
PDF 바코드 처리: BarcodeReader.Read()은(는) PDF 파일을 본래적으로 허용합니다. 바코드가 내장된 PDF 문서를 생성하는 애플리케이션은 별도의 PDF 렌더링 라이브러리 없이도 해당 바코드를 다시 읽을 수 있습니다. 생성, PDF 삽입 및 읽기를 포함한 전체 과정은IronBarcode내에서 처리됩니다.
상업적 지원 및 SLA: IronBarcode는 갱신 주기가 정의된 Iron Software의 상업적 지원 모델에 의해 지원됩니다. .NET 생태계에서 새로운 .NET 출시가 나오거나 중대한 변화가 발생할 때, IronBarcode는 커뮤니티 가용성이 아닌 상업적 SLA에 따라 호환성 업데이트를 발표합니다.
두 번째 라이브러리 없이 QR 코드 생성: QRCodeWriter은(는) 체인드 메서드를 통해 로고 임베딩, 색상 맞춤화, 오류 수정 레벨 구성을 지원합니다. 바코드립 3.x는 1D 심볼로지만 생성합니다 — BarcodeLib과 함께 QR이 필요했던 프로젝트는 QRCoder와 같은 두 번째 라이브러리를 추가했습니다. QR 코드 요구 사항이 확장된 팀은 생성 워크플로를 변경하지 않고도 같은 패키지 내에서 이러한 기능을 얻을 수 있습니다.
자주 묻는 질문
BarcodeLib에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
BarcodeLib API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
BarcodeLib에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션하는 동안 BarcodeLib와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
IronBarcode는 BarcodeLib에 비해 어떻게 Docker 배포를 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
BarcodeLib에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
BarcodeLib에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

