푸터 콘텐츠로 바로가기
동영상

C#을 사용하여 바코드 코드에서 비동기 및 멀티스레딩을 사용하는 방법

QRCoder에서 IronBarcode로의 마이그레이션

이 가이드는 QRCoder로 프로젝트를 시작하여 QR 코드 생성 이상의 기능이 필요하게 된 개발팀을 위해 작성되었습니다. QRCoder는 의도된 범위에 맞게 잘 관리되고 품질이 우수한 라이브러리이며, 마이그레이션은 그 품질을 반영하는 것이 아닙니다. 이는 QRCoder가 설계된 범위를 벗어나는 요구 사항(형식 확장, 바코드 판독, PDF 통합 등)에 대한 대응입니다. 이 가이드는 QRCoder에서IronBarcode로의 전환에 대한 전체 기술적 과정을 다룹니다. 패키지 교체, 네임스페이스 변경, 모든 일반적인 패턴에 대한 코드 변환, API 동등성 매핑, 그리고 전환 과정에서 발생하는 문제에 대한 해결책을 포함합니다.

QRCoder에서 마이그레이션해야 하는 이유

QR 코드 외 형식 요구 사항: QRCoder는 QR 코드만 생성합니다. 프로젝트가 성장하면서 물류를 위한 Code 128 레이블, 소매 제품 식별을 위한 EAN-13 코드, 제약 시리얼화를 위한 데이터매트릭스 또는 정부 문서 준수를 위한 PDF417이 요구되는 경우, 각 추가 형식에 대해 별도의 라이브러리를 도입해야 합니다. 필요한 형식의 수가 증가함에 따라 독립적인 패키지, API 및 유지 관리 의무의 수도 증가합니다.

바코드 판독 요구 사항: QRCoder는 바코드 판독 API를 제공하지 않습니다. QRCoder는 바코드 생성 전용 라이브러리로 설계되었습니다. 수신 이미지에서 QR 코드를 디코딩하거나, 스캔한 문서의 바코드를 확인하거나, 배송 라벨을 처리해야 하는 모든 애플리케이션은 QRCoder와 함께 전용 읽기 라이브러리를 추가해야 합니다. 두 번째 라이브러리는 자체적인 API 인터페이스, 업데이트 주기, 그리고 .NET 업그레이드 시마다 발생하는 호환성 문제를 가지고 있습니다.

다중 라이브러리 유지 관리: QR코더 기반 프로젝트의 현실적인 라이브러리 누적 패턴은 QR 코드 생성을 위한 QR코더 라이브러리부터 배송 라벨용 1D 바코드 라이브러리, 그리고 디코딩을 위한 읽기 라이브러리까지 이어집니다. 세 개 또는 네 개의 독립적인 패키지를 관리한다는 것은 각각의 릴리스 노트를 추적하고, 패키지 중 하나가 업데이트될 때 버전 충돌을 해결하며, 개발 팀 전체가 여러 API에 익숙해지도록 유지해야 함을 의미합니다. 유지보수 부담은 초기 통합 예상치에는 나타나지 않는 방식으로 시간이 지남에 따라 누적됩니다.

PDF 지원: PDF 문서에 바코드를 삽입하거나 들어오는 PDF 파일에서 바코드를 추출하는 기능은 QRCoder의 범위에 포함되지 않습니다. 송장 처리, PDF 템플릿을 이용한 라벨 생성, 규정 준수 보고 등 문서 처리 파이프라인은 이러한 한계에 일찍 부딪힙니다. QRCoder와 함께 전용 PDF 라이브러리를 추가하거나, 바코드 생성과 PDF 생성을 별도의 하위 시스템을 통해 처리하도록 아키텍처를 설계해야 합니다.

근본적인 문제

QRCoder는 QR 코드 생성을 효율적으로 해결합니다. 요구사항이 QR 기준을 넘어서는 순간, 코드베이스는 각 공백을 채우기 위해 추가 패키지를 가져오기 시작해야 합니다.

// QR코더 handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
// QR코더 handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrCodeData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10))

' Now the shipping team asks for Code 128 — add NetBarcode
' Now the warehouse needs to scan barcodes — add ZXing.Net
' Now a report needs a barcode in a PDF — add a PDF library
' Each addition: new namespace, new API, new maintenance cycle
$vbLabelText   $csharpLabel

