푸터 콘텐츠로 바로가기
다른 구성 요소와 비교

Accusoft 바코드익스프레스와 IronBarcode: C# 바코드 라이브러리 비교

바코드립 vs IronBarcode: 오픈 소스 생성기가 멈추는 곳

BarcodeLib는 대부분의 개발자들이 결국 바코드 생성만 할 수 있다는 것을 발견하는 오랜 오픈 소스 .NET 라이브러리입니다. 그들 중 일부는 SkiaSharp 버전 충돌을 발견하기도 합니다. 보통 가장 좋지 않은 순간에 발생하는데, MAUI 또는 Blazor 프로젝트에 BarcodeLib를 추가했을 때 SkiaSharp에 이미 의존하고 있는 상황에서 만납니다. 그리고 빌드는 NU1608 경고를 던지기 시작합니다. 이 기사는 두 문제를 모두 다루고 있습니다. BarcodeLib은 명확한 사용 사례를 가진 합법적인 라이브러리입니다. 어디서 멈추는지 이해하는 것이 실질적인 문제입니다.

바코드립 이해하기

BarcodeLib은 Brad Barnhill이 GitHub 에서 유지 관리하는 .NET 용 오픈 소스 바코드 이미지 생성 라이브러리입니다. 2007년부터 활성 중이며 대략 30가지의 1D 기호 변형을 지원합니다. Apache 2.0 라이선스는 상업적 용도로 무료로 사용할 수 있도록 허용합니다. 순수한 선형 바코드 생성 — 문자열에서 이미지를 생성하는 경우 — 안정적으로 작동하며, 수많은 년 동안 활발한 사용을 통해 그 목적을 잘 수행해왔습니다.

이 API는 인스턴스 기반입니다. Barcode 객체를 생성하고 속성을 설정한 후, 타입 상수, 데이터 문자열, 픽셀 크기를 사용하여 Encode()을 호출합니다. 결과는 SKImage (SkiaSharp)이며, 이를 인코딩하여 필요에 따라 저장하거나 스트림으로 전송합니다. 이 워크플로는 접근 가능하며, 요구 사항이 엄격하게 선형 바코드 이미지 인쇄 — 배송 라벨, 재고 태그, 소매가 태그 —인 프로젝트에서는 충분합니다.

BarcodeLib의 주요 아키텍처 특징:

  • 생성 전용 범위: 이 라이브러리는 읽기 또는 디코딩 API를 전혀 제공하지 않습니다. 전체 공개 영역은 데이터 문자열에서 이미지를 생성하는 데 중점을 둡니다
  • 인스턴스 기반 API: 각 작업은 Barcode 객체를 인스턴스화하고, Encode()을 호출하기 전에 레이블과 글꼴 속성을 구성해야 합니다.
  • SKImage 반환: 출력은 SkiaSharp 이미지 객체로, 파일 또는 바이트 배열을 생성하려면 SKEncodedImageFormat 단계와 스트림이 필요합니다.
  • 1D 전용 기호: 대략 30가지의 선형 형식을 지원하며, Code128, EAN-13, UPC-A, Code39 등을 포함합니다; 현재 3.x 소스의 BarcodeStandard.Type 열거형에는 QR 코드, 데이터 매트릭스, PDF417, Aztec 또는 기타 2D 항목이 없습니다.
  • SkiaSharp 종속성 (v3.x): 3.x 시리즈는 크로스 플랫폼 지원을 위해 System.Drawing.Common을 SkiaSharp으로 대체했습니다. 이로 인해 프로젝트 내 다른 패키지들도 SkiaSharp에 의존하는 경우 버전 충돌 위험이 발생합니다.
  • 무료, 라이선스 키 필요 없음: Apache 2.0 라이선스는 런타임 키나 활성화 없이 상업적 용도로 사용할 수 있습니다.

바코드립 코어 생성 패턴

표준 바코드립 생성 워크플로는 인스턴스를 생성하고 속성을 구성한 후, 크기의 Encode()을 호출해야 합니다.

using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);

using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();
b.IncludeLabel = true;
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);

using var stream = File.OpenWrite("barcode.png");
img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
Imports BarcodeStandard
Imports SkiaSharp

Dim b As New Barcode()
b.IncludeLabel = True
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)

Using stream = File.OpenWrite("barcode.png")
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream)
End Using
$vbLabelText   $csharpLabel

