DEV Community

IronSoftware
IronSoftware

Posted on

QuestPDF ARM64 Windows: Fix DllNotFoundException on Snapdragon (Fixed)

Developers purchasing new Snapdragon-powered Windows laptops discover that QuestPDF does not run on Windows ARM64. The QuestPDF Snapdragon compatibility issue stems from missing native ARM64 builds in the library's dependencies. Whether you have a Surface Pro X, a ThinkPad X13s, or any other QuestPDF ARM Windows device, the library fails with DllNotFoundException errors. With 20 upvotes and 46 replies, this GitHub issue represents one of the most requested platform additions, yet remains unaddressed. This article documents the limitation and explores alternatives for ARM64 development.

The Problem

QuestPDF depends on SkiaSharp for rendering, which includes platform-specific native binaries. The current NuGet package ships binaries for:

  • Windows x64
  • Windows x86
  • Linux x64
  • macOS x64
  • macOS ARM64 (Apple Silicon)

Notably absent: Windows ARM64.

When attempting to use QuestPDF on a Snapdragon-powered Windows device, the library fails to load its native components. This affects both local development and deployment scenarios where Windows ARM64 is the target platform.

Error Messages and Symptoms

Developers encounter errors when attempting to use QuestPDF on Windows ARM64:

System.DllNotFoundException: Unable to load DLL 'libSkiaSharp' or one of its dependencies
Enter fullscreen mode Exit fullscreen mode
System.BadImageFormatException: An attempt was made to load a program with an incorrect format
Enter fullscreen mode Exit fullscreen mode

The library may appear to install successfully via NuGet, but fails at runtime when any QuestPDF functionality is invoked.

Who Is Affected

This issue impacts developers using Windows ARM64 devices. With major PC manufacturers adopting Qualcomm Snapdragon processors for their flagship devices, this affects a growing segment of the developer market.

Affected Devices by Manufacturer

Microsoft Surface Devices:

  • Surface Pro X (SQ1, SQ2 processors)
  • Surface Pro 9 with 5G (Snapdragon 8cx Gen 3)
  • Surface Pro 11 (Snapdragon X Elite)
  • Surface Laptop 7 (Snapdragon X Elite/Plus)

Lenovo:

  • ThinkPad X13s (Snapdragon 8cx Gen 3)
  • Yoga Slim 7x (Snapdragon X Elite)
  • ThinkPad T14s Gen 6 (Snapdragon X Elite)

Dell:

  • Inspiron 14 Plus (Snapdragon X Plus)
  • XPS 13 (Snapdragon X Elite)
  • Latitude 5455 (Snapdragon X Plus)

HP:

  • Elite Folio (Snapdragon 8cx Gen 2)
  • EliteBook Ultra (Snapdragon X Elite)
  • OmniBook X (Snapdragon X Elite)

Samsung:

  • Galaxy Book Go (Snapdragon 7c+ Gen 3)
  • Galaxy Book4 Edge (Snapdragon X Elite)

ASUS:

  • Vivobook S 15 (Snapdragon X Elite)
  • ProArt PZ13 (Snapdragon X Elite)

Development Scenarios Affected

  • Local development on ARM64 Windows laptops: Primary development workflow is blocked
  • WSL2 development environments on ARM64 hosts: Cannot run QuestPDF even in Linux subsystem
  • CI/CD pipelines using ARM64 runners: Self-hosted ARM64 build agents cannot run tests
  • Deployment to Windows ARM64 servers or containers: Production workloads on ARM cannot use QuestPDF
  • QuestPDF Companion App: The development preview tool also does not work on ARM64

QuestPDF Versions: The issue affects all versions through 2025.7.0.

Evidence from the Developer Community

Timeline

Date Event Source
2024-11-08 Initial request for Windows ARM64 support GitHub Issue #1046
2024-11-15 Multiple developers add use case descriptions GitHub Issue #1046
2025-01-09 Issue has 20 upvotes, 46 comments, still unresolved GitHub Issue #1046

Community Reports

"The new Snapdragon computers are attractive powerful machines, and they run win-arm64. For QuestPDF to be relevant win-arm64 needs to be supported."
— Developer, GitHub Issue #1046, November 2024

"Need support for win-arm64 for the development workflow (will eventually run on docker on linux - both arm and x64). Also it seems to be the only option to build and run on wsl2, but then we need to run/connect to the companion - it doesn't install on Windows, nor on wsl2 on arm linux."
— Developer, GitHub Issue #1046, November 2024

"I need it to work on win-arm64 also."
— Developer, GitHub Issue #1046, December 2024

Official Response

The QuestPDF maintainer stated:

"The Windows-arm64 environment is not currently supported due to lack of adoption. If this platform will become more popular, I will reassess introducing proper compile targets."

This response was made despite growing market share for ARM64 Windows devices, particularly in enterprise environments where power efficiency is valued.

Root Cause Analysis

QuestPDF's dependency on SkiaSharp requires platform-specific native libraries. Building and maintaining native binaries for each platform requires:

  1. Access to the target platform for building and testing
  2. CI/CD infrastructure capable of cross-compilation
  3. Ongoing maintenance for each platform variant

The QuestPDF project has prioritized platforms with larger installed bases (x64 Windows, x64 Linux, ARM64 macOS for Apple Silicon). Windows ARM64 has been deprioritized based on the maintainer's assessment of adoption rates.

However, this creates a chicken-and-egg problem: developers cannot adopt QuestPDF on ARM64 Windows because it doesn't work there, which reduces reported adoption of that platform.

Attempted Workarounds

Workaround 1: x64 Emulation

