Add .NET 10 support via NativeAOT-LLVM along side .NET 8 support#4915
Draft
Add .NET 10 support via NativeAOT-LLVM along side .NET 8 support#4915
Conversation
1) Created exception to `check_global_json_policy` to allow for .NET 8 templates to be generated. 2) Removed .NET 10 DLLs from SDK to prevent Unity issue. 3) Updated NativeAOT smoketest test include `packageSourceMapping` in `NuGet.Config`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of changes
Builds on #4741 to clean up and refine the NativeAOT-LLVM integration. The major changes:
Standardized the repo on .NET 10 SDK (
global.json→10.0.100). The team is migrating to .NET 10 ahead of .NET 8 EOL. End users are unaffected as their SDK version is controlled by their ownglobal.jsonemitted byspacetime init.Multi-target NuGet packages instead of conditional single-target:
SpacetimeDB.Runtimenow unconditionally targetsnet8.0;net10.0SpacetimeDB.BSATN.Runtimenow unconditionally targetsnetstandard2.1;net8.0;net10.0.nupkg. NoEXPERIMENTAL_WASM_AOTenv var needed at pack timeEXPERIMENTAL_WASM_AOTdefine constant is set automatically whenTargetFramework == net10.0ILCompiler.LLVMpackage references conditioned onTargetFramework == net10.0(not env var)Centralized NativeAOT-LLVM build logic in
SpacetimeDB.Runtime.propsandSpacetimeDB.Runtime.targets:PublishTrimmed,SelfContained,WasmEnableThreadsinto.props(previously duplicated across 4+.csprojfiles).wit-strippingUseWasiRuntimeOverlayWithoutComponentWittarget into.targets(was duplicated in every server.csproj)IlcLlvmTarget=wasm32-unknown-wasip1override after ILCompiler.LLVM.targets import (previously passed as/p:arg)_InitializeWasiSdktoObtainWasiSdkBeforeTargets for .NET 10 compatibility.csprojfiles no longer need any AOT boilerplateRefactored
csharp.rsbuild logic to support three build paths viaCsharpBuildPathenum:Net8Jit: stable .NET 8 path usingwasi-experimentalworkload (Mono WASM)Net8Aot: .NET 8 NativeAOT-LLVM (opt-in via--native-aotorEXPERIMENTAL_WASM_AOT=1)Net10Aot: .NET 10 NativeAOT-LLVM (auto-detected when .NET 10 SDK is active)dotnet --version(respectsglobal.json)EXPERIMENTAL_WASM_AOT=1for AOT paths so MSBuild conditionals activatedotnet publishcommand for all paths. Build-specific config handled by props/targets/p:IlcLlvmTargetand/p:WasmEnableThreadsCLI args (now in.targets)Refactored
init.rsfor .NET version-aware scaffolding:--dotnet-versionCLI arg to explicitly select .NET 8 or 10resolve_dotnet_major()which auto-detects or prompts interactively when multiple SDKs are installed--native-aotnot required)<TargetFramework>net10.0</TargetFramework>directly (no conditional)ILCompiler.LLVM 8.0.0-*package refs gated onEXPERIMENTAL_WASM_AOT=1global.jsonper SDK version (8.0.100or10.0.100)Added
_initializecall inwasmtime_module.rs: NativeAOT-LLVM modules are WASI reactors that export_initializeto bootstrap the native runtime. This is called before preinit functions. Traditional .NET 8 WASI modules export_startinstead and are unaffected.Updated
FFI.csWasmImportLinkageAttributeguard to#if EXPERIMENTAL_WASM_AOT && NET10_0_OR_GREATER, ensuring the real attribute is only used when both the AOT flag and .NET 10+ TFM are active. The dummy shim is used for all other builds.Updated
csharp_aot_module.rssmoketest:Updated CLI reference docs to reflect
--native-aotbehavior change (not needed for .NET 10) and new--dotnet-versionarg.This PR addresses several issues from #4741 review:
NativeAOT-LLVM build logic was duplicated in every server
.csproj(4+ files had identicalPropertyGroupandTargetblocks). This is now centralized in the shipped.props/.targets.NuGet packages only shipped a single TFM. The env var controlled which TFM was built, meaning you needed
EXPERIMENTAL_WASM_AOT=1at pack time to get thenet10.0DLL. Now both TFMs are always included.spacetime initemitted unnecessary conditional wrappers in the generated.csprojfor .NET 10 projects. Since the project is definitively targeting .NET 10, the TFM should be unconditional.spacetime publishpassed MSBuild properties via/p:args that are now handled by centralized.targets, simplifying the CLI code.API and ABI breaking changes
global.jsonnow requires .NET 10 SDK for repo development. All developers and CI agents need .NET SDK 10.0+ installed.global.jsonspecifies.Expected complexity level and risk
2 - The core risk is the same as #4741: future changes in the upstream NativeAOT-LLVM/WASI pipeline. Centralizing the build logic in
.props/.targetsreduces the surface area for breaking changes (one place to update vs. N consumer projects). The.wit-stripping workaround remains necessary until dotnet/runtimelab#3144 is resolved.Testing
spacetime publishwithout--native-aot)spacetime publishwithEXPERIMENTAL_WASM_AOT=1and .NET 8 SDK)spacetime publishwith .NET 10 SDK, auto-detected)spacetime init --lang csharpgenerates correct project structure for both .NET 8 and .NET 10spacetime init --lang csharp --dotnet-version 10emitsnet10.0TFM and10.0.100inglobal.jsonspacetime init, but the tests themselves remained identical.lib/net8.0/andlib/net10.0/DLLstest_build_csharp_module_aotto work with both .NET 8 and .NET 10 SDK