이것이 전체 생성 워크플로입니다. 속성 설정 패턴이 디자인입니다: Encode() 호출 전에 인스턴스에서 구성되며, 반환 값은 인코딩되어 스트림으로 기록되어야 하는 SKImage입니다.

IronBarcode이해하기

IronBarcode 는 바코드 생성과 읽기 기능을 하나의 패키지에 모두 포함하는 상 for .NET 바코드 라이브러리입니다. 이 라이브러리는 NuGet 통해 설치되며, .NET Framework 4.6.2부터 .NET 9까지 실행되고, Windows, Linux, macOS, Docker, Azure 및 AWS Lambda에서 작동합니다. 이 라이브러리는 Iron Software 에서 개발 및 유지 관리하며, 상업적 지원 모델을 제공합니다.

생성 API는 정적이고 유연합니다. 기본 호출 전에 인스턴스를 생성하거나 속성을 설정할 필요가 없습니다. 구성 옵션은 BarcodeWriter.CreateBarcode() 또는 QRCodeWriter.CreateQrCode()의 결과에 체인으로 연결됩니다. 체인의 끝에서 출력 방법인 .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData()은 BarcodeLib이 요구하는 중간 MemoryStream 패턴을 제거합니다. 읽기 기능은 별도의 라이브러리나 ZXing .NET 통합을 유지 관리할 필요 없이 동일한 패키지에 포함되어 있습니다.

IronBarcode 의 주요 특징:

  • 하나의 패키지에서 생성 및 읽기: BarcodeWriter는 생성을 처리합니다. BarcodeReader은 읽기를 처리합니다. 두 제품 모두 동일한 NuGet 설치 파일에 포함되어 있습니다.
  • 정적 플루언트 API: 인스턴스 생성이 필요 없습니다. 구성 체인은 유창한 방법으로 CreateBarcode() 후에 체인됩니다.
  • 직접적인 바이트 배열 출력: .ToPngBinaryData()MemoryStream 단계 없이 byte[]을 반환합니다.
  • PDF 지원 (양쪽 끝): BarcodeReader.Read()는 PDF 파일을 직접적으로 수용합니다. 생성된 결과물은 PDF 파일에 삽입할 수 있습니다.
  • SkiaSharp 종속성 없음: SkiaSharp 버전 그래프와 독립적이므로 MAUI 및 기타 프로젝트에서 NU1608 충돌이 발생하지 않습니다.
  • SLA가 포함된 상업용 라이선스: 가격은 영구 라이선스 기준 749달러~5,999달러입니다. 상업적 지원 및 보장된 업데이트 주기를 포함해야 합니다
  • ReadingSpeed 조정: BarcodeReaderOptions은 대량 성능을 위해 스캔 철저성을 성능과 맞바꿀 수 있습니다.

기능 비교

기능 바코드립 IronBarcode
바코드 생성 예 (1D만 해당) 예 (1D 및 2D)
바코드 판독 아니요
2D 기호 (QR, 데이터 매트릭스, PDF417, Aztec) 아니요
PDF 바코드 읽기 아니요
그래프의 SkiaSharp 의존성 예 (v3.x) 아니요
Fluent 체인형 API 아니요
라이선스 Apache 2.0 (무료) 749달러~5,999달러 영구

상세 기능 비교

기능 바코드립 IronBarcode
세대
코드128 생성
EAN-13 / UPC-A 세대
QR 코드 생성 아니요 예 (로고 삽입 포함)
데이터 매트릭스 / PDF417 / 아즈텍 아니요
1D 기호 범위 ~30 변형 30+ 변형
Fluent 체인형 생성 API 아니요
직접적인 byte[] 출력 수동 (스트림 인코드) .ToPngBinaryData()
PDF 생성 결과 아니요
독서
이미지에서 바코드 읽기 아니요 예 (BarcodeReader.Read())
PDF에서 바코드 읽기 아니요 예 (네이티브 앱이며, 추가 라이브러리가 필요하지 않습니다)
다중 바코드 감지 아니요 예 (ExpectMultipleBarcodes)
읽기 속도 조정 해당 없음 예 (ReadingSpeed 열거형)
플랫폼
Windows
리눅스/macOS 부분적(SkiaSharp에 따라 다름) 전체
Docker/컨테이너 구성 필요
MAUI 프로젝트 호환성 분쟁 위험 (NU1608) 충돌 없음
.NET Framework 4.6.2 이상
.NET 6-9 예 (SkiaSharp 3.x 버전 필요)
라이선스
오픈 소스 / 무료 예 (아파치 2.0) 아니요
상업적 지원 / 서비스 수준 계약(SLA) 아니요
라이선스 키가 필요합니다. 아니요
가격 무료 749달러~5,999달러 영구