IronBarcode 바코드 생성, 읽기 및 PDF 통합을 하나의 API로 통합합니다.

//IronBarcode— one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
//IronBarcode— one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
Imports IronBarCode

' Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode).SaveAsPng("qr.png")

' Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128).SaveAsPng("label.png")

' Read a barcode from an image — built in
Dim results = BarcodeReader.Read("incoming.png")
$vbLabelText   $csharpLabel

IronBarcode와 QRCoder의 기능 비교

기능 QR코더 IronBarcode
QR 코드 생성 네, 아주 좋습니다.
마이크로 QR 아니요
코드 128 / 코드 39 아니요
EAN-13 / UPC-A 아니요
데이터매트릭스 아니요
PDF417 아니요
아즈텍 아니요
총 형식 1 50세 이상
바코드 판독 아니요 예, 자동 감지
PDF 바코드 추출 아니요
PDF 바코드 스탬핑 아니요
로고 삽입
색상 맞춤 설정
SVG 출력
페이로드 생성기 도우미 아니요 — 수작업 현악기 제작
외부 의존성 제로 자급자족
특허 MIT — 제한 없음 상업적 — Lite 티어는 단일 개발자를 포함합니다

빠른 시작: QRCoder에서IronBarcode로 마이그레이션

1단계: NuGet 패키지 교체

프로젝트에서 QRCoder를 제거하세요:

dotnet remove package QRCoder
dotnet remove package QRCoder
SHELL

IronBarcode 설치하세요:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

프로젝트에서 바코드 판독을 위해 ZXing .NET 과 QRCoder를 함께 사용하고 있었다면, 이 단계에서 해당 패키지를 제거할 수 있습니다.

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
SHELL

단계 2: 네임스페이스 업데이트

QRCoder 네임스페이스 가져오기를IronBarcode네임스페이스로 바꾸십시오.

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

단계 3: 라이선스 초기화

애플리케이션 시작 시 라이선스 초기화 추가 — Program.cs, Startup.cs, 또는 정적 생성자:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

등록 절차 없이 무료 체험판 키를 이용할 수 있습니다. 실제 운영 환경에 배포하려면 라이선스를 구매해야 합니다.

코드 마이그레이션 예제

기본 QR 코드 생성

가장 일반적인 QR코더 패턴은 세 개의 객체를 필요로 합니다: QRCodeGenerator 인스턴스, QRCodeData 중간 객체, 그리고 PngByteQRCode와 같은 렌더러 클래스.IronBarcode에서는 단 하나의 정적 호출로 이 체인이 대체됩니다.

QR코더 접근 방식:

using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}
Imports QRCoder

Public Class BarcodeService
    Private ReadOnly _generator As New QRCodeGenerator()

    Public Function GenerateQR(content As String) As Byte()
        Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
        Dim qrCode = New PngByteQRCode(qrCodeData)
        Return qrCode.GetGraphic(10) ' 10px per module
    End Function
End Class
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}
Imports IronBarCode

Public Class BarcodeService
    Public Function GenerateQR(content As String) As Byte()
        Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
            .ResizeTo(200, 200) _
            .ToPngBinaryData()
    End Function
End Class
$vbLabelText   $csharpLabel

BarcodeWriter는 정적 클래스입니다 — 인스턴스가 필요 없으며, 중간 데이터 객체도 없습니다. ResizeTo(width, height) 메서드는 QRCoder가 GetGraphic에서 수용하는 모듈 당 픽셀 값 정수를 대체합니다. QRCoder가 모듈 개수로 출력을 크기 조절하는 곳에서는 (예: 모듈 당 10px 이미지를 위한 GetGraphic(10)), IronBarcode는 절대 픽셀 크기를 사용합니다.

QR 코드를 파일에 저장하기

QRCoder는 터미널 단계에서만 메모리 내 바이트와 파일 출력을 분리하며, 렌더러 체인은 동일합니다.IronBarcode동일한 체인에서 서로 다른 터미널 방식을 사용합니다.

QR코더 접근 방식:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();
Imports IronBarCode

' Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("output.png")

' Or obtain bytes for in-memory use
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

