Developer’s Guide to Adding a .NET Barcode Scanner API

Graphic showing barcode scanning results on an iPhone using the Scandit .NET Barcode Scanner SDK for iOS

Published

Last updated

Categories Developers

In short:

  • In 2026, the easiest way to add a .NET barcode scanner API for iOS, Android, and MAUI apps is to combine barcode scanning Agent Skills with an AI coding tool.
  • Choose barcode scanning Agent Skills provided by a recognized barcode scanning vendor to autonomously integrate production-ready code without performance issues or UX headaches.
  • Barcode scanning Agent Skills for .NET eliminate the need to hunt through documentation to identify the right product or go through multiple fix-and-try loops.
  • If you’re not using an AI coding assistant, adding a .NET barcode scanner requires manually choosing the right API, adding the supported symbologies for your use case, configuring the appropriate scanning features, customizing the user interface, and adding error handlers.

In 2026, the easiest way to add a .NET barcode scanner API for iOS, Android, and MAUI apps is to use an AI coding tool with barcode scanning Agent Skills published by a recognized vendor of barcode scanner APIs. With a few prompts, you get the ideal solution for your development framework, use case, and physical scanning environment without lengthy evaluation or customization.

This tutorial explains how to add barcode scanning to a .NET app using your AI coding assistant and Scandit Agent Skills. We’ve also included instructions for manually integrating a barcode scanning API and a comparison between Scandit and popular .NET barcode scanning APIs.

How do I use AI to add a barcode scanner for .NET?

To add a .NET barcode scanner using AI, invoke barcode scanning Agent Skills through your AI coding tool, such as GitHub Copilot, Claude, or Cursor. Once the Agent Skills create the optimal code, test your new features and performance under real-world conditions.

Domain-specific Agent Skills eliminate development guesswork by creating code that works in any barcode scanning environment. The key to improving scanning workflows and user adoption is getting navigation, interaction, and feedback right. Your app should help people do their jobs and ensure accurate data is entered into your system. The last things you want are user complaints because the scanner doesn’t perform under real-world business conditions.

Rather than forcing users to compensate for damaged labels, awkward label positions, or multiple barcodes, Agent Skills picks, customizes, and optimizes the features that help them excel in any situation.

Scandit Agent Skills bring 15 years of barcode, label, and ID scanning expertise directly into any AI coding tool, grounded by thousands of Scandit SDK deployments in various industries, facilities, and user types. Based on the Agent Skills Open Standard, they autonomously pick the optimal product and framework, customize workflows and UI, and generate production-ready application code.

Here’s how you can use your AI coding assistant and Scandit’s Agent Skills to add production-ready barcode scanning code to your .NET iOS, Android, or MAUI app.

1. Add production-ready barcode scanning code to your .NET project

  1. Install Scandit Agent Skills into your AI coding tool.

Any AI coding agent

Run this command:

npx plugins add scandit/skills 

Claude Code

Run these commands one at a time:

/plugin marketplace add scandit/skills
/plugin install scandit-sdk@scandit-plugins

Codex/ChatGPT app

Click here to install Scandit Agent Skills.

Codex CLI

Run these commands one at a time:

codex plugin marketplace add scandit/skills
codex plugin add scandit-sdk@scandit-plugins

Cursor

Click here to install Scandit Agent Skills.

GitHub Copilot

Run these commands one at a time:

copilot plugin marketplace add scandit/skills
copilot plugin install scandit-sdk@scandit-plugins

2. In your AI coding tool, describe your use case in plain language. More detail is better, including photos, such as the barcodes you want to scan. The Agent Skill will ask for more information and a Scandit license key, if necessary.

Here is an example prompt to add barcode scanning to an existing .NET iOS inventory app:

In this .NET iOS app, users currently add items to the inventory by typing in barcodes manually. Add camera-based barcode scanning to this flow.

- Use /sparkscan-net-ios, with a floating scan button.
- A scan looks up the item in existing inventory and adds it to the list, exactly like manual entry does. If the barcode isn't found, prompt to add it.
- Keep manual entry as is. Scanning is an additional input.
- Enable EAN-13, UPC-A, Code 128, and QR.
- Match the scanning UI to the app's design system.