바코드 생성 API

생성 API는 서로 다른 디자인 철학을 나타냅니다: BarcodeLib는 변경 가능한 인스턴스 구성을 사용하고, IronBarcode는 정적 진입점에 유연한 체인을 사용합니다.

바코드립 접근 방식

BarcodeLib은 인스턴스를 생성하고 속성을 설정한 후, 크기의 Encode() 호출이 필요합니다. 출력은 SKImage입니다.

using BarcodeStandard;
using SkiaSharp;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
using BarcodeStandard;
using SkiaSharp;

public byte[] GenerateCode128(string data)
{
    var b = new Barcode();
    b.IncludeLabel = true;
    SKImage img = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100);

    using var ms = new MemoryStream();
    img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms);
    return ms.ToArray();
}
Imports BarcodeStandard
Imports SkiaSharp

Public Function GenerateCode128(data As String) As Byte()
    Dim b As New Barcode()
    b.IncludeLabel = True
    Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, data, 300, 100)

    Using ms As New MemoryStream()
        img.Encode(SKEncodedImageFormat.Png, 100).SaveTo(ms)
        Return ms.ToArray()
    End Using
End Function
$vbLabelText   $csharpLabel

SKImage 반환 유형은 바이트 배열 출력을 위해 SKEncodedImageFormat 인코드 호출과 MemoryStream이 필요함을 의미합니다. IncludeLabel 속성은 불리언 토글입니다 - BarcodeLib은 인코딩된 데이터 문자열을 막대 아래의 보이는 레이블로 렌더링합니다.

IronBarcode접근법

IronBarcode의 생성 방식은 완전히 정적입니다. 구성 체인은 CreateBarcode() 후에 체인되며, 출력 방법은 체인을 직접 종료합니다.

// NuGet: dotnet add package IronBarcode
using IronBarCode;

public byte[] GenerateCode128(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .AddBarcodeValueTextBelowBarcode()
        .ToPngBinaryData();
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

public byte[] GenerateCode128(string data)
{
    return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
        .ResizeTo(300, 100)
        .AddBarcodeValueTextBelowBarcode()
        .ToPngBinaryData();
}
Imports IronBarCode

Public Function GenerateCode128(data As String) As Byte()
    Return BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
        .ResizeTo(300, 100) _
        .AddBarcodeValueTextBelowBarcode() _
        .ToPngBinaryData()
End Function
$vbLabelText   $csharpLabel

.ToPngBinaryData()는 중간 Image 또는 MemoryStream 객체 없이 바이트 배열을 직접 반환합니다. .AddBarcodeValueTextBelowBarcode()는 인코딩된 데이터 문자열을 막대 아래의 레이블로 렌더링합니다. 고급 바코드 생성 시나리오에 대해서는 IronBarcode 바코드 생성 설명서를 참조하십시오.

바코드 판독 기능

읽기는 이 두 라이브러리 사이의 가장 중요한 기능적 경계입니다. BarcodeLib에는 읽기 기능이 없습니다.IronBarcode패키지 내에 완전한 바코드 판독 엔진을 포함하고 있습니다.

바코드립 접근 방식

BarcodeLib에는 읽기 API가 없습니다. Decode(), Scan(), 또는 ReadBarcode() 방법이 없습니다. 읽기는 라이브러리의 설계에 포함되지 않았습니다. 디코딩 메서드를 호출하려는 모든 시도는 컴파일 오류를 발생시킵니다.

using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();

// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png");      // does not exist
// b.Scan("barcode.png");        // does not exist
// b.ReadBarcode("barcode.png"); // does not exist

// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
using BarcodeStandard;
using SkiaSharp;

var b = new Barcode();

// There is no Decode, Scan, or Read method on Barcode.
// b.Decode("barcode.png");      // does not exist
// b.Scan("barcode.png");        // does not exist
// b.ReadBarcode("barcode.png"); // does not exist

// The only public operation is generation:
SKImage img = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100);
Imports BarcodeStandard
Imports SkiaSharp

Dim b = New Barcode()

' There is no Decode, Scan, or Read method on Barcode.
' b.Decode("barcode.png")      ' does not exist
' b.Scan("barcode.png")        ' does not exist
' b.ReadBarcode("barcode.png") ' does not exist

