Introduction
Deploying an AvaloniaUI application with Native AOT (Ahead-Of-Time compilation) on Windows can significantly improve startup performance and reduce the size of your application. However, due to Avalonia's reliance on reflection-based bindings, Native AOT can cause runtime errors if not properly configured.
This guide provides a step-by-step approach to resolving trimming issues and ensuring a successful Native AOT deployment for AvaloniaUI applications.
Common Issues and Fixes
1. XAML Views Not Reachable via Runtime Loader
If you encounter the following error:
Avalonia: XAML resource "avares://YourApp/Views/MainWindow.axaml" won't be reachable via runtime loader, as no public constructor was found. ✅ Fix: Ensure Your Views Have a Public Constructor
Each view must have a public parameterless constructor in its .axaml.cs file. Example:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } 2. Ensure XAML Files Are Embedded Properly
If your UI does not load or throws missing resource errors, check your XAML file properties.
✅ Fix: Set Build Action to AvaloniaResource
- Open Visual Studio.
- Right-click your
.axamlfile → Select Properties. - Set Build Action to
AvaloniaResource.
3. Fixing PublishTrimmed and Trimming Issues
Since Native AOT automatically enables trimming, Avalonia's reflection-based UI bindings might get stripped out.
✅ Fix: Add TrimmerRootAssembly in .csproj
To prevent Avalonia's essential assemblies from being trimmed, modify your .csproj file:
<ItemGroup> <TrimmerRootAssembly Include="Avalonia.Controls" /> <TrimmerRootAssembly Include="Avalonia.Base" /> <TrimmerRootAssembly Include="Avalonia.Markup.Xaml" /> </ItemGroup> 4. Project Configuration
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net8.0</TargetFramework> <Nullable>enable</Nullable> <PublishReadyToRun>true</PublishReadyToRun> <PublishAot>true</PublishAot> <EventSourceSupport>true</EventSourceSupport> <IsAotCompatible>true</IsAotCompatible> <!-- Recommended Avalonia trimming settings for Native AOT --> <!-- <BuiltInComInteropSupport>false</BuiltInComInteropSupport>--> <!-- <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>--> <TrimMode>partial</TrimMode> <ApplicationManifest>app.manifest</ApplicationManifest> <StripSymbols>false</StripSymbols> <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> </PropertyGroup> Building and Publishing for Native AOT
Run the following command to publish your Avalonia app with Native AOT:
dotnet publish -r win-x64 -c Release --self-contained true -p:PublishAot=true Final Checklist for Native AOT Deployment ✅
✔ Ensure all views have a public constructor
✔ Set XAML files to AvaloniaResource
✔ Prevent trimming of required Avalonia assemblies (TrimmerRootAssembly)
✔ Use rd.xml to preserve Avalonia reflection-based types
✔ Properly initialize Avalonia in App.axaml.cs
✔ Publish using dotnet publish -p:PublishAot=true
Conclusion
By following these steps, you can successfully deploy AvaloniaUI applications using Native AOT on Windows without breaking essential functionality. This ensures a smaller, faster application while avoiding common pitfalls with Avalonia’s reflection-heavy UI framework.
For further details, refer to the official documentation:
Top comments (0)