Using the bootstrapper
The Uno.Wasm.Bootstrap package provides a runtime bootstrapper of the Microsoft.NET.Sdk.WebAssembly SDK from .NET 9.
This package only provides the bootstrapping features to run a .NET assembly and write to the javascript console, through Console.WriteLine. To write an app that provides UI functionalities, make sur to check out https://aka.platform.uno/get-started.
This work is based on the excellent work from @praeclarum's OOui Wasm MSBuild task.
Prepare your machine
On the command line, type the following to install the WebAssembly workload:
dotnet workload install wasm-tools
How to use the Bootstrapper with .NET 9 and later
Create a .NET 9 Console Application, and update it with the following basic definition:
<Project Sdk="Microsoft.NET.Sdk.WebAssembly"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Uno.Wasm.Bootstrap" Version="9.0.*" /> </ItemGroup> </Project>Add a main entry point:
class Program { static void Main(string[] args) { Console.WriteLine("Hello from C#!"); } }In Visual Studio 2022, press
F5to start with the debuggerA browser window will appear with your application
The output of the Console.WriteLine will appear in the javascript debugging console
How to use the Visual Studio 2022 Debugger
To enable the debugging, make sure that the following line is present in your Properties/launchSettings.json file:
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}"
in every profile section of the file, below each "launchBrowser": true, line.
Press F5 to start debugging.
Alternate deployment methods
Install the dotnet serve tool:
dotnet tool install -g dotnet-serve
Once installed, launch the server by using the following command:
cd MyApp.Wasm
dotnet publish -c Debug
dotnet serve -d bin\Debug\net9.0\publish\wwwroot -p 8000
You application will be available http://localhost:8000.
Upgrading from previous versions of the Uno.Wasm.Bootstrap package
Moving from version 8.x to 9.x may require changing the used MSBuild SDK for your project.
- If your project contains
Sdk="Uno.Sdk", you will need to update the Uno.Sdk to 5.5 or later. - If your project contains
Sdk="Microsoft.NET.Sdk.Web", you'll need to change it toSdk="Microsoft.NET.Sdk.WebAssembly".
Once done, make sure to install the WebAssembly tools from .NET:
dotnet workload install wasm-tools
By default, the .NET runtime does not load all resource assemblies, but if you want to load all resources regardless of the user's culture, you can add the following to your project file:
<PropertyGroup>
<WasmShellLoadAllSatelliteResources>true</WasmShellLoadAllSatelliteResources>
</PropertyGroup>
If you're not using the Uno.SDK and that you are using AOT with WasmShellMonoRuntimeExecutionMode set to InterpreterAndAOT, you'll also need to keep WasmShellMonoRuntimeExecutionMode and add the following:
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
</PropertyGroup>
If not set, you may get the error error MSB4036: The "MonoAOTCompiler" task was not found".
Threading
Microsoft’s runtime team has made major changes in .NET 9 to how threads interact with the DOM and JavaScript, aiming to improve stability.
Since threading was, and continues to be an experimental feature, these changes now prevent managed code from running on the main JavaScript thread — something Uno Platform depends on.
As a result, WebAssembly threading is currently not supported in Uno Platform apps. However, as Microsoft’s runtime team is working on it, we hope that the support for threading may return in future .NET 10 preview builds.
IDBFS
In version 8.x and earlier of the bootstrapper, IDBFS support was enabled by default.
Moving the .NET 9, the default interpreter runtime does not enable it by default. Read this documentation in order to restore IDBFS support.
Interop
Module.mono_bind_static_methodis not available anymore, you'll need to useModule.getAssemblyExportsinstead.- .NET 9 upgrades to emscripten 3.1.56 for which
.bcnative files are not supported properly. Use.aor.oextensions instead for native dependencies.
Deprecated APIs
- The
Uno.Wasm.Boostrap.DevServerpackage is not needed anymore and can be removed WasmShellOutputPackagePathhas been removed. Use$(PublishDir)WasmShellOutputDistPathhas been removed. Use$(PublishDir)WasmShellBrotliCompressionQuality,WasmShellCompressedExtensionandWasmShellGenerateCompressedFileshave been removed, the compression is done by the .NET SDKWasmShellEnableAotGSharedVThas been removed.WasmShellEnableEmscriptenWindowshas been removed, the .NET SDK manages emscriptenWasmShellEnableLongPathSupporthas been removed, the .NET SDK manages the buildWasmShellEnableNetCoreICUhas been removed, the .NET SDK manages localizationWasmShellForceDisableWSLandWasmShellForceUseWSLhave been removed, Windows and Linux are supported natively by the .NET SDK.WashShellGeneratePrefetchHeadershas been removed.WasmShellNinjaAdditionalParametershas been removed, the .NET SDK manages the buildWasmShellObfuscateAssemblies,WasmShellAssembliesExtensionandAssembliesFileNameObfuscationModehave been removed, the .NET SDK uses WebCIL to achieve the same result.WasmShellPrintAOTSkippedMethodshas been removedWasmShellPThreadsPoolSizehas been removed in favor of the official .NET SDK parametersMonoRuntimeDebuggerEnabledhas been removed, the .NET SDK manages the debuggerWashShellUseFileIntegrityhas been removed, the .NET SDK manages the assets integrity
Bootstrapper versions and .NET runtimes
Each major version of the bootstrapper targets a different version of the .NET Runtime.
- 2.x: Mono runtime (https://github.com/mono/mono)
- 3.x: .NET 6 (https://github.com/dotnet/runtime/commits/release/6.0)
- 7.x: .NET 7 (https://github.com/dotnet/runtime/commits/release/7.0)
- 8.0: .NET 8 (https://github.com/dotnet/runtime/commits/release/8.0)
- 9.0: .NET 9 (https://github.com/dotnet/runtime/commits/release/9.0)
Note
Between version 3.x and 8.x, the bootstrapper is using custom builds of the runtime, maintained here: https://github.com/unoplatform/Uno.DotnetRuntime.WebAssembly
Note
Bootstrapper builds version 4.x-dev were based on developments builds of .NET 7 and were later versioned 7.x-dev to match the appropriate runtime.