SaveAsPng 메서드는 디스크에 직접 기록하는 터미널입니다. ToPngBinaryData는 스트리밍, HTTP 응답, 또는 데이터베이스 저장을 위한 byte[]를 반환합니다.

SVG 출력

QR코더 접근 방식:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");
Imports IronBarCode

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsImage("output.svg")
$vbLabelText   $csharpLabel

SvgQRCode 렌더러 클래스와 그 GetGraphic 호출은 한 개의 SaveAsImage 터미널 메서드로 수렴됩니다 (SVG 출력을 위해 .svg 확장을 전달하면).

오류 정정 레벨 매핑

QRCoder는 모든 CreateQrCode 호출에서 QRCodeGenerator.ECCLevel 열거형을 사용하여 명시적인 ECC 선택을 요구합니다. IronBarcode는 BarcodeWriter.CreateBarcode를 사용할 때 합리적인 기본값을 적용하고 QRCodeWriter.QrErrorCorrectionLevel를 통해 명시적인 제어를 노출합니다.

QR코더 접근 방식:

using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);
Imports QRCoder

Dim generator As New QRCodeGenerator()

' Medium — suitable for most generation without logos
Dim dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)

' High — required when a logo will occlude part of the code
Dim dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");
Imports IronBarCode

' Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("default-ecc.png")

' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
$vbLabelText   $csharpLabel

레벨 매핑은 다음과 같습니다: ECCLevel.LLow, ECCLevel.MMedium, ECCLevel.QHigh, ECCLevel.HHighest.

로고 삽입

두 라이브러리 모두 QR 코드에 로고를 삽입하는 기능을 지원합니다. QRCoder는 System.Drawing.Bitmap 매개변수로 QRCode 렌더러 클래스를 통해 라우팅합니다 (PngByteQRCode 제외). IronBarcode는 URL 및 로고에 대한 파일 경로를 수용하는 전용 팩토리 메서드 QRCodeWriter.CreateQrCodeWithLogo()를 제공합니다. QR 코드 스타일 맞춤 설정 가이드 에는 로고 크기, 위치 및 색상 조합 옵션이 포함되어 있습니다.

QR코더 접근 방식:

using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging

Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)

Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");
Imports IronBarCode

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
    .SaveAsPng("qr-logo.png")
$vbLabelText   $csharpLabel

System.Drawing.Bitmap 종속성이 제거되었습니다 — CreateQrCodeWithLogo는 내용과 로고 이미지 모두에 대한 파일 경로 문자열을 허용합니다. 로고 임베딩에 필요한 수준으로 자동으로 오류 수정이 설정됩니다; 명시적인 ECC 설정이 필요하지 않습니다.

페이로드 생성기.WiFi 마이그레이션

QRCoder의 PayloadGenerator.WiFi는 표준 WiFi QR 페이로드 문자열을 형식화합니다. 출력 형식은 QR 코드 사양에 의해 정의된 공개 표준 WIFI:T:{auth};S:{ssid};P:{password};;입니다. 마이그레이션 시 이러한 문자열은 직접 구성할 수 있습니다.

QR코더 접근 방식:

using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));
Imports QRCoder

Dim wifi = New PayloadGenerator.WiFi(
    ssid:="OfficeNetwork",
    password:="SecurePass123",
    authenticationMode:=PayloadGenerator.WiFi.Authentication.WPA
)
' wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
$vbLabelText   $csharpLabel

IronBarcode 접근 방식:

using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");
Imports IronBarCode

' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("wifi.png")
$vbLabelText   $csharpLabel

여러 PayloadGenerator 유형을 사용하는 팀의 경우 (vCard, CalendarEvent, Geo, SMS), 접근 방식은 동일합니다: 각 생성기가 생성하는 형식화된 문자열을 그 .ToString() 출력을 사용하여 식별하고, 그 문자열을 직접 또는 작은 정적 도우미 메서드를 통해 구성합니다.

QR코더 API와IronBarcode매핑 참조