' The only public operation is generation:
Dim img As SKImage = b.Encode(BarcodeStandard.Type.Code128, "PRODUCT-12345", 300, 100)
$vbLabelText   $csharpLabel

BarcodeLib과 함께 바코드 생성 및 읽기 기능이 모두 필요한 팀은 일반적으로 ZXing .NET 과 같은 두 번째 라이브러리를 추가해야 하는데, 이로 인해 자체적인 종속성 관리 부담과 유지 관리해야 할 두 번째 API 표면이 발생합니다.

IronBarcode접근법

BarcodeReader.Read()는 이미지 파일, PDF 파일, 스트림 및 System.Drawing.Bitmap 객체를 수용합니다. PDF 파일을 읽는 데에는 별도의 라이브러리가 필요하지 않습니다.

using IronBarCode;

// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value);  // "PRODUCT-12345"

// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
using IronBarCode;

// Read from an image
var results = BarcodeReader.Read("barcode.png");
Console.WriteLine(results.First().Value);  // "PRODUCT-12345"

// Read all barcodes from a PDF — no separate PDF library needed
var pdfResults = BarcodeReader.Read("invoice-batch.pdf");
foreach (var result in pdfResults)
{
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}");
}

// Tune reading for speed vs. thoroughness
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-scan.png", options);
Imports IronBarCode

' Read from an image
Dim results = BarcodeReader.Read("barcode.png")
Console.WriteLine(results.First().Value)  ' "PRODUCT-12345"

' Read all barcodes from a PDF — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("invoice-batch.pdf")
For Each result In pdfResults
    Console.WriteLine($"Page {result.PageNumber}: {result.Value}")
Next

' Tune reading for speed vs. thoroughness
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-scan.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed 열거형은 대량 시나리오에서 스캔 성능을 조정할 수 있게 해줍니다. 읽기 구성에 대한 자세한 내용은 IronBarcode 읽기 설명서를 참조하십시오.

SkiaSharp 종속성 충돌

BarcodeLib 3.x에서 도입된 SkiaSharp 종속성은IronBarcode에는 존재하지 않는 종류의 충돌을 발생시킵니다.

바코드립 접근 방식

BarcodeLib 3.x부터, 이 라이브러리는 System.Drawing.Common를 대체하기 위해 그래픽 백엔드로 SkiaSharp을 도입했습니다. .NET 6 이후 Windows전용이 되었습니다. 바코드립 3.1.5는 SkiaSharp >= 2.88.8을 선언합니다. 프로젝트가 이미 다른 종속성을 통해 SkiaSharp을 사용하고 있는 경우 — MAUI 프로젝트에서 SkiaSharp.Views.MauiMicrosoft.Maui.Graphics을 사용하는 것이 일반적이며, 이는 SkiaSharp 3.x로 이동하는 경향이 있음 — 해결된 버전들이 일치하지 않을 수 있습니다. 그 결과 최소한 NU1608 경고가 발생하고, 최악의 경우 런타임 시 어셈블리 바인딩 오류가 발생합니다.

warning NU1608: Detected package version outside of dependency constraint:
BarcodeLib 3.1.5 requires SkiaSharp (>= 2.88.8) but
version SkiaSharp 3.116.1 was resolved.

명시적 패키지 참조를 통한 해상 강제는 하나의 경로이지만, 이는 런타임 호환성을 보장하지 않습니다.

<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />
  <PackageReference Include="SkiaSharp" Version="3.116.1" />
  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
<ItemGroup>
  <PackageReference Include="BarcodeLib" Version="3.1.5" />
  <PackageReference Include="SkiaSharp" Version="3.116.1" />
  <PackageReference Include="SkiaSharp.Views.Maui.Controls" Version="3.116.1" />
</ItemGroup>
XML

명시적 재정의가 있더라도 호환성은 BarcodeLib의 내부 API 호출이 해결된 SkiaSharp 버전이 노출하는 것과 일치하는지 여부에 따라 달라집니다. 커뮤니티에 의해 유지되는 프로젝트이기에, BarcodeLib는 상용 지원 계약이 릴리스 주기에 붙어 있지 않습니다.

IronBarcode접근법

