👉 Web Assembly
Run in the browser with WebAssembly
- Install
wasm-tools
workload tools. See dotnet documentation.
dotnet workload install wasm-tools
If you are running net8.0-browser
application on .NET 9 SDK, you should install wasm-tools-net8
workload instead.
If you have an older .NET SDK, it might ask you to install other workloads like wasm-experimental
as well.
- Install or update the dotnet templates to the latest version.
dotnet new install avalonia.templates
- Create a new directory for the project.
mkdir BrowserTest
cd BrowserTest
- Generate a new project that supports running in the browser. To lookup the available templates via
dotnet new list
see dotnet documentation.
dotnet new avalonia.xplat
- In the console output you will see HTTP and HTTPS links to open the app. In order to run, simply do the following:
cd BrowserTest.Browser
dotnet run
# Output:
# App url: http://127.0.0.1:53576/
# App url: https://127.0.0.1:53577/
# Debug at url: http://127.0.0.1:53576/_framework/debug
# Debug at url: https://127.0.0.1:53577/_framework/debug
Deployment
In the BrowserTest.Browser
directory, run:
dotnet publish
After project was published, .NET SDK creates an app bundle directory with index.html
file and compiled application files.
With latest .NET 9 SDK, this directory is located at bin/Release/net9.0-browser/publish/wwwroot
. If your project targets "net8.0-browser", use net8.0-browser
directory.
Now you can serve your app from this directory using your favorite web server (such as Azure Static Web Apps).
On older .NET SDK versions, app bundle was located in different directory: bin/Release/net8.0-browser/browser-wasm/AppBundle
(search for AppBundle
).
Currently using dotnet publish
with the -o
or --output
flag does not produce the AppBundle folder in the output directory. (See this issue.) You'll still have to grab it out of the bin
directory at the path specified by the publish output.
Testing AppBundle locally
You can serve your wasm app from this directly using the dotnet-serve tool as follows:
dotnet tool install --global dotnet-serve
dotnet serve -d:bin/Release/net9.0-browser/publish/wwwroot
# Output:
# Starting server, serving bin/Release/net9.0-browser/publish/wwwroot
# Listening on any IP:
# http://localhost:49875
Interop
It is possible to call JavaScript code from the Avalonia Web application. Avalonia app is compatible with standard [JSImport]/[JSExport] interop from Microsoft. You can find more information on their documentation.
Legacy Blazor backend
Starting from Avalonia 11.0 Avalonia.Browser package relies on build-in .NET interop with better stability and performance. Legacy Blazor backend is still available for compatibility and can be referenced using Avalonia.Browser.Blazor package.
Troubleshooting
If you have not performed the step to install required workloads, you might encounter errors when running the app in your browser later (e.g. System.DllNotFoundException: libSkiaSharp
) and you will need to rebuild again before the app will run.
Keep in mind, that WebAssembly in general as a technology is limited. .NET Multithreading is not supported by any browser and is only available starting .NET 8. Any normal app also has to comply with Browser sandboxing mechanism. And while Avalonia does its best to keep performance high, any WebAssembly GUI apps in some cases might be slow or with older browsers.