Skip to main content

Linux Deployment

Publishing

Always publish XPF applications from the command line. Visual Studio publishing can produce incomplete output that is missing native libraries such as libSkiaSharp.so.

dotnet publish -r linux-x64 -c Release

For self-contained deployments:

dotnet publish -r linux-x64 -c Release --self-contained

For ARM64 devices:

dotnet publish -r linux-arm64 -c Release --self-contained

Runtime dependencies

Ensure the following packages are installed on the target system.

Debian / Ubuntu

sudo apt install libice6 libsm6 libfontconfig1 libgdiplus

Fedora

sudo dnf install libICE libSM fontconfig libgdiplus

RHEL / CentOS / Rocky Linux

sudo dnf install epel-release
sudo dnf install libICE libSM fontconfig libgdiplus

For WebView support, also install libwebkit2gtk-4.1-dev (Debian/Ubuntu) or webkit2gtk4.1-devel (Fedora/RHEL).

See Linux: Other Dependencies for details.

ReadyToRun

ReadyToRun (R2R) compilation pre-compiles assemblies to native code, significantly reducing startup time. This is particularly beneficial on embedded Linux devices.

<PropertyGroup>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
dotnet publish -r linux-x64 -c Release --self-contained
note

ReadyToRun may change how native .so libraries are resolved. See Linux: Native Library Resolution for details.

Framework-dependent vs self-contained

Framework-dependent (default): Requires .NET to be installed on the target machine. Produces a smaller deployment package.

Self-contained: Includes the .NET runtime. Larger package but no external dependencies beyond system libraries. Recommended for distribution to end users.

# Framework-dependent
dotnet publish -r linux-x64 -c Release

# Self-contained
dotnet publish -r linux-x64 -c Release --self-contained

Packaging formats

AppImage

AppImage bundles your application into a single executable file. Use tools like appimage-builder or package the published output into an AppImage manually.

Debian package (.deb)

For Debian-based distributions, create a .deb package. Use dpkg-deb or a tool like dotnet-packaging:

dotnet tool install --global dotnet-deb
dotnet deb -r linux-x64 -c Release

RPM package

For Fedora and RHEL-based distributions:

dotnet tool install --global dotnet-rpm
dotnet rpm -r linux-x64 -c Release

Flatpak and snap

XPF applications can be distributed as Flatpak or Snap packages. Refer to each packaging system's documentation for bundling .NET applications.

CI/CD

When building XPF applications in CI/CD pipelines:

  1. Add a NuGet.config with your license key (use CI secrets for the key value)
  2. Install required dependencies in the build environment
  3. Publish from the command line

Example GitHub Actions step:

- name: Publish for Linux
run: dotnet publish -r linux-x64 -c Release --self-contained
env:
XpfLicenseKey: ${{ secrets.XPF_LICENSE_KEY }}

See Centralizing Multiple XPF Projects for using environment variables with license keys.

Debugging remote Linux targets

For debugging XPF applications running on Linux from a Windows development machine, see Linux: Debugging.