IronBarcode SkiaSharp 종속성 그래프를 애플리케이션 코드와 공유하지 않습니다. 버전 협상을 관리할 필요도 없고, NU1608 오류를 진단할 필요도 없으며, SkiaSharp 버전 확인과 관련된 런타임 어셈블리 바인딩 위험도 없습니다. MAUI 프로젝트, Blazor 프로젝트 및 SkiaSharp에 의존하는 기타 모든 애플리케이션은 버전 충돌 없이IronBarcode설치할 수 있습니다. MAUI 관련 통합 패턴에 대해서는 IronBarcode MAUI 문서를 참조하십시오.

API 매핑 참조

바코드립 IronBarcode
new Barcode() 정적 API - 인스턴스가 필요하지 않습니다.
b.Encode(BarcodeStandard.Type.Code128, "data", 300, 100) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128).ResizeTo(300, 100)
b.IncludeLabel = true .AddBarcodeValueTextBelowBarcode()
SKImage을 반환 .SaveAsPng(path) / .ToPngBinaryData()
BarcodeStandard.Type.Code128 BarcodeEncoding.Code128
BarcodeStandard.Type.Code39 BarcodeEncoding.Code39
BarcodeStandard.Type.Ean13 BarcodeEncoding.EAN13
BarcodeStandard.Type.UpcA BarcodeEncoding.UPCA
지원되지 않음 (BarcodeLib에 2D 없음) BarcodeEncoding.QRCode (또한 QRCodeWriter)
읽기 API 없음 BarcodeReader.Read(path)
종속성 그래프의 SkiaSharp SkiaSharp 종속성 없음

팀이 BarcodeLib에서IronBarcode로 이전하는 것을 고려할 때

읽기 요구 사항이 표시됩니다

수개월 동안 배송 라벨을 생성해 온 시스템에 새로운 요구 사항이 생겼습니다. 바로 공급업체에서 반송된 라벨도 처리해야 한다는 것입니다. 창고 통합 시스템은 입고 화물 명세서에서 바코드를 분석해야 합니다. 문서 관리 시스템은 스캔한 PDF 파일의 바코드를 색인화해야 합니다. BarcodeLib은 이러한 요구 사항을 충족할 수 없습니다. 읽기 API가 존재하지 않기 때문입니다. 개발팀은 BarcodeLib과 함께 ZXing .NET 을 추가하는 방안을 검토하고, 두 라이브러리 유지 관리 부담과 두 개의 별도 종속성 그래프를 고려한 결과, 단일 NuGet 설치로 생성과 읽기를 모두 처리하는 라이브러리를 사용하는 것이 더 깔끔한 방법이라고 판단했습니다.

스키아샤프, MAUI 프로젝트에서의 갈등

한 팀이 기존 MAUI 애플리케이션에 BarcodeLib을 추가했는데, 복원 과정에서 즉시 NU1608 경고가 발생했습니다. 그들은 조사하고 BarcodeLib이 예상하는 SkiaSharp 범위와 MAUI가 요구하는 버전 간의 불일치를 확인하여 명시적인 <PackageReference> 오버라이드를 추가하여 해결을 강제하고 빌드를 성공적으로 통과시킵니다. 그러면 SkiaSharp의 네이티브 바이너리가 잘못된 버전을 로드할 때 기기에서 런타임 오류가 발생합니다. 이 문제를 해결하려면 어셈블리 바인딩 로그에 대한 심층적인 조사가 필요합니다.IronBarcode로 전환하면 호환되는 SkiaSharp 버전을 찾는 것이 아니라 공유 종속성을 완전히 제거함으로써 충돌의 근본 원인을 해결할 수 있습니다.

PDF 바코드 처리 필요

송장, 작업 지시서, 배송 명세서 등 바코드가 포함된 PDF 문서를 생성하는 애플리케이션은 후속 처리 과정에서 해당 바코드를 다시 읽어야 하는 경우가 있습니다. BarcodeLib은 바코드 이미지를 생성하지만 PDF를 지원하지 않습니다. BarcodeLib을 사용하여 PDF에서 바코드를 읽으려면 먼저 별도의 PDF 라이브러리를 사용하여 PDF를 이미지로 렌더링한 다음, 해당 이미지를 별도의 읽기 라이브러리에 전달해야 합니다. IronBarcode는 완전한 체인을 본래적으로 처리합니다: BarcodeReader.Read("file.pdf")은 모든 페이지를 순회하며, 중간 렌더링 단계 없이 모든 검출된 바코드를 반환합니다.

QR 코드 또는 기타 2D 기호 요구사항 발생

