Want to Contribute to us or want to have 15k+ Audience read your Article ? Or Just want to make a strong Backlink?

How to Build .NET 6 Barcode and QR Code SDK for Windows, Linux & macOS

Microsoft .NET 6 SDK empowers C# builders to construct cross-platform DotNet functions for Home windows, Linux, and macOS from one codebase. This text describes the steps to construct a .NET 6 barcode and QR code decoding library based mostly on Dynamsoft C/C++ Barcode SDK, in addition to how you can pack the library right into a NuGet package deal.



.NET 6 SDK Set up



Dynamsoft Barcode Reader

  1. Obtain C/C++ SDK v9.0.
  2. Get a sound license key for activating the SDK.



Steps to Develop and Construct .NET 6 Barcode and QR Code SDK

  1. Create a brand new library undertaking:

    dotnet new classlib -o BarcodeQRCodeSDK
    
  2. Copy shared library information from the C/C++ SDK package deal to the undertaking root listing. For various platforms, the minimal required shared library information are:

- Home windows: `DynamsoftBarcodeReader.dll`, `vcomp110.dll`
- Linux: `libDynamsoftBarcodeReader.so`
- macOS: `libDynamsoftBarcodeReader.dylib`    
Enter fullscreen mode

Exit fullscreen mode

  1. Rename Class1.cs to BarcodeQRCodeReader.cs.
  2. P/Invoke is the know-how used for bridging C/C++ and .NET. Within the BarcodeQRCodeReader.cs file, we use DllImport to load the unmanaged shared library (e.g. *.dll, *.so, *.dylib) and outline some managed strategies to speak with the native part.

    [DllImport("DynamsoftBarcodeReader")]
    static extern IntPtr DBR_CreateInstance();
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern void DBR_DestroyInstance(IntPtr hBarcode);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern int DBR_InitLicense(string license, [Out] byte[] errorMsg, int errorMsgSize);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern int DBR_DecodeFile(IntPtr hBarcode, string filename, string template);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern int DBR_FreeTextResults(ref IntPtr pTextResultArray);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern void DBR_GetAllTextResults(IntPtr hBarcode, ref IntPtr pTextResultArray);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern int DBR_DecodeBuffer(IntPtr hBarcode, IntPtr pBufferBytes, int width, int peak, int stride, ImagePixelFormat format, string template);
    
    [DllImport("DynamsoftBarcodeReader")]
    static extern int DBR_DecodeBase64String(IntPtr hBarcode, string base64string, string template);
    
  3. As well as, we have to outline some native structs in C#:

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    inside struct PTextResult
    {
        BarcodeFormat emBarcodeFormat;
        public string barcodeFormatString;
        BarcodeFormat_2 barcodeFormat_2;
        string barcodeFormatString_2;
        public string barcodeText;
        IntPtr barcodeBytes;
        int barcodeBytesLength;
        IntPtr localizationResult;
        IntPtr detailedResult;
        int resultsCount;
        IntPtr outcomes;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
        char[] reserved;
    }
    
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    inside struct TextResultArray
    {
        public int resultsCount;
        public IntPtr outcomes;
    }
    
  4. The reminiscence operation between the managed construction and the unmanaged pointer is slightly bit difficult. We have to use Marshal to transform knowledge:

    IntPtr pTextResultArray = IntPtr.Zero;
    
    DBR_GetAllTextResults(hBarcode, ref pTextResultArray);
    
    if (pTextResultArray != IntPtr.Zero)
    {
        string[]? resultArray = null;
        TextResultArray? outcomes = (TextResultArray?)Marshal.PtrToStructure(pTextResultArray, typeof(TextResultArray));
        if (outcomes != null)
        {
            int rely = outcomes.Worth.resultsCount;
            if (rely > 0)
            {
                IntPtr[] barcodes = new IntPtr[count];
                Marshal.Copy(outcomes.Worth.outcomes, barcodes, 0, rely);
                resultArray = new string[count];
    
                for (int i = 0; i < rely; i++)
                {
                    PTextResult? outcome = (PTextResult?)Marshal.PtrToStructure(barcodes[i], typeof(PTextResult));
                    if (outcome != null)
                    {
                        resultArray[i] = outcome.Worth.barcodeText;
                    }
                }
            }
        }
    
        DBR_FreeTextResults(ref pTextResultArray);
    
        return resultArray;
    }
    
  5. As soon as the communication downside between managed and unmanaged code is solved, we are able to outline some high-level C# strategies:

    public class BarcodeQRCodeReader
    {
        non-public IntPtr hBarcode;
        non-public static string? licenseKey;
    
        public static void InitLicense(string license) {
            byte[] errorMsg = new byte[512];
            licenseKey = license;
            DBR_InitLicense(license, errorMsg, 512);
            Console.WriteLine(Encoding.ASCII.GetString(errorMsg) + "n");
        }
    
        non-public BarcodeQRCodeReader()
        {
            hBarcode = DBR_CreateInstance();
        }
    
        public static BarcodeQRCodeReader Create()
        {
            if (licenseKey == null)
            {
                throw new Exception("Please name InitLicense first.");
            }
            return new BarcodeQRCodeReader();
        }
    
        ~BarcodeQRCodeReader()
        {
            if (hBarcode != IntPtr.Zero)
            {
                DBR_DestroyInstance(hBarcode);
                hBarcode = IntPtr.Zero;
            }
        }
    
        public void Destroy()
        {
            if (hBarcode != IntPtr.Zero)
            {
                DBR_DestroyInstance(hBarcode);
                hBarcode = IntPtr.Zero;
            }
        }
    
        public string[]? DecodeFile(string filename)
        {
            if (hBarcode == IntPtr.Zero) return null;
    
            int ret = DBR_DecodeFile(hBarcode, filename, "");
            return OutputResults();
        }
    }
    
  6. Construct the supply code to generate the *.dll file.

    dotnet construct --configuration Launch
    