QR코더 IronBarcode 노트
new QRCodeGenerator() 정적 클래스 — 인스턴스 없음 BarcodeWriter는 인스턴스화가 필요 없습니다
qrGenerator.CreateQrCode(data, ECCLevel.M) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) 직접 교체
new PngByteQRCode(qrCodeData) 필요 없음 렌더링은 플루언트 프로세스의 일부입니다.
qrCode.GetGraphic(20)은/는 byte[]을/를 반환합니다 .ToPngBinaryData() 크기는 .ResizeTo(w, h)을 통해
File.WriteAllBytes(path, bytes) 패턴 .SaveAsPng(path) GeneratedBarcode에서의 터미널 메서드
new SvgQRCode(qrCodeData).GetGraphic(10) .SaveAsImage(path) SVG 출력을 위해 .svg 확장 전달
new QRCode(qrCodeData).GetGraphic(...) QRCodeWriter.CreateQrCode(data, size, level) 로고 및 색상 맞춤 설정에 사용됩니다.
QRCodeGenerator.ECCLevel.L QRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.M QRCodeWriter.QrErrorCorrectionLevel.Medium 지정되지 않은 경우 기본값
QRCodeGenerator.ECCLevel.Q QRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.H QRCodeWriter.QrErrorCorrectionLevel.Highest 로고 삽입에 필요합니다
PayloadGenerator.WiFi(...).ToString() "WIFI:T:WPA;S:{ssid};P:{pass};;" 표준 문자열을 직접 구성합니다.
PayloadGenerator.ContactData(...).ToString() "BEGIN:VCARD\n..." vCard는 공개 표준입니다.
읽기 API 없음 BarcodeReader.Read(path) 새로운 기능 - 별도의 라이브러리 필요 없음
QR 형식만 지원합니다. 50개 이상의 형식은 BarcodeEncoding.*을 통해 새로운 기능

일반적인 마이그레이션 문제와 해결책

문제 1: PayloadGenerator 문자열 형식 변경

QRCoder: PayloadGenerator.WiFi, PayloadGenerator.ContactData 및 기타 도우미들이 자동으로 형식화된 문자열을 생성합니다. 코드는 도우미 객체의 .ToString() 출력을 CreateQrCode에 전달합니다.

해결책:PayloadGenerator 유형이 생성하는 문자열을 식별합니다 — 그 형식은 QR 코드 사양에 문서화되어 있으며, 재생산하기 간단합니다. WiFi의 경우: WIFI:T:WPA;S:{ssid};P:{password};;. vCard의 경우: 표준 BEGIN:VCARD / END:VCARD 블록. 여러 호출 지점에서 동일한 페이로드 유형을 사용하는 경우 정적 헬퍼 메서드를 작성하세요.

public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
    Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
$vbLabelText   $csharpLabel

문제 2: ECCLevel 열거형 매핑

QRCoder: QRCodeGenerator.ECCLevel은/는 값이 L, M, Q, H인 중첩 열거형입니다. 모든 CreateQrCode 호출에 필수 매개변수입니다.

해결책: QRCodeWriter 경로를 사용할 때 각 값을 QRCodeWriter.QrErrorCorrectionLevel와 동급으로 매핑합니다. BarcodeWriter.CreateBarcode를 사용할 때 ECC 레벨은 자동으로 Medium으로 기본 설정되고 매개변수를 요구하지 않습니다. 각 통화 사이트를 업데이트하세요:

// QR코더 ECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// QR코더 ECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
// QR코더 ECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// QR코더 ECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' QR코더 ECCLevel.H →IronBarcode QrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)

' QR코더 ECCLevel.M →IronBarcode default (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
$vbLabelText   $csharpLabel

문제 3: 렌더러 클래스 제거

QRCoder: 각 출력 형식은 자신의 렌더러 클래스 인스턴스화가 필요합니다 — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode. 이 클래스들은 QRCodeData를 수용하고, 서로 다른 반환 유형을 갖는 GetGraphic을 노출합니다.

해결 방법: 모든 렌더러 클래스 인스턴스화를 제거합니다.IronBarcode플루언트 체인의 터미널 메서드에 형식 출력 기능을 내장합니다. .ResizeTo() 이후 new PngByteQRCode(data).GetGraphic(n)을/를 .ToPngBinaryData()으로 대체합니다. new SvgQRCode(data).GetGraphic(n)을/를 .SaveAsImage(path)으로 대체합니다 (패싱 .svg 확장). QRCodeData 중간 객체도 사라집니다 — 이것은 IronBarcode에서는 필요하지 않습니다.