초기 요구 사항이 선형 바코드에만 국한되었던 프로젝트는 종종 QR 코드, 데이터 매트릭스, PDF417 또는 Aztec 출력을 필요로 하게 진화합니다. BarcodeLib의 3.x 시리즈는 2D 기호를 생성하지 않습니다 — BarcodeStandard.Type 열거형에는 QR 코드나 기타 2D 항목이 없습니다 — 따라서 2D 요구 사항은 두 번째 라이브러리를 추가하거나 BarcodeLib을 완전히 대체해야 합니다. IronBarcode의 QRCodeWriterBarcodeWriter는 유창한 API를 통해 QR 코드(로고 내장, 색상 제어, 오류 수정 조정), 데이터 매트릭스, PDF417, 그리고 Aztec을 다룹니다. 기호 요구 사항이 2D로 이동하는 팀에게는 갭이 마이그레이션 결정을 유도합니다.

일반적인 마이그레이션 고려사항

인스턴스 API에서 정적 Fluent API로

BarcodeLib 코드는 가변 객체 패턴을 사용합니다: Barcode 인스턴스를 생성하고 속성을 설정한 후 Encode()을 호출합니다. IronBarcode는 정적 유창한 패턴을 사용합니다: BarcodeWriter.CreateBarcode()을 호출하고 구성 방법을 체인한 후 출력 방법으로 종료합니다. Barcode 인스턴스를 필드로 저장하거나 메소드 간에 전달하는 기존 코드는 구조 변경이 필요할 것입니다. 일반적인 변경 사항은 속성 설정 블록을 메서드 체인으로 대체하는 것입니다.

// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .AddBarcodeValueTextBelowBarcode()
    .SaveAsPng(outputPath);
// The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .AddBarcodeValueTextBelowBarcode()
    .SaveAsPng(outputPath);
' The property setters on b become chained methods
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .AddBarcodeValueTextBelowBarcode() _
    .SaveAsPng(outputPath)
$vbLabelText   $csharpLabel

SKImage에서 직접 출력으로

BarcodeLib 3.x은 SKImage을 반환하며, 이는 바이트를 생성하려면 SKEncodedImageFormat 및 스트림이 필요합니다. SKImage에 입력되었거나 image.Encode(...).SaveTo(stream)을 거치는 모든 코드는 업데이트가 필요합니다. IronBarcode의 유창한 체인은 원하는 출력 형식으로 직접 종료됩니다 — .SaveAsPng(), .ToPngBinaryData(), .ToAnyImageData() — 중간 이미지 객체 및 스트림으로 인코딩하는 단계가 필요하지 않습니다.

Type Enum에서 BarcodeEncoding Enum으로

BarcodeLib 3.x는 BarcodeStandard.Type.Code128와 같은 PascalCase 값을 가진 BarcodeStandard.Type 열거형을 사용합니다. IronBarcode는 BarcodeEncoding.Code128와 같은 값을 가진 BarcodeEncoding 열거형을 사용합니다. 1D 값은 직접 매핑됩니다: Code128Code128, Ean13EAN13, UpcAUPCA, Code39Code39. .cs 파일 전체에서 BarcodeStandard.Type.에 대한 grep을 통해 업데이트가 필요한 모든 발생을 식별합니다.

SkiaSharp 참조 정리

BarcodeLib의 NU1608 경고를 해결하기 위해 명시적으로 <PackageReference Include="SkiaSharp"> 항목을 추가한 프로젝트는 IronBarcode로 전환한 후 이러한 오버라이드를 제거할 수 있습니다. dotnet list package --include-transitive 명령어는 프로젝트의 다른 패키지가 여전히 SkiaSharp을 필요로 하는지 확인한 후 제거할 수 있는지 확인합니다.

IronBarcode추가 기능

IronBarcode 직접적인 바코드 생성 및 판독 비교 외에도 BarcodeLib에서 다루지 않는 기능을 포함하고 있습니다.

  • QR 코드 로고 내장: QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 자동 오류 수정 조정이 있는 QR 코드 중앙에 브랜드 로고를 배치합니다.
  • PDF 바코드 추출: BarcodeReader.Read("file.pdf")은 별도의 PDF 렌더링 라이브러리가 없이 PDF 문서의 모든 페이지에서 바코드를 읽습니다.
  • 멀티 바코드 감지: BarcodeReaderOptions.ExpectMultipleBarcodes = true는 단일 이미지에서 모든 바코드를 감지하고 반환합니다.
  • 읽기 속도 구성: ReadingSpeed.Faster, ReadingSpeed.Balanced, 그리고 ReadingSpeed.ExtremeDetail는 처리량 대 정확성을 위해 스캔 엔진을 조정합니다.
  • 스타일링된 QR 코드 생성: 색상, 찾기 패턴 스타일 및 오류 수정 수준은 QRCodeWriter에서 체인된 메소드를 통해 구성 가능합니다.
  • 읽기를 위한 스트림 및 비트맵 입력: BarcodeReader.Read()는 파일 경로, 스트림, System.Drawing.BitmapAnyBitmap 입력을 수용합니다.