Learn how to Generate and Publish NuGet Bundle

To generate the *.nupkg file, the simplest method is so as to add <GeneratePackageOnBuild>true</GeneratePackageOnBuild> to the *.csproj file:

<PropertyGroup>
  ...
  <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  ...
</PropertyGroup>
Enter fullscreen mode

Exit fullscreen mode

Then the *.nupkg file will likely be generated routinely if you construct the undertaking.

Our package deal incorporates some native library information. To pack them into the *.nupkg file appropriately, we set the corresponding PackagePath in *.csproj file in keeping with the Runtime Identifier:

<ItemGroup>
  <None CopyToOutputDirectory="At all times" Embrace="DynamsoftBarcodeReader.dll" Pack="true" PackagePath="runtimes/win-x64/native/DynamsoftBarcodeReader.dll" />
  <None CopyToOutputDirectory="At all times" Embrace="vcomp110.dll" Pack="true" PackagePath="runtimes/win-x64/native/vcomp110.dll" />
  <None CopyToOutputDirectory="At all times" Embrace="libDynamsoftBarcodeReader.dylib" Pack="true" PackagePath="runtimes/osx-x64/native/libDynamsoftBarcodeReader.dylib" />
  <None CopyToOutputDirectory="At all times" Embrace="libDynamsoftBarcodeReader.so" Pack="true" PackagePath="runtimes/linux-x64/native/libDynamsoftBarcodeReader.so" />
</ItemGroup>
Enter fullscreen mode

Exit fullscreen mode

Because the *.nupkg file is prepared, we are able to publish it to the NuGet Gallery both through the dotnet command:

dotnet nuget push *.nupkg -k <api-key> -s https://api.nuget.org/v3/index.json
Enter fullscreen mode

Exit fullscreen mode

or the NuGet online page.

Right here is the ultimate web page of BarcodeQRCodeSDK:
https://www.nuget.org/packages/BarcodeQRCodeSDK/



Learn how to Add a .NET Library Challenge as a Reference Domestically

For supply code, add <ProjectReference> in *.csproj file:

<ItemGroup>
    <ProjectReference Embrace="....BarcodeQRCodeSDK.csproj" />
</ItemGroup>
Enter fullscreen mode

Exit fullscreen mode

For generated *.nupkg file, add the package deal listing to NuGet supply listing after which set up the package deal through dotnet add package deal:

dotnet nuget add supply <package deal listing>
dotnet add package deal <package deal title>
Enter fullscreen mode

Exit fullscreen mode



A Easy .NET 6 Command-line Instance

  1. Create a brand new .NET console app:

    dotnet new console -o Check
    
  2. Set up the .NET Barcode and QR Code SDK:

    dotnet add package deal BarcodeQRCodeSDK
    
  3. Use the next code to decode barcode and QR code from a picture file:

    utilizing System;
    utilizing System.Runtime.InteropServices;
    utilizing Dynamsoft;
    
    namespace Check
    {
        class Program
        {
            static void Principal(string[] args)
            {
                BarcodeQRCodeReader.InitLicense("LICENSE-KEY");
                BarcodeQRCodeReader? reader = null;
                strive {
                    reader = BarcodeQRCodeReader.Create();
                    Console.WriteLine("Please enter a picture file: ");
                    string? filename = Console.ReadLine();
                    if (filename != null) {
                        string[]? outcomes = reader.DecodeFile(filename);
                        if (outcomes != null) {
                            foreach (string outcome in outcomes) {
                                Console.WriteLine(outcome);
                            }
                        }
                        else {
                            Console.WriteLine("No barcode discovered.");
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
                lastly
                {
                    if (reader != null)
                    {
                        reader.Destroy();
                    }
                }
            }
        }
    }
    
  4. Run the applying in Home windows, Linux or macOS:

    dotnet run
    

    command-line .NET barcode and QR code reader



Supply Code

https://github.com/yushulx/dotnet-barcode-qr-code-sdk

Add a Comment

Your email address will not be published. Required fields are marked *

Want to Contribute to us or want to have 15k+ Audience read your Article ? Or Just want to make a strong Backlink?