문제 4: PngByteQRCode 제거 및 모듈 기반 크기 조정

QRCoder: PngByteQRCode.GetGraphic(int pixelsPerModule)는 QR 모듈 당 픽셀 수로 출력을 크기 조절합니다. 결과 이미지 크기는 모듈 수에 따라 달라지며, 모듈 수는 콘텐츠 길이와 ECC 레벨에 따라 변동합니다.

해결책: 모듈 기반 크기 설정을 절대 픽셀 크기 ResizeTo(int width, int height)로 대체합니다. 모듈 개수를 기반으로 예상 출력 크기를 동적으로 계산하는 코드를 사용했다면, 출력 요구 사항을 충족하는 고정된 목표 크기로 변경하십시오.

// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();
Imports System

' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)

' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
    .ResizeTo(400, 400) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

QR코더 마이그레이션 체크리스트

이동 전 작업

변경 작업을 하기 전에 QR코더 사용 부분을 모두 검토하십시오.

# Find all QR코더 namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
# Find all QR코더 namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
SHELL
  • 사용 중인 모든 PayloadGenerator 유형을 문서화하고 그 문자열 출력 형식을 기록합니다
  • 사용 중인 모든 ECC 레벨 값과 해당 호출 위치를 기록해 두십시오.
  • QRCoder와 연동하여 디코딩에 사용된 ZXing .NET 읽기 코드가 있으면 해당 코드를 찾아 교체하십시오. -IronBarcode라이선스 키를 발급받으세요 (체험판 키는 등록 없이 사용 가능합니다).

코드 업데이트 작업

  1. dotnet remove package QRCoder 실행
  2. 만약 QRCoder와 함께 읽기 전용으로만 사용되었다면 dotnet remove package ZXing.Net 실행
  3. dotnet add package IronBarcode 실행
  4. 애플리케이션 시작 시 IronBarCode.License.LicenseKey = "YOUR-KEY"; 추가
  5. 모든 using QRCoder; 가져오기를 using IronBarCode;으로 대체
  6. 모든 new QRCodeGenerator() 인스턴스 선언 제거 — BarcodeWriter는 정적입니다
  7. 모든 generator.CreateQrCode(data, ECCLevel.X) + 렌더러 체인 패턴을 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) 체인으로 대체
  8. .GetGraphic(n) 호출을 .ToPngBinaryData()으로 대체하고 터미널 앞에 .ResizeTo(w, h) 추가
  9. File.WriteAllBytes(path, bytes) 저장 패턴을 .SaveAsPng(path) 터미널 메서드로 대체
  10. new SvgQRCode(data).GetGraphic(n)을/를 .SaveAsImage(path)으로 대체 (패싱 .svg 확장)
  11. PayloadGenerator.WiFi(...) 및 기타 도우미 인스턴스화를 직접 형식 문자열로 대체
  12. QRCodeGenerator.ECCLevel 값을 그것의 QRCodeWriter.QrErrorCorrectionLevel 동급으로 매핑
  13. ZXing.Net BarcodeReaderGeneric.Decode(bitmap) 호출을 BarcodeReader.Read(path)으로 대체
  14. 로고 삽입을 위해 new QRCode(data).GetGraphic(n, ..., logoBitmap)을/를 QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)으로 대체

마이그레이션 후 테스트

  • 생성된 모든 QR 코드를 최소 두 개 이상의 독립적인 QR 코드 스캐너 애플리케이션으로 스캔하여 가독성을 확인하십시오.
  • 로고 임베드 QR 코드가 올바르게 스캔되는지 확인 — 오류 수정 레벨이 Highest인지 확인
  • 생성된 코드의 시각적 출력을 마이그레이션 전 샘플과 비교하여 외관상 일관성이 요구되는 경우 확인합니다.
  • 모든 PayloadGenerator 교체를 테스트 — WiFi, vCard 및 기타 페이로드 문자열이 대상 기기에서 올바르게 디코딩되는지 확인
  • ZXing.Net 또한 제거된 경우 모든 바코드 읽기 경로가 BarcodeReader.Read을 통해 동작하는지 확인
  • QR코더 또는 ZXing .NET 참조로 인해 바인딩 오류가 발생하는지 확인하기 위해 깨끗한 환경에서 애플리케이션을 실행하십시오.
  • 프로덕션 및 스테이징 환경에서IronBarcode라이선스 키가 올바르게 로드되었는지 확인합니다.