.NET 호환성 및 미래 준비

IronBarcode .NET Framework 4.6.2부터 .NET 9까지 지원하며 Microsoft의 .NET 릴리스 일정에 맞춰 정기적으로 릴리스를 진행합니다. 2026년까지 .NET 10 도입이 증가함에 따라 IronBarcode의 적극적인 개발을 통해 프로젝트 변경 없이도 향후 호환성을 보장할 수 있습니다. 이 라이브러리는 Windows, Linux, macOS, Docker, Azure 및 AWS Lambda에서 수정 없이 실행됩니다. BarcodeLib은 활발한 커뮤니티 개발을 유지하고 있지만, 3.x 시리즈에서의 크로스 플랫폼 지원은 위 비교 섹션에서 설명한 SkiaSharp 버전 호환성에 따라 달라집니다. Linux 또는 컨테이너 환경에서 최신 .NET 대상으로 하는 프로젝트의 경우, IronBarcode의 종속성 없는 크로스 플랫폼 아키텍처는 BarcodeLib의 SkiaSharp 백엔드에서 발생하는 버전 협상을 피할 수 있습니다.

결론

BarcodeLib과IronBarCode.NET 환경에서 바코드 작업을 위한 서로 다른 범위의 솔루션을 제공합니다. BarcodeLib은 특정 용도에 특화된 무료 바코드 생성 전용 라이브러리로, 거의 20년 동안 해당 용도에 맞는 안정적인 서비스를 제공해 왔습니다.IronBarcode는 정적 플루언트 API를 제공하며 SkiaSharp에 의존하지 않는 상용 라이브러리로, 바코드 생성 및 읽기 기능을 모두 지원합니다. 차이점은 공통된 범위 내에서의 품질 차이가 아니라, 범위 자체의 차이입니다.

BarcodeLib는 안정적인 선형 생성 전용 요구 사항을 가진 Windows또는 SkiaSharp 버전 환경이 제어된 환경에서의 프로젝트에 적합한 선택으로 남아 있습니다. Apache 2.0 라이선스, 비용이 전혀 들지 않으며, 간단한 API로 인해 바코드 스캔이나 2D 기호를 제작할 필요가 전혀 없는 배송 라벨 시스템, 재고 태그 생성기 및 유사한 애플리케이션에 실용적인 솔루션이 됩니다.

IronBarcode는 요구 사항이 선형 이미지 생성을 넘어섰을 때, 읽기 기능이 필요하거나, 프로젝트가 MAUI 또는 SkiaSharp 버전 충돌이 있을 가능성이 있는 크로스 플랫폼 애플리케이션일 때, PDF 바코드 처리 로드맵에 있을 때 또는 QR 코드, 데이터 매트릭스, PDF417, Aztec과 같은 2D 기호가 필요할 때 더 실용적인 선택으로 변합니다. 상용 라이선스 비용은 문턱 질문을 나타냅니다 — 팀의 요구사항이 IronBarcode가 BarcodeLib에 추가하는 것과 일치할 경우, 단일 패키지 솔루션과 상용 지원이 가치 교환입니다.

솔직히 말해서 대부분의 팀은 처음부터IronBarcode사용하지 않습니다. 그들은 BarcodeLib이 무료이고 필요한 기능을 모두 갖추고 있기 때문에 그것부터 시작합니다. BarcodeLib의 생성 전용 범위에서 지원하는 범위를 넘어서는 요구 사항이 생기면IronBarcode로 마이그레이션합니다. 마이그레이션 과정은 잘 문서화되어 있으며 API 표면 변화는 예측 가능합니다. BarcodeLib이 어디에서 멈추는지, 특히 생성 단계에서 멈춘다는 점을 이해하는 것은 타이밍 결정을 올바르게 내리는 데 필요한 실질적인 정보입니다.

자주 묻는 질문

바코드 라이브러리란 무엇인가요?