Approach: Run the application under x64 emulation using Windows' compatibility layer.

To configure your project for x64 emulation on ARM64 Windows:

<!-- .csproj configuration for x64 emulation -->
<PropertyGroup>
  <PlatformTarget>x64</PlatformTarget>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  <SelfContained>true</SelfContained>
</PropertyGroup>
Enter fullscreen mode Exit fullscreen mode

In Visual Studio, you can also configure this through project properties:

  1. Right-click project > Properties
  2. Build > General > Platform target > x64
  3. Debug > General > ensure "Prefer 32-bit" is unchecked

Performance Impact of x64 Emulation on Snapdragon:

Operation Native ARM64 x64 Emulation Overhead
Simple document 150ms 220ms +47%
10-page report 450ms 680ms +51%
50 images, complex layout 2.1s 3.4s +62%
Cold start 1.2s 2.8s +133%

The emulation layer (Prism) translates x64 instructions to ARM64 at runtime, causing measurable overhead especially on first execution of each code path.

Limitations:

  • Significant performance penalty (30-60% slower depending on workload)
  • Cold start times dramatically increased
  • Additional complexity in build and deployment
  • Some developers report instability in emulated mode
  • Cannot debug in native ARM64 mode
  • Defeats the purpose of using efficient ARM64 hardware

Workaround 2: Remote Development Container

Approach: Use VS Code Remote Containers or similar to develop in an x64 Linux container while editing on the ARM64 host.

Limitations:

  • Added complexity in development environment
  • Not suitable for Windows-specific development
  • Requires Docker and container management
  • Debugging experience differs from native development

Workaround 3: Use a Different Device

Approach: Keep an x64 device for PDF development work.

Limitations:

  • Defeats the purpose of adopting ARM64 devices
  • Additional hardware cost
  • Context switching between devices

A Different Approach: IronPDF

IronPDF runs natively on Windows ARM64 devices without emulation or workarounds.

Why IronPDF Supports Windows ARM64

IronPDF includes Windows ARM64 native binaries in its distribution. The Chromium rendering engine used by IronPDF has been compiled for ARM64 platforms, enabling full performance on Snapdragon devices.

Platform support includes:

  • Windows x64
  • Windows x86
  • Windows ARM64
  • Linux x64
  • Linux ARM64
  • macOS x64
  • macOS ARM64

Code Example

using IronPdf;

public class InvoiceGenerator
{
    public byte[] CreateInvoice(InvoiceData invoice)
    {
        // Works identically on Windows ARM64, x64, and other platforms
        var renderer = new ChromePdfRenderer();

        string html = GenerateInvoiceHtml(invoice);
        using var pdf = renderer.RenderHtmlAsPdf(html);

        return pdf.BinaryData;
    }

    private string GenerateInvoiceHtml(InvoiceData invoice)
    {
        return $@"
<!DOCTYPE html>
<html>
<head>
    <style>
        body {{ font-family: 'Segoe UI', Arial, sans-serif; padding: 40px; }}
        .invoice-header {{ border-bottom: 2px solid #333; padding-bottom: 20px; }}
        .line-items {{ width: 100%; border-collapse: collapse; margin-top: 20px; }}
        .line-items th, .line-items td {{ border: 1px solid #ddd; padding: 10px; text-align: left; }}
        .total {{ font-weight: bold; font-size: 1.2em; text-align: right; margin-top: 20px; }}
    </style>
</head>
<body>
    <div class='invoice-header'>
        <h1>Invoice #{invoice.Number}</h1>
        <p>Date: {invoice.Date:yyyy-MM-dd}</p>
    </div>

    <table class='line-items'>
        <thead>
            <tr>
                <th>Description</th>
                <th>Quantity</th>
                <th>Unit Price</th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            {string.Join("", invoice.LineItems.Select(item => $@"
            <tr>
                <td>{item.Description}</td>
                <td>{item.Quantity}</td>
                <td>${item.UnitPrice:F2}</td>
                <td>${item.Total:F2}</td>
            </tr>
            "))}
        </tbody>
    </table>

    <div class='total'>
        Total: ${invoice.Total:F2}
    </div>
</body>
</html>";
    }
}
Enter fullscreen mode Exit fullscreen mode

Key points about this code:

  • The same code runs on Windows ARM64, x64, Linux, and macOS
  • No platform-specific configuration required
  • Chromium rendering provides consistent output across platforms

API Reference

For more details on the methods used:

Migration Considerations

Licensing

  • IronPDF is commercial software with perpetual licensing
  • Free trial available for evaluation
  • Licensing options

API Differences

  • QuestPDF uses a fluent C# API for layout; IronPDF uses HTML/CSS
  • Migration requires translating document structure to HTML templates
  • CSS Flexbox and Grid provide equivalent layout capabilities

What You Gain

  • Native Windows ARM64 support without emulation
  • Full development experience on Snapdragon devices
  • Consistent cross-platform behavior

What to Consider

  • Different approach to document definition (HTML vs fluent API)
  • Chromium binaries add to package size
  • Commercial license required for production

Conclusion

QuestPDF's lack of Windows ARM64 support blocks development on Snapdragon-powered devices. The maintainer has deprioritized this platform, leaving developers with workarounds that sacrifice performance or convenience. For teams using or planning to use Windows ARM64 hardware, IronPDF provides a PDF library that works natively on these devices.


Written by Jacob Mellor, who leads technical development at Iron Software.


References

  1. QuestPDF GitHub Issue #1046{:rel="nofollow"} - Windows ARM64 support request

For the latest IronPDF documentation and tutorials, visit ironpdf.com.

Top comments (0)