IronBarcode로 마이그레이션할 때의 주요 이점

모든 바코드 작업을 위한 단일 API: 마이그레이션 후, 생성, 읽기, PDF 스탬핑과 같은 모든 바코드 작업은 동일한 IronBarCode 네임스페이스와 동일한 진입점을 사용합니다. 프로젝트에 참여하는 개발자는 세 가지 API가 아닌 하나의 API만 배우게 됩니다. 바코드 하위 시스템 전반에 걸친 코드 검토가 일관성을 갖게 됩니다. 문서 검색 기능이 중앙 집중화되어 있습니다.

두 번째 라이브러리 없이 바코드 읽기: BarcodeReader.Read는 이미지 파일, PDF 페이지, 스트림, 그리고 메모리 내 비트맵을 자동 형식 감지로 처리합니다. 이전에는 ZXing .NET 을 사용해야만 가능했던 읽기 기능(형식 지정 요구 사항 및 스레드 안전성 고려 사항 포함)이 이제 단일 메서드 호출을 통해 즉시 사용 가능해졌습니다. 이미지에서 바코드를 읽는 방법에 대한 가이드 에서는 다중 바코드 감지, 이미지 전처리 및 PDF 페이지 스캔에 대해 다룹니다.

새로운 종속성 없이 형식 확장: 마이그레이션 후 Code 128, EAN-13, DataMatrix, PDF417또는 지원되는 다른 형식을 추가하려면 단지 BarcodeEncoding 매개변수 값만 변경하면 됩니다. 새로 설치해야 할 패키지도 없고, 배워야 할 새로운 API도 없으며, 버전 호환성 문제를 관리할 필요도 없습니다. 새로운 형식 요구 사항은 새로운 라이브러리 통합이 아닌 단 한 줄의 변경으로 해결됩니다.

단순화된 QR 코드 사용자 지정: 로고 삽입, 색상 변경, 정지 영역 제어는 QRCodeWriter 결과에서 명명된 메서드로 사용할 수 있습니다. 로고 임베드를 위해 QRCoder가 요구하는 System.Drawing.Bitmap 종속성은 간단한 파일 경로 문자열로 대체됩니다. QR 코드 스타일 맞춤 설정 가이드 에는 사용 가능한 모든 맞춤 설정 옵션이 설명되어 있습니다.

PDF 통합 기능 내장: 별도의 PDF 라이브러리 추가 없이 들어오는 PDF 문서에서 바코드를 읽어 기존 PDF 파일에 바코드를 삽입할 수 있습니다. PDF 파일이 별도로 필요했던 문서 처리 워크플로에 이제 바코드와 PDF 기능이 통합되었습니다.

장기 유지 관리 부담 감소: 세 개 또는 네 개의 독립적인 패키지를 하나로 통합하면 여러 릴리스 주기를 추적하고, 라이브러리 간 버전 충돌을 해결하고, .NET 버전이 업데이트될 때 여러 테스트 스위트를 업데이트하는 데 드는 누적된 부담을 없앨 수 있습니다. 바코드 하위 시스템의 유지 관리 비용은 단일 패키지 종속성으로 줄어듭니다.

참고해 주세요NetBarcode, QRCoder, 및 ZXing.NET은 각각의 소유자의 등록 상표입니다. 이 사이트는 NetBarcode, QRCoder, 또는 ZXing.NET과 관련이 없으며, 후원하거나 지원받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

자주 묻는 질문

QRCoder.NET에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?

일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.

QRCoder API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?

인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.

QRCoder.NET에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?

대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.

마이그레이션하는 동안 QRCoder.NET과 IronBarcode를 모두 설치해야 하나요?

아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.

IronBarcode의 NuGet 패키지 이름은 무엇인가요?

패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.

IronBarcode는 QRCoder.NET과 비교하여 Docker 배포를 어떻게 간소화하나요?

IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.

QRCoder에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?

예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.

IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?

예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.

IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?

IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.

QRCoder.NET에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?

일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.

CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?

IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.

IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?

예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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