We call the sparkscan-net-ios skill explicitly (sparkscan-net-android or sparkscan-net-maui for Android and MAUI apps, respectively), as it’s the fastest way to get a reliable barcode scanning experience, including all of Scandit’s AI barcode scanning features.

3. If you didn’t invoke a specific skill, the data-capture-sdk product-picker skill recommends the appropriate Scandit product and framework combination (e.g., SparkScan, BarcodeCapture, MatrixScan AR, MatrixScan Batch, MatrixScan Count, Smart Label Capture, etc.).

4. The matching product-and-framework skill (e.g., sparkscan-net-ios) autonomously integrates barcode scanner code into your .NET project.

5. If needed, use additional prompts to customize workflows, the user interface, data manipulation, and error handling, and to integrate with your backend system.

6. Review the generated code and test against production workflows. If changes are required, use your AI coding tool and Scandit Agent Skills to autonomously update the code.

2. Test barcode scanning performance in .NET

The best way to test your .NET barcode scanner API for iOS, Android, or MAUI is to run it using real user scenarios. Whether you’re using Scandit Agent Skills or another barcode scanning API, here are several performance-testing questions to ask:

  • Is there clear user guidance and feedback to foster smooth workflows rather than confuse scanning tasks?
  • Can you scan barcodes with reflections and glare?
  • Can you scan barcodes at a distance? Are you able to zoom in if needed?
  • Can you scan barcodes in different orientations, such as upside down and sideways? Flip the device upside down to see how the scanner performs.
  • Do you receive scanning feedback in loud environments and while wearing headphones?

You can use our sample sheet of barcodes to evaluate your app’s performance quickly and find out more about how to measure barcode scanning performance in our in-depth best practice guide.

START BARCODE SCANNING WITH .NET

Add production-ready barcode scanning fast with Scandit Agent Skills

How do I build a .NET barcode scanner manually?

To build a .NET barcode scanner manually for iOS, Android, or MAUI, first choose the appropriate SDK, then configure barcode symbology support, customize the UI, and test scanning under real-world conditions.

Using a pre-built barcode scanning component, such as Scandit SparkScan, solves many feature and integration challenges, reducing timelines and frustration. With SparkScan, you get:

  • AI-powered scanning that reduces unwanted scans by up to 100% and achieves a 0% false positive rate for all major barcodes.
  • High-speed scanning for any environment, including data-dense codes and tiny, torn, damaged, curved, and shiny barcodes.
  • Rapid decoding of barcodes even at long range, in low light, or at extreme angles.
  • UI elements to streamline scanning tasks, including a shutter button and camera preview that floats on top of any .NET app.
  • Customizable colors, sizes, and positions of UI elements to fit your app’s existing UI and branding.

SparkScan’s trigger button is designed not to obscure your app’s existing UI, with a semi-transparent background and the ability for users to drag to their preferred position. When not in use, the trigger button collapses, and the camera preview disappears to free up screen real estate.

Two iPhone screens showing a grocery order-picking app with annotations highlighting camera preview and movable barcode scanner trigger button features.

Integrating SparkScan is simple: you don’t need Ionic or any additional toolkits to get started. You can deploy it using the Scandit Agent Skills instructions above. Otherwise, follow these SparkScan instructions to add pre-built barcode scanning features to your app:

Jump to adding a .NET barcode scanner to iOS/MAUI

Jump to adding a .NET barcode scanner to Android/MAUI

Adding a .NET barcode scanner to iOS/MAUI

The prerequisites to add SparkScan to your iOS .NET app are:

  • The latest stable version of Visual Studio.
  • A .NET SDK.
  • A .NET for iOS project with a minimum iOS deployment target of 15.0 or higher.
  • A valid Scandit Data Capture SDK license key. You can sign up for a free test account at ssl.scandit.com.

1. Add the SDK

The Scandit Data Capture SDK is distributed as NuGet packages, which you get from the NuGet site.