BarcodeLib은 C# 애플리케이션에서 바코드를 생성하고 판독하기 위한 .NET 바코드 라이브러리입니다. 개발자가 .NET 프로젝트용 바코드 솔루션을 선택할 때 평가하는 여러 대안 중 하나입니다.

BarcodeLib와 IronBarcode의 주요 차이점은 무엇인가요?

바코드 라이브러리는 일반적으로 사용하기 전에 인스턴스 생성 및 구성이 필요한 반면, IronBarcode는 인스턴스 관리가 필요 없는 정적 상태 비저장 API를 사용합니다. 또한 IronBarcode는 모든 환경에서 기본 PDF 지원, 자동 형식 감지, 단일 키 라이선싱을 제공합니다.

IronBarcode가 BarcodeLib보다 라이선스 취득이 더 쉬운가요?

IronBarcode는 개발 및 프로덕션 배포를 모두 포괄하는 단일 라이선스 키를 사용합니다. 따라서 SDK 키와 런타임 키를 분리하는 라이선싱 시스템에 비해 CI/CD 파이프라인 및 Docker 구성이 간소화됩니다.

IronBarcode는 BarcodeLib가 지원하는 모든 바코드 형식을 지원하나요?

IronBarcode는 QR코드, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 등 30개 이상의 바코드 심볼로지를 지원합니다. 형식 자동 감지 기능은 명시적인 형식 열거가 필요하지 않음을 의미합니다.

IronBarcode는 네이티브 PDF 바코드 판독을 지원하나요?

예. IronBarcode는 별도의 PDF 렌더링 라이브러리가 필요 없이 BarcodeReader.Read("document.pdf")를 사용하여 PDF 파일에서 직접 바코드를 판독합니다. 페이지별 결과에는 페이지 번호, 바코드 형식, 값 및 신뢰도 점수가 포함됩니다.

IronBarcode는 BarcodeLib와 비교하여 일괄 처리를 어떻게 처리하나요?

IronBarcode의 정적 메서드는 상태 저장소가 없고 자연스럽게 스레드에 안전하므로 스레드별 인스턴스 관리 없이 Parallel.ForEach를 직접 사용할 수 있습니다. 어떤 가격대에서도 처리량 상한선이 없습니다.

IronBarcode 어떤 .NET 버전을 지원하나요?

IronBarcode는 단일 NuGet 패키지로 .NET Framework 4.6.2+, .NET Core 3.1 및 .NET 5, 6, 7, 8, 9를 지원합니다. 플랫폼 대상에는 Windows x64/x86, Linux x64, macOS x64/ARM이 포함됩니다.

.NET 프로젝트에 IronBarcode를 설치하려면 어떻게 해야 하나요?

NuGet을 통해 IronBarcode 설치: 패키지 관리자 콘솔에서 'Install-Package IronBarCode'를 실행하거나 CLI에서 '닷넷 추가 패키지 IronBarCode'를 실행합니다. 추가 SDK 인스톨러나 런타임 파일은 필요하지 않습니다.

BarcodeLib과 달리 구매 전에 IronBarcode를 평가할 수 있나요?

예. IronBarcode의 평가판 모드는 완전한 디코딩된 바코드 값을 반환하며 생성된 출력 이미지에만 워터마크가 표시됩니다. 구매를 결정하기 전에 자신의 문서에서 판독 정확도를 벤치마킹할 수 있습니다.

바코드라이브와 IronBarcode의 가격 차이는 무엇인가요?

개발 및 프로덕션을 포함하는 단일 개발자 영구 라이선스의 IronBarcode 가격은 $749부터 시작합니다. 가격 세부 정보 및 볼륨 옵션은 IronBarcode 라이선스 페이지에서 확인할 수 있습니다. 별도의 런타임 라이선스 요구 사항은 없습니다.

BarcodeLib에서 IronBarcode로 마이그레이션하는 것은 간단합니까?

BarcodeLib에서 IronBarcode로의 마이그레이션에는 주로 인스턴스 기반 API 호출을 IronBarcode의 정적 메서드로 대체하고, 라이선스 상용구를 제거하고, 결과 속성 이름을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션에는 코드를 추가하기보다는 줄이는 작업이 포함됩니다.

IronBarcode는 로고가 있는 QR 코드를 생성하나요?

예. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 구성 가능한 오류 수정을 통해 기본적으로 브랜드 이미지를 QR코드에 임베드합니다. ChangeBarCodeColor()를 통해 컬러 QR 코드도 지원됩니다.

Curtis Chau
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해