You must add the Scandit.DataCapture.Core and Scandit.DataCapture.Barcode (the ScanditBarcodeCapture API) packages, which contain the functionality for barcode scanning. When developing a .NET MAUI application, you also need to add the Scandit.DataCapture.Core.Maui package.

You must also consider:

  • Camera permissions: When using SparkScan, you must set the camera as the frame source for various capture modes. On .NET for iOS, you have to set the “Privacy - Camera Usage Description” field in the Info.plist file.
  • When using the SparkScan SDK in a .NET MAUI application, you have to request camera permissions in your own application before starting scanning. To see how you can achieve this, take a look at our samples.

2. Create a new Data Capture Context instance

To add capture capabilities to your application, you must create a new Data Capture Context, which expects a valid Scandit Data Capture SDK license key during construction:

DataCaptureContext dataCaptureContext = DataCaptureContext.ForLicenseKey("-- ENTER YOUR SCANDIT LICENSE KEY HERE --");

3. Configure the SparkScan Mode

The SparkScan Mode is configured through SparkScanSettings, allowing you to register one or more listeners that are informed whenever a new barcode is scanned.

For this blog, we set up SparkScan for scanning EAN13 codes. Change this to the symbologies for your use case (for example, Code 128, Code 39).

SparkScanSettings settings = new SparkScanSettings();
HashSet<Symbology> symbologies = new HashSet<Symbology>()
{
    Symbology.Ean13Upca
};
settings.EnableSymbologies(symbologies);

Next, create a SparkScan instance with the settings initialized in the previous step:

SparkScan sparkScan = new SparkScan(settings);

4. Setup the SparkScan View

The SparkScan built-in user interface includes the camera preview and scanning UI elements. These guide the user through the scanning process.

The SparkScanView appearance is customized through SparkScanViewSettings.

SparkScanViewSettings viewSettings = new SparkScanViewSettings();
// setup the desired appearance settings by updating the fields in the object above

Next, add a SparkScanView to your view hierarchy. This automatically adds the scanning interface (camera preview and scanning UI elements) to your iOS application. The SparkScan view is automatically added to the provided parentView:

SparkScanView sparkScanView = SparkScanView.Create(parentView, dataCaptureContext, sparkScan, viewSettings);

See Workflow Options for instructions on changing the scanning mode, set camera preview behavior, and set the scanning behavior to either single scan or continuous scan.

When developing on .NET MAUI, the SparkScan view must be added as the last item to AbsoluteLayout or RelativeLayout, to make sure other UI components are visible:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scandit="clr-namespace:Scandit.DataCapture.Barcode.Spark.UI.Unified;assembly=ScanditBarcodeCaptureUnified">
<ContentPage.Content>
<AbsoluteLayout>
<!-- Your other UI components come here before SparkScanView -->
<scandit:SparkScanView x:Name="SparkScanView" AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All" DataCaptureContext="{Binding DataCaptureContext}"
SparkScan="{Binding SparkScan}" SparkScanViewSettings="{Binding ViewSettings}">
</scandit:SparkScanView>
</AbsoluteLayout>
</ContentPage.Content>
</ContentPage>

To ensure optimal start-up time and that scanning stops when the app goes into the background, call SparkScanView.ViewWillAppear() and SparkScanView.ViewWillDisappear() in your UIViewController’s ViewWillAppear and ViewWillDisappear callbacks:

public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);
    sparkScanView.ViewWillAppear();
}

public override void ViewWillDisappear(bool animated)
{
    base.ViewWillDisappear(animated);
    sparkScanView.ViewWillDisappear();
}

When developing on .NET MAUI, to ensure optimal start-up time, call SparkScanView.OnAppearing and SparkScanView.OnDisappearing in your Page.OnAppearing and Page.OnDisappearing callbacks:

protected override void OnAppearing()
{
    base.OnAppearing();
    this.SparkScanView.OnAppearing();
}

protected override void OnDisappearing()
{
    base.OnDisappearing();
    this.SparkScanView.OnDisappearing();

5. Register the listener to be informed when a new barcode is scanned

To keep track of the scanned barcodes, implement the ISparkScanListener interface and register the listener to the SparkScan mode.

// Register self as a listener to monitor the SparkScan session.
sparkScan.AddListener(this);

ISparkScanListener.OnBarcodeScanned() is called when a new barcode is scanned. This result is retrieved from the first object in the provided barcodes list: SparkScanSession.NewlyRecognizedBarcode. Note that this list only contains one barcode entry.

public void OnBarcodeScanned(SparkScan sparkScan, SparkScanSession session, IFrameData? data)
{
    Barcode? barcode = session.NewlyRecognizedBarcode;
    if (barcode == null)
    {
        return;
    }

    // This method is invoked from a recognition internal thread.
    // Run the specified action in the UI thread to update the internal barcode list.
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        // Update the internal list and the UI with the barcode retrieved above
        this.latestBarcode = barcode;
    });
}

Alternatively, to register the ISparkScanListener interface, it is possible to subscribe to corresponding events. For example:

sparkScan.BarcodeScanned += (object sender, SparkScanEventArgs args) =>
{
    Barcode? barcode = args.Session.NewlyRecognizedBarcode;
    if (barcode == null)
    {
        return;
    }

    // This method is invoked from a recognition internal thread.
    // Run the specified action in the UI thread to update the internal barcode list.
    DispatchQueue.MainQueue.DispatchAsync(() =>
    {
        // Update the internal list and the UI with the barcode retrieved above
        this.latestBarcode = barcode;

        // Emit sound and vibration feedback
        this.sparkScanView.EmitFeedback(new SparkScanViewSuccessFeedback());
    });
};

6. Customize the .NET iOS UI with advanced configurations

Using advanced configurations, uou can customize the SparkScan UI and UX to suit your needs and use cases. These customizations include the colors of all UI items (i.e., icons, buttons, toolbar), trigger button icon, size of the preview window, and more.

The graphic below shows three different examples of how colors, positions, and sizes can be customized to fit different iOS apps. 

Three customizations of the SparkScan user interface for .NET iOS, showing options for colors, positions, and sizes of different elements
Now your iOS app is ready to scan!

Adding a .NET barcode scanner to Android/MAUI

The prerequisites to add SparkScan to your Android .NET app are:

  • The latest stable version of Visual Studio.
  • A .NET SDK.
  • A .NET for Android project with target SDK version 23 (Android 6, Marshmallow) or higher.
  • A valid Scandit Data Capture SDK license key. You can sign up for a free test account at ssl.scandit.com.

1. Add the SDK

The Scandit Data Capture SDK is distributed as NuGet packages, which you get from the NuGet site.

You must add the Scandit.DataCapture.Core and Scandit.DataCapture.Barcode (the ScanditBarcodeCapture API) packages, which contain the functionality for barcode scanning. When developing a .NET MAUI application, you also need to add the Scandit.DataCapture.Core.Maui package.

You must also consider:

  • The Scandit SDK uses content providers to initialize scanning capabilities. If your content providers depend on the Scandit SDK, choose an initOrder lower than 10 to make sure the SDK is ready first. If not specified, initOrder is zero by default, and you have nothing to worry about. For more information, read the official Android <provider> documentation.
  • When using the SparkScan SDK in a .NET MAUI application, you have to request camera permissions in your own application before starting scanning. To see how you can achieve this, take a look at our samples.

2. Create a new Data Capture Context instance

To add capture capabilities to your application, you must create a new Data Capture Context, which expects a valid Scandit Data Capture SDK license key during construction:

DataCaptureContext dataCaptureContext = DataCaptureContext.ForLicenseKey("-- ENTER YOUR SCANDIT LICENSE KEY HERE --");

3. Configure the SparkScan Mode

The SparkScan Mode is configured through SparkScanSettings, allowing you to register one or more listeners that are informed whenever a new barcode is scanned.

For this blog, we set up SparkScan for scanning EAN13 codes. Change this to the symbologies for your use case (for example, QR Code, UPC Code).

SparkScanSettings settings = new SparkScanSettings();
HashSet<Symbology> symbologies = new HashSet<Symbology>()
{
    Symbology.Ean13Upca
};
settings.EnableSymbologies(symbologies);

Next, create a SparkScan instance with the settings initialized in the previous step:

SparkScan sparkScan = new SparkScan(settings);

4. Setup the SparkScan View

The SparkScan built-in user interface includes the camera preview and scanning UI elements. These guide the user through the scanning process.

The SparkScanView appearance is customized through SparkScanViewSettings.

SparkScanViewSettings viewSettings = new SparkScanViewSettings();
// setup the desired appearance settings by updating the fields in the object above

Next, add a SparkScanView to your view hierarchy. This automatically adds the scanning interface (camera preview and scanning UI elements) to your Android application. The SparkScan view is automatically added to the provided parentView (preferably an instance of SparkScanCoordinatorLayout):

SparkScanView sparkScanView = SparkScanView.Create(parentView, dataCaptureContext, sparkScan, viewSettings);

See SparkScan Workflow Options for instructions on changing the scanning mode, set camera preview behavior, and set the scanning behavior to either single scan or continuous scan.

When developing with .NET MAUI, the SparkScan view must be added as the last item to AbsoluteLayout or RelativeLayout, to make sure other UI components are visible:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scandit="clr-namespace:Scandit.DataCapture.Barcode.Spark.UI.Unified;assembly=ScanditBarcodeCaptureUnified">
<ContentPage.Content>
<AbsoluteLayout>
<!-- Your other UI components comes here before SparkScanView -->
<scandit:SparkScanView x:Name="SparkScanView" AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All" DataCaptureContext="{Binding DataCaptureContext}"
SparkScan="{Binding SparkScan}" SparkScanViewSettings="{Binding ViewSettings}">
</scandit:SparkScanView>
</AbsoluteLayout>
</ContentPage.Content>
</ContentPage>

Additionally, for MAUI, to ensure optimal start-up time and that scanning is stopped when the app goes into the background, make sure to call SparkScanView.OnAppearing and SparkScanView.OnDisappearing in your Page.OnAppearing and Page.OnDisappearing callbacks:

protected override void OnAppearing()
{
    base.OnAppearing();
    this.SparkScanView.OnAppearing();
}

protected override void OnDisappearing()
{
    base.OnDisappearing();
    this.SparkScanView.OnDisappearing();
}

To ensure the correct functioning of the SparkScanView, call sparkScanView.onPause() and sparkScanView.onResume() in your Fragment/Activity onPause and onResume callbacks:

protected override void OnPause()
{
    sparkScanView.OnPause();
    base.OnPause();
}

protected override void OnResume()
{
    sparkScanView.OnResume();
    base.OnResume();
}

5. Register the listener to be informed when a new barcode is scanned

To keep track of the scanned barcodes, implement the ISparkScanListener interface and register the listener to the SparkScan mode.

// Register self as a listener to monitor the SparkScan session.
sparkScan.AddListener(this);

ISparkScanListener.OnBarcodeScanned() is called when a new barcode is scanned. This result is retrieved from the first object in the provided barcodes list: SparkScanSession.NewlyRecognizedBarcode. Note that this list only contains one barcode entry.

public void OnBarcodeScanned(SparkScan sparkScan, SparkScanSession session, IFrameData? data)
{
    Barcode? barcode = session.NewlyRecognizedBarcode;
    if (barcode == null)
    {
        return;
    }

    // This method is invoked from a recognition internal thread.
    // Run the specified action in the UI thread to update the internal barcode list.
    RunOnUiThread(() =>
    {
        // Update the internal list and the UI with the barcode retrieved above
        this.latestBarcode = barcode;
    });
}

Alternatively, to register the ISparkScanListener interface, you can subscribe to corresponding events. For example:

sparkScan.BarcodeScanned += (object sender, SparkScanEventArgs args) =>
{
    Barcode? barcode = args.Session.NewlyRecognizedBarcode;
    if (barcode == null)
    {
        return;
    }

    // This method is invoked from a recognition internal thread.
    // Run the specified action in the UI thread to update the internal barcode list.
    RunOnUiThread(() =>
    {
        // Update the internal list and the UI with the barcode retrieved above
        this.latestBarcode = barcode;
    });
};

6. Customize the scanning UI with advanced configurations

You can customize the SparkScan UI using advanced configurations. This includes changing UI element colors (i.e., icons, buttons, toolbar), the trigger button icon, the size of the preview window, and more.

The graphic illustrates different examples of how to adjust colors, positions, and sizes to suit different UX scenarios.

Three customizations of the SparkScan user interface for .NET Android, showing options for colors, positions, and sizes of different elements
Now your Android app is ready to scan barcodes!

Close up damaged label with SparkScan boxes on shelves

BARCODE SCANNING IN .NET MADE EASY

Integrate with just a few lines of code or use our samples

How Scandit supports .NET barcode scanning

Scandit’s .NET Barcode Scanner SDK is an AI-powered capture engine and Agent Skills knowledge base that adapts to any workflow and edge case. Proven across hundreds of billions of scans on many device types and frameworks, our software scans the right code every time, regardless of label or environmental condition.

Scandit’s performance

Here’s what you get with the Scandit .NET Barcode Scanner SDK:

  • Zero false positives for all major barcode symbologies.
  • Greater than 99% accuracy for common barcode symbologies.
  • Decode speeds of 480 scans per minute, faster than human perception.
  • Reliable barcode scanning under less-than-ideal conditions: tiny, torn, damaged, curved, or shiny barcodes, long scan ranges, low light, and extreme angles.
  • Successful captures with camera resolutions as low as 240x320 pixels and barcode resolutions as low as 0.5 pixels per thin barcode element.

The Scandit Vision AI Engine is the intelligence behind the Scandit Smart Data Capture Platform, which powers our barcode, ID, and label scanning, as well as ShelfView products. Additionally, the Scandit .NET Barcode Scanner SDK is built on a C/C++ foundation, ensuring core features load efficiently in the background and consume minimal system resources.

Framework support

In addition to .NET iOS, Android, and MAUI, Scandit barcode scanning SDKs are available for Native iOS, Native Android, Cordova, Xamarin and Xamarin.Forms, React Native, JavaScript, Flutter, Capacitor, and Titanium.

Security and privacy

Scandit follows a security by design approach, giving you complete control over data collection and processing. This means:

  • All image processing happens on the device to ensure scanning confidentiality and high availability.
  • Any data you choose to share with Scandit is encrypted during transit and at rest.
  • Scandit is ISO 27001:2022 Certified and compliant with applicable privacy regulations, including GDPR and CCPA.

For a complete barcode scanner SDK evaluation kit, read our guide to choosing the best barcode scanner SDK for your app.

How does Scandit compare with ML Kit and ZXing for .NET barcode scanning?

Here’s a table showing how we believe Scandit compares with the free ML Kit and ZXing barcode scanning libraries for .NET apps. The versions compared are current as of July 2026, with ZXing in maintenance mode since 2019.

In summary, choose Scandit for production apps that require native .NET support, zero false positives, pre-built workflows, AI scanning features, and enterprise-grade support SLAs. Use ML Kit when you need the additional capabilities of Google’s machine vision APIs. Use ZXing only when its maintenance status and features fit your risk profile.

Product features

Category

Scandit

ML Kit

ZXing

Native support for .NET iOS, Android, and MAUI

✓ Yes

✕ No

Android bindings available through Microsoft/Xamarin

✕ No

Third-party wrappers available

Supported symbologies

1D formats:

Codabar, Code 11, Code 25, Code 32, Code 39, Code 93, Code 128, EAN-2, EAN-5, EAN-8, EAN-13, GS1 DataBar, IATA 2 of 5, ITF, JAN, Matrix 2 of 5, MSI Plessey, UPC-A, UPC-E

2D formats:

ArUco, Aztec, Data Matrix, Data Matrix Direct Part Marking (DPM), Data Matrix Rectangular Extension, DotCode, Micro PDF417, MaxiCode, Micro QR Code, PDF417, QR Code, Rectangular Micro QR Code

GS1 Composite Codes (A, B, C)

Postal codes:

Australia Post, French Postal Code (La Poste), KIX (Klant index), Posi LAPA 4 State Code, Royal Mail 4 State Customer Code (RM4SCC), Swiss Post, UPU (Universal PRM4SCC Barcode Symbology | Scanditostal Union) S18 4-State Code, USPS Intelligent Mail

Additional formats:

GS1 Data Carrier, 3D barcodes

1D formats:

Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E

2D formats:

Aztec, Data Matrix, PDF417, QR Code


1D formats:

Codabar, Code 39, Code 93, Code 128, EAN-8, EAN-13, ITF, UPC-A, UPC-E, UPC/EAN Extension 2/5

2D formats:

Aztec, Data Matrix, MaxiCode, PDF417, QR Code, RSS-14, RSS-Expanded


Automatic symbology detection

✓ Yes

✓ Yes

✓ Yes

Multiple barcode scanning

✓ Yes**

✓ Yes

✕ No*

Works with any orientation

✓ Yes

✓ Yes

✕ No

Gesture support

✓ Yes

✓ Yes

✕ No

Augmented reality assistance

✓ Yes

✕ No

Not natively (can be added with ARCore)

✕ No

Simultaneous barcode and text scanning data capture

✓ Yes

✕ No

✕ No

Low-level machine vision APIs

✕ No

✓ Yes

✕ No

Improved image capture using AI

✓ Yes

✕ No

Not natively (can be added with other Google APIs)

✕ No

Context-based scanning using AI

✓ Yes

✕ No

✕ No

Turnkey app

✓ Yes

Scandit Express

✕ No

✕ No

Includes barcode scanning Agent Skills

✓ Yes

(Scandit Agent Skills)

✕ No

✕ No

Native support for Expo

✓ Yes

✕ No

✕ No

User interface/pre-built components

✓ Yes

✕ No

✕ No

Enterprise support and SLAs

✓ Yes

Full lifecycle support from trial to production; 24/7 support available

✓ Yes

Available through Google Cloud Customer Care

✕ No

*According to the ZXing documentation, it detects multiple barcodes by repeatedly decoding portions of the image. After one barcode is found, the areas left, above, right, and below it are scanned recursively.

**The Scandit SDK detects multiple barcodes in full-frame images in real-time, and tracks their positions as they move in and out of frame.

Security and compliance

Security category

Scandit

ML Kit

ZXing

On-device processing

✓ Yes

✓ Yes

✓ Yes

Scans offline

✓ Yes

✓ Yes

✓ Yes

Data encryption (in-transit and at-rest)

✓ Yes

✓ Yes

✕ No

Usage tracking

✓ Yes

Customers can choose whether metadata is transferred to external servers or not. Data is only transmitted for debugging, statistical analysis, performance monitoring, improvements and/or license compliance purposes.

✓ Yes

Data collected is listed here.

✕ No

CCPA

✓ Yes

✓ Yes

Via Google Cloud

✕ No

GDPR

✓ Yes

✓ Yes

Via Google Cloud

✕ No

ISO 27001

✓ Yes

✓ Yes

Via Google Cloud

✕ No

These results are based on side-by-side feature comparisons in April 2025 (ML Kit) and December 2025 (ZXing). For a deeper comparison between Scandit and these libraries, including performance testing results, read our ML Kit Barcode Scanner vs. Scandit and ZXing Barcode Scanner vs. Scandit blogs.

Your .NET barcode scanner is more than just a technical choice

Brilliant UX, reliable performance, and Agent Skills support are key development criteria to ensure your .NET barcode scanner API works in the real world. Fewer user frustrations and adaptability to growing business demands are far preferable to low adoption rates and bug reports.

Don't underestimate how much the quality of your scanning technology shapes everything downstream. Posting volume, data accuracy, partner adoption, shopper experience, partner ROI, it all connects back to how fast and reliably items get listed.


Next: Dive deeper into how to make a barcode scanning app performant

Frequently asked questions

Loading search...

Please wait a moment