Skip to content

Enable multithreaded .NET project builds - #20337

Merged
Karol Zadora-Przylecki (karolz-ms) merged 5 commits into
mainfrom
dev/karolz/project-v2-multithreaded-build
Sep 24, 2026
Merged

Karol Zadora-Przylecki (karolz-ms) merged 5 commits into
mainfrom
dev/karolz/project-v2-multithreaded-build

Conversation

@karolz-ms

@karolz-ms Karol Zadora-Przylecki (karolz-ms) commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Description

Project Resource V2 makes the dashboard available earlier, but coordinated project builds can delay full application readiness. .NET SDK 11 RC1 introduces the -mt MSBuild switch, which allows supported project builds to use multithreaded task execution.

This change:

Validation:

  • .\restore.cmd
  • ./restore.sh
  • Affected Aspire.Hosting and Aspire.Hosting.Dotnet build completed with zero warnings and errors.
  • 47 focused provider, version-policy, coordinated-build, rebuild, file-app, and .NET-tool tests passed.
  • 15 focused Aspire.Hosting.Tests file-app SDK policy and environment-aware provider cases passed.
  • 6 focused Aspire.Hosting.Dotnet.Tests file-only build, rebuild, mixed-model coordination, and configured rebuild argument cases passed.
  • A repository-local .NET 11 RC1 .csproj build completed successfully with -mt.
  • A full Aspire.Hosting.Tests run encountered two unrelated MSBuildTests timeouts in dotnet build --disable-build-servers; both timeouts reproduced when retried in isolation.

Fixes #19944

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Gate MSBuild -mt usage on the SDK selected for each build context, cache semantic version probes, and reuse the result across coordinated builds and rebuilds.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 20337

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 20337"

@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot September 23, 2026 00:14
@github-actions github-actions Bot added the area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication label Sep 23, 2026
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The persistent build annotation prevents SDK reevaluation after global.json changes, potentially passing -mt to an unsupported SDK.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 High severity

Open (1)
What changed in this PR

Enables -mt for supported .NET project builds while preserving existing behavior for older SDKs and file-based apps.

Changes:

  • Adds cached, global.json-aware SDK version detection.
  • Applies -mt to coordinated builds and project rebuilds.
  • Adds focused version-policy and build-argument tests.
File Description
src/​Aspire.Hosting/​DistributedApplicationBuilder.cs Registers version detection and build eventing.
src/​Aspire.Hosting/​DotnetToolResourceExtensions.cs Reuses the shared SDK provider.
src/​Aspire.Hosting/​Lifecycle/​DotnetBuildCommandEventingSubscriber.cs Adds -mt for supported builds.
src/​Aspire.Hosting/​ProjectResourceBuilderExtensions.cs Reuses provider for file-app validation.
src/​Aspire.Hosting/​Utils/​DotnetSdkUtils.cs Defines version policy and SDK context lookup.
src/​Aspire.Hosting/​Utils/​DotnetSdkVersionProvider.cs Probes and caches selected SDK versions.
tests/​Aspire.Hosting.Dotnet.Tests/​DotnetProjectBuildCoordinatorTests.cs Tests coordinated-build arguments.
tests/​Aspire.Hosting.Dotnet.Tests/​DotnetProjectResourceTests.cs Tests rebuild arguments and file-app exclusion.
tests/​Aspire.Hosting.Tests/​DotnetToolResourceTests.cs Tests shared tool validation.
tests/​Aspire.Hosting.Tests/​ProjectRebuilderResourceTests.cs Tests rebuild switch configuration.
tests/​Aspire.Hosting.Tests/​ProjectResourceTests.cs Tests file-app SDK validation.
tests/​Aspire.Hosting.Tests/​Utils/​DotnetSdkVersionProviderTests.cs Tests probing, caching, and refresh behavior.
tests/​Aspire.Hosting.TestUtilities/​Aspire.Hosting.TestUtilities.csproj Exposes test utilities to Dotnet tests.
tests/​Aspire.Hosting.TestUtilities/​Utils/​EventingTestHelpers.cs Adds event-subscriber test setup.
tests/​Aspire.Hosting.TestUtilities/​Utils/​TestDotnetSdkVersionProvider.cs Adds a deterministic test provider.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 issues found:

  • 1 test failure caused by this change: BuilderAddsDefaultServices, the current Hosting-5 CI failure
  • 1 flaky test pattern: racy wait in CanceledConsumerDoesNotRetainFailedProbe
  • 1 test coverage gap: -mt on secondary __dotnet-project-build-N steps
  • 1 repo convention violation: Assert.DoesNotContain

The concern about the -mt marker not reacting to later global.json changes is already covered in the existing thread, so I didn't repeat it here.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

SDK probing can disagree with the build resource’s configured environment and add -mt to an unsupported SDK.

Review effort: Balanced
Findings: None

Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Probe SDK version using the resolved build environment

src/​Aspire.Hosting/​Lifecycle/​DotnetBuildCommandEventingSubscriber.cs:63

This probe does not necessarily inspect the dotnet executable that will run the build. Coordinated direct builds and rebuilders receive arbitrary WithBuildEnvironment variables (DotnetProjectBuildCoordinator.cs:748-752), so PATH, DOTNET_ROOT, or SDK roll-forward settings can select .NET 10 for the resource while this provider probes the AppHost environment and reports .NET 11. The callback then adds -mt to an SDK that rejects it. Probe with the resolved build environment, or conservatively omit -mt when that environment overrides SDK-selection variables.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@karolz-ms

Copy link
Copy Markdown
Contributor Author

The previously missed finding was valid for build-specific PATH overrides: DCP could launch a different dotnet than the AppHost-scoped version probe, causing Aspire to add -mt for an unsupported SDK. Fixed in 0d3c1d7 by resolving the build resource environment before probing, applying those overrides to dotnet --version, and including the environment in the probe cache context. Added regression coverage for environment propagation, cache separation, and a direct-build-to-rebuilder SDK transition.

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The SDK policy, fallback behavior, restart handling, and file-app exclusion are consistently implemented and covered by focused tests.

Review effort: Balanced
Findings: None

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@karolz-ms

Copy link
Copy Markdown
Contributor Author

PR Testing Report

PR Information

  • PR Number: Enable multithreaded .NET project builds #20337
  • Title: Enable multithreaded .NET project builds
  • Head Commit: 0d3c1d73c8f25a5b7ba52f89bcf6730685fc8d34
  • Tested At: 2026-09-23T21:22:45Z
  • CI Status Refreshed At: 2026-09-23T21:47:58Z
  • Execution Target: Local macOS ARM64, isolated temporary directories

Artifact Version Verification

  • Expected Commit: 0d3c1d73c8f25a5b7ba52f89bcf6730685fc8d34
  • Installed Version: 14.0.0-pr.20337.g0d3c1d73
  • Status: ✅ Verified by matching the embedded short commit SHA

Changes Analyzed

Files Changed

  • src/Aspire.Hosting/DistributedApplicationBuilder.cs
  • src/Aspire.Hosting/DotnetToolResourceExtensions.cs
  • src/Aspire.Hosting/Lifecycle/DotnetBuildCommandEventingSubscriber.cs
  • src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs
  • src/Aspire.Hosting/Utils/DotnetSdkUtils.cs
  • src/Aspire.Hosting/Utils/DotnetSdkVersionProvider.cs
  • tests/Aspire.Hosting.Dotnet.Tests/DotnetProjectBuildCoordinatorTests.cs
  • tests/Aspire.Hosting.Dotnet.Tests/DotnetProjectResourceTests.cs
  • tests/Aspire.Hosting.TestUtilities/Aspire.Hosting.TestUtilities.csproj
  • tests/Aspire.Hosting.TestUtilities/Utils/EventingTestHelpers.cs
  • tests/Aspire.Hosting.TestUtilities/Utils/TestDotnetSdkVersionProvider.cs
  • tests/Aspire.Hosting.Tests/DistributedApplicationBuilderTests.cs
  • tests/Aspire.Hosting.Tests/DotnetToolResourceTests.cs
  • tests/Aspire.Hosting.Tests/ProjectRebuilderResourceTests.cs
  • tests/Aspire.Hosting.Tests/ProjectResourceTests.cs
  • tests/Aspire.Hosting.Tests/Utils/DotnetSdkVersionProviderTests.cs

Change Categories

  • CLI command changes
  • Hosting core changes
  • .NET project build coordination changes
  • Dashboard changes
  • Template changes
  • Client/component changes
  • VS Code extension changes
  • CI infrastructure changes

Test Scenarios Executed

Scenario 1: Focused source build and tests

Objective: Validate the changed Hosting assemblies and focused SDK-provider, build-coordinator, rebuild, file-app, and .NET-tool behavior from the exact PR checkout.

Coverage Type: Build and focused automated tests
Status: ✅ Passed

Steps:

  1. Restored the repository with the pinned .NET SDK 11.0.100-rc.1.26425.128.
  2. Built Aspire.Hosting.csproj and Aspire.Hosting.Dotnet.csproj.
  3. Ran focused MTP-native filters in Aspire.Hosting.Tests.
  4. Ran focused MTP-native filters in Aspire.Hosting.Dotnet.Tests.

Evidence:

  • source-build.log
  • hosting-focused-tests.log
  • dotnet-focused-tests.log

Observations:

  • Both projects built with 0 warnings and 0 errors.
  • Aspire.Hosting.Tests: 37 passed, 0 failed.
  • Aspire.Hosting.Dotnet.Tests: 13 passed, 0 failed.
  • Total focused tests: 50 passed.

Scenario 2: .NET 11 coordinated multithreaded build

Objective: Verify the dogfood artifact adds exactly one -mt switch to a real Project Resource V2 traversal build and starts the application successfully.

Coverage Type: Happy path
Status: ✅ Passed

Steps:

  1. Created a fresh multi-project application from the PR template hive.
  2. Configured its AppHost to use Aspire.Hosting.Dotnet and AddDotnetProject.
  3. Instrumented the dotnet executable while forwarding all work to the pinned real SDK.
  4. Started the AppHost and waited for apiservice and webfrontend to become healthy.
  5. Inspected the traversal build invocation.

Evidence:

  • happy-v2-start.log
  • happy-v2-wait-api.log
  • happy-v2-wait-web.log
  • happy-dotnet-v2-invocations.log
  • happy-v2-traversal-builds.log
  • happy-v2-describe.json

Observed command shape:

dotnet build <AppHost>/obj/.aspire/build/projects.<id>.proj -mt --configuration Debug

Observations:

  • Exactly one traversal build was executed.
  • Exactly one -mt switch was present.
  • The SDK probe reported 11.0.100-rc.1.26425.128.
  • Both project resources and the dashboard reached Healthy.
  • The hidden coordinated build resource finished successfully.

Scenario 3: global.json context refresh on rebuild

Objective: Verify changing the nearest global.json invalidates the cached SDK context and reevaluates -mt for an on-demand project rebuild.

Coverage Type: Boundary and cache invalidation
Status: ✅ Passed

Steps:

  1. Created a fresh multi-project Project Resource V2 application.
  2. Used an instrumented dotnet --version response controlled by the nearest global.json, while forwarding builds to the real SDK.
  3. Started with reported SDK 10.0.999.
  4. Verified the initial traversal build omitted -mt.
  5. Changed the same global.json to report 11.0.100-rc.1.26425.128.
  6. Ran aspire resource apiservice rebuild.
  7. Verified the rebuilt resource returned to healthy.

Evidence:

  • refresh-v2-initial-build.log
  • refresh-v2-rebuild.log
  • refresh-v2-rebuild-build.log
  • refresh-v2-dotnet-invocations.log
  • refresh-v2-describe.json

Observed initial command shape:

dotnet build <AppHost>/obj/.aspire/build/projects.<id>.proj --configuration Debug

Observed rebuild command shape:

dotnet build <ApiService>.csproj -mt --configuration Debug

Observations:

  • The initial pre-threshold build omitted -mt.
  • Both the 10.0.999 and 11.0.100-rc.1.26425.128 probes occurred.
  • The post-change rebuild contained exactly one -mt.
  • The API resource rebuilt successfully and returned to Healthy.

Scenario 4: SDK probe failure fallback

Objective: Verify a failed dotnet --version probe preserves existing build behavior instead of failing application startup.

Coverage Type: Unhappy path
Status: ✅ Passed

Expected Outcome: The build succeeds without -mt, and resources remain usable.

Steps:

  1. Created a fresh multi-project Project Resource V2 application.
  2. Configured the probe wrapper to exit with code 42 for dotnet --version.
  3. Started the AppHost and waited for both projects to become healthy.
  4. Inspected the traversal build arguments.

Evidence:

  • probe-failure-start.log
  • probe-failure-dotnet-invocations.log
  • probe-failure-traversal-builds.log
  • probe-failure-describe.json

Observations:

  • The simulated probe failure was observed.
  • Exactly one traversal build ran without -mt.
  • apiservice, webfrontend, and the dashboard reached Healthy.
  • The hidden coordinated build resource finished successfully.

Scenario 5: File-app initial build and rebuild exclusion

Objective: Verify .cs file apps do not receive -mt, including the rebuild command, while source changes still rebuild and restart correctly.

Coverage Type: Boundary and regression
Status: ✅ Passed

Expected Outcome: Both file-app builds omit -mt; the edited source is executed after rebuild.

Steps:

  1. Created a fresh file-based AppHost and a worker.cs resource.
  2. Started the AppHost and verified the worker wrote an initial sentinel.
  3. Confirmed the initial dotnet build worker.cs invocation omitted -mt.
  4. Edited the worker source to write updated.
  5. Ran aspire resource worker rebuild.
  6. Confirmed the worker restarted and wrote the updated sentinel.

Evidence:

  • file-app-start.log
  • file-app-rebuild.log
  • file-app-all-builds.log
  • file-app-assertions.log
  • file-app-describe.json

Observations:

  • Two worker.cs builds ran: initial build and rebuild.
  • Neither invocation contained -mt.
  • The rebuild completed successfully.
  • The restarted worker wrote updated.

GitHub Actions Status

At the end of testing:

  • Passed: 276
  • Skipped: 14
  • Pending: 0
  • Failed: 4

Two failures are aggregate result jobs (Tests / Final Test Results and Final Results). The two underlying failures are the Windows Hosting-1 and Hosting-2 shards described below.

The Windows Hosting-2 shard failed one unrelated test:

This failure is not on a changed test or implementation path. The PR does not modify ResourceFailureLoggingTests.cs, DCP executable retry behavior, or the orchestration code involved in the failure. The new eventing subscriber also ignores this generic ExecutableResource because it only handles coordinated build and project rebuilder resources. The failure should be rerun or triaged separately.

The Windows Hosting-1 shard failed because the GitHub-hosted runner lost communication with the service:

The runner disconnected during Run tests (Windows) after approximately 48 minutes. It did not reach result verification or artifact upload, so there is no test failure evidence to attribute to the PR. This shard requires a rerun.

Test Harness Notes

  • The initial macOS template run used the logical /var temp path while dotnet resolved the physical /private/var path, causing an unrelated Razor source-generation path mismatch. All final scenarios used the canonical physical path.
  • The starter template uses classic generic AddProject calls, which do not exercise the changed Project Resource V2 coordinator directly. The final temporary AppHosts explicitly referenced the PR Aspire.Hosting.Dotnet package and used AddDotnetProject.
  • No repository files were modified; the worktree remained clean at the PR head.

Summary

Scenario Status Notes
Focused source build and tests ✅ Passed 0 warnings/errors; 50 focused tests passed
.NET 11 coordinated build ✅ Passed One traversal build with exactly one -mt; resources healthy
global.json refresh and rebuild ✅ Passed Initial omission, then rebuild added -mt after context change
SDK probe failure fallback ✅ Passed Startup succeeded and -mt was safely omitted
File-app initial build and rebuild ✅ Passed Two builds, no -mt, edited source restarted successfully

Overall Result

✅ PR BEHAVIOR VERIFIED

The changed SDK detection, cache invalidation, environment-aware probing, multithreaded project builds, safe probe-failure fallback, and file-app exclusion all behaved as intended against the PR artifact. The CI workflow completed with failure because of the unrelated Hosting-2 test failure and the Hosting-1 hosted-runner communication failure; both Windows shards require reruns.

Artifact Location

All persistent logs and structured resource snapshots are under:

/Users/karolz/.copilot/session-state/14b19f99-b3bd-4fc8-9196-d99f247e42f3/files/pr-20337-testing

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The implemented file-based build support contradicts the PR description’s stated exclusion.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 Low severity

Open (1)

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@github-actions

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

50 / 99 PR test projects · 4 PR jobs, from 16 changed files.

Selected PR test projects (50 / 99)

Aspire.Cli.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Provisioning.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected PR jobs (4)

cli-starter-validation, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

⚠️ 33 of the 50 selected test projects come from a single change — tests/Aspire.Hosting.TestUtilities/Aspire.Hosting.TestUtilities.csproj.

🧪 tests/Aspire.Hosting.TestUtilities/Aspire.Hosting.TestUtilities.csproj (changed test)
→ 33 via the project graph

show 33

Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests

🔧 src/Aspire.Hosting/DistributedApplicationBuilder.cs (changed source)
→ 12 via the project graph: Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Azure.Provisioning.Tests (3 hops), Aspire.Hosting.Azure.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Testing.Tests (2 hops), Aspire.Playground.Tests

🧪 tests/Aspire.Hosting.Tests/DistributedApplicationBuilderTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests
→ 2 via the project graph: Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Radius.Tests

📦 affected project Aspire.Hosting
→ 1 test: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Hosting.Dotnet.Tests/DotnetProjectBuildCoordinatorTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Dotnet.Tests

🧪 tests/Aspire.Hosting.Dotnet.Tests/DotnetProjectResourceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Dotnet.Tests

🧪 tests/Aspire.Hosting.Tests/DotnetToolResourceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/ProjectRebuilderResourceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/ProjectResourceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Utils/DotnetSdkVersionProviderTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Hosting.JavaScript
extension-e2e • src/Aspire.Hosting/DistributedApplicationBuilder.cs, src/Aspire.Hosting/DotnetToolResourceExtensions.cs, src/Aspire.Hosting/Lifecycle/DotnetBuildCommandEventingSubscriber.cs, src/Aspire.Hosting/ProjectResourceBuilderExtensions.cs, src/Aspire.Hosting/Utils/DotnetSdkUtils.cs, src/Aspire.Hosting/Utils/DotnetSdkVersionProvider.cs
• affected project Aspire.Hosting
polyglot • affected project Aspire.Hosting
• affected project Aspire.Hosting.Azure.Provisioning
typescript-api-compat affected project Aspire.Hosting

Selection computed for commit 2fa310e.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

File-based build behavior conflicts with the stated PR scope and must be reconciled.

Review effort: Balanced
Findings: 1 Low severity

Open (1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is good to merge and backport to 13.6, I'm also doing an investigation to try and quantify the perf savings on AspireShop and eShop which I'll share offline.

@karolz-ms
Karol Zadora-Przylecki (karolz-ms) merged commit 59831d7 into main Sep 24, 2026
297 checks passed
@karolz-ms

Copy link
Copy Markdown
Contributor Author

/backport to release/13.6

@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 14.0 milestone Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/13.6 (link to workflow run)

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Sep 24, 2026
Documents the -mt MSBuild switch support added in microsoft/aspire#20337:
Aspire now detects the selected .NET SDK for coordinated traversal
builds, file-based app builds, and individual project rebuild commands,
and enables multithreaded task execution when the SDK supports it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1744

Generated by PR Documentation Check · copilot · auto · 85.3 AIC · ⌖ 11.4 AIC · ⊞ 20.1K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1744 targeting release/13.6.

Triggered signal: pr_body_has_cli_flag_mention (PR body mentions dotnet build --disable-build-servers in the validation section, and describes the new -mt MSBuild switch behavior). Added a new "Multithreaded builds" subsection to integrations/dotnet/project-resources.mdx, immediately after the existing "Coordinated builds and restore" section, explaining that Aspire probes the selected .NET SDK and applies -mt to coordinated traversal builds, file-based app builds, and individual rebuild commands when supported, with the version floors (11.0.100-rc.1 for projects, 11.0.100-rtm.26473.104+ for file-based apps) and the no-op fallback when detection fails.

Note

This draft PR needs human review before merging.

Jose Perez Rodriguez (joperezr) pushed a commit that referenced this pull request Sep 25, 2026
Backport of #20337 to release/13.6

/cc @karolz-ms

## Customer Impact

## Testing

## Risk

## Regression?

---------

Co-authored-by: Karol Zadora-Przylecki <karolz@microsoft.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
David Pine (IEvangelist) added a commit to microsoft/aspire.dev that referenced this pull request Sep 28, 2026
…ps (#1780)

## Summary

<!-- Describe what this pull request changes and why. -->

Reconcile the 13.6 wiki audit and **all 25 open `docs-from-code`
proposals targeting `release/13.6`** against the actual release source.
Add missing canonical guidance rather than putting all coverage in
What's new. This is a new, isolated feature PR into `release/13.6`; it
does not update the release rollup #1599, merge or close another
proposal, or push directly to a release branch.

**Draft with explicit remaining packaging/validation gates:** the six
REPL walkthroughs are source-verified, but current publicly available
13.6 packages do not contain the late `WithRepl` exports. Generated API
catalogs have deliberately not been fabricated or refreshed from 14.x.
See the open checklist below.

### Evidence baseline

- Documentation base: `717442f6666948bcf77f3d704dc2dadf7c080ec2`.
- Product source of truth:
[`microsoft/aspire@e8fd6fbb954f50ccd2e66479538392f65e13e71d`](https://github.com/microsoft/aspire/tree/e8fd6fbb954f50ccd2e66479538392f65e13e71d),
current `release/13.6` at audit time. Source was read from that Git
object, not the stale source working directory.
- [13.6 wiki](https://github.com/microsoft/aspire/wiki/13.6-Change-log)
snapshot `8e01a371d4f16a1306e48174d4cf1fdeca714348`, whose cutoff is
product PR 20511. Later backports 20541/20546/20548 are included here.
- Proposal base branches alone were **not** used as proof of release
membership. Direct ancestry and known release backports were checked.
Four fallback-targeted proposals are excluded below.
- Wiki link corrections: its REPL link #1752 actually covers Sandboxes;
the REPL proposal is #1740. Its AOT link #1714 covers PFX certificates,
not AOT.

### Complete audit-gap checklist

Checked items mean documentation coverage is implemented, not that cloud
deployment or every product runtime scenario was executed.

- [x] **1. Dotnet API graduation:** correct removal to **13.6**, not
14.0, in What's new, both Dotnet guides, and the diagnostic page;
preserve the prerelease package caveat. This applies to core
`AddDotnetProject`, `DotnetProjectResource`, and related
`WithBuildEnvironment` overloads, not all uses of the diagnostic.
Source: microsoft/aspire#20496.
- [x] **2. Sandboxes:** remove obsolete API suppressions in the article
and deployment guide while preserving Azure service preview/access and
prerelease package limitations. Source: microsoft/aspire#20483.
- [x] **3. Docked REPL documentation:** all six
PostgreSQL/MySQL/MongoDB/SQL Server/Redis/Valkey guides plus the article
now cover opt-in `WithRepl`/`withRepl`, run-only availability, actual
client privileges, credential handling, and explicit exit versus closing
a viewer. Source: microsoft/aspire#20419, backport of
microsoft/aspire#20231. Package-backed checks remain open below.
- [x] **4. Terminal CLI flag:** update current 13.6 article,
`with-terminal`, and all three terminal command references. Preserve
`terminals.v1` and experimental hosting API distinctions. Current
configuration/schema data had no flag entry to remove; historical 13.5
notes remain historical. Source: microsoft/aspire#20548.
- [x] **5. First-party Rust:** rewrite both canonical Rust guides around
`Aspire.Hosting.Rust`; document Cargo versus application arguments,
typed targets, debugging, generated Dockerfiles, workspace context, ABI
constraints, and Toolkit migration. Bacon remains explicitly
Toolkit-only. Add exact first-party package mapping. Source:
microsoft/aspire#18906 and current Rust README.
- [x] **6. Agent setup:** align command reference, skills guide,
AI-agent guide, and article on MCP opt-in, `--mcp`,
chained/non-interactive behavior, seven-skill catalog, Project v2
migration, and Copilot app detection. Also fix stale default-selection
text: all applicable bundle skills are preselected; companion tools
remain opt-in. Sources: microsoft/aspire#19893, microsoft/aspire#20405,
microsoft/aspire#19820.
- [x] **7. Deno AppHost runtime:** document Deno 2+ detection, commands,
permissions, native watch/type checking, doctor, and `DENO_CERT`,
separately from Deno guest hosting. Source: microsoft/aspire#18627,
distinct from microsoft/aspire#18628.
- [x] **8. Native AOT / Fluent UI v5:** concise article, dashboard
exploration, and standalone guidance; automatic packaged-dashboard
selection, no invented performance figures. Source:
microsoft/aspire#19565 and release packaging sources.
- [x] **9. NuGet:** document bundled in-process operations, credential
providers, non-interactive authentication, and realistic
troubleshooting. Correct the proposal's `dotnet nuget locals`
authentication advice: cache commands do not authenticate a feed.
Source: microsoft/aspire#20391.
- [x] **10. Multithreaded builds:** article and coordinated-build guide
explain `-mt`, SDK detection, distinct project/file-based SDK floors,
and fallback. Source: microsoft/aspire#20441.
- [x] **11. Radius:** add a real deployment guide with C#/TypeScript
setup, recipe-backed connections versus local endpoints, per-resource
credential behavior, unauthenticated Redis limitation, secret exposure
boundaries, and actionable runtime diagnostics 070–091. Wire navigation
and exact package mapping. Source: microsoft/aspire#19555 and release
README.
- [x] **12. Connection aliases:** replace contradictory no-encoding
guidance, retain composed logical-key-first lookup and portable-target
behavior, explain collision detection and custom-publisher metadata.
Source: microsoft/aspire#19729.
- [x] **13. Connector Namespace / Toolbox / provisioning:** add
Connector Namespace walkthrough, security/consent/revocation limits and
mapping/sidebar; add Foundry Toolbox walkthrough, connection properties,
roles, index prerequisites, approval enforcement boundaries, immutable
versions, and existing-resource behavior. Extend existing Azure
provisioning guide without a duplicate page. Sources:
microsoft/aspire#19024, microsoft/aspire#17742, microsoft/aspire#20131.
- [x] **14. Remaining high-impact items:** article covers opt-in
manifest-aware DNX and new-template CLI bundling (existing SDK guides
retained), migration skill and Copilot app detection; canonical inline
`CsiVolumeSourceV1`/`VolumeV1.Csi` example, management links, Cosmos
vNext telemetry, and AI Inference `GetModelInfoAsync`/`/info` health
checks with `DisableHealthChecks`. No Azure OpenAI health-check claim.
Sources: microsoft/aspire#19310, microsoft/aspire#19076,
microsoft/aspire#19826, microsoft/aspire#20070, microsoft/aspire#15671,
microsoft/aspire#15969.
- [x] **15. All 25 proposal dispositions:** listed below, including
newer dashboard backports and four exclusions. Existing Sandbox
inference coverage is retained rather than copied from a stale draft.
- [ ] **16. Refresh generated API/catalog/Twoslash data from an official
post-backport 13.6 build.** Existing `26473.12`/`a11eca96` data remains
untouched. The newest public `dotnet9` feed package checked,
`13.6.0-preview.1.26474.10` at
`43496a2a306c81c862c947b11b4f4e5494b6fe08`, still has no Redis
`WithRepl` in its actual package XML. Do not use 14.x, hand-edit
declarations, or attribute source changes to older binaries.
- [ ] **Validate the six REPL examples against that actual post-backport
SDK and running clients.** Their new TypeScript fences are plain
TypeScript, not annotated with unsupported Twoslash data. No existing
diagnostics are allowlisted or suppressed; no generated API exports are
fabricated. Enable Twoslash when the genuine catalog catches up.

### All 25 open proposal dispositions and provenance

Text is selectively adapted from these proposals, not merged wholesale.
#1778 and #1748 are authored by @sebastienros; the other proposals are
authored by the Aspire repo bot. The table credits the associated
product-change authors where supplied by the proposals. Existing PRs
remain open and unchanged.

| Docs PR | Release source / credited product author | Disposition |
| --- | --- | --- |
| #1778 | microsoft/aspire#19729 — @sebastienros | **Adopted:**
canonical connection-string alias correction, including logical-first
resolution and migration. |
| #1771 | microsoft/aspire#20481 — @sebastienros | **Excluded:** flat
polyglot feature keys are not in the audited release tip; no verified
backport. Preserve release key names. |
| #1770 | microsoft/aspire#20525 → microsoft/aspire#20548 — @mitchdenny
| **Corrected/adopted:** command guides plus the still-current 13.6
article, which the proposal incorrectly treats as historical. |
| #1769 | microsoft/aspire#20416 — @JamesNK | **Excluded:** brand hover
change has no verified 13.6 membership/backport. |
| #1768 | microsoft/aspire#20523 → microsoft/aspire#20546 — @JamesNK |
**Adopted:** run pin/unpin preserves selector and current selection. |
| #1766 | microsoft/aspire#20537 → microsoft/aspire#20541 — @mitchdenny
| **Adopted:** terminal dock empty state. |
| #1761 | microsoft/aspire#20490 → microsoft/aspire#20496 — @eerhardt |
**Corrected:** graduation is 13.6, package remains prerelease,
Blazor-specific exception retained. |
| #1760 | microsoft/aspire#20436 — @eerhardt | **Excluded:** CLI
net11/tools-any retarget is not in the audited release; no fallback-base
inference. |
| #1748 | microsoft/aspire#20131 — @sebastienros | **Adopted:** extend
existing provisioning guide with service-specific models/lookups and
projection limits. |
| #1744 | microsoft/aspire#20337 → microsoft/aspire#20441 — @karolz-ms |
**Adopted:** precise SDK-conditional multithreaded build coverage. |
| #1740 | microsoft/aspire#20231 → microsoft/aspire#20419 — @mitchdenny
| **Adapted:** all six guides; TypeScript-first tabs, source-verified
lifecycle/security. Actual post-backport SDK/runtime gate is open above.
|
| #1738 | microsoft/aspire#20158 → microsoft/aspire#20405 — @karolz-ms |
**Partly already covered / completed:** existing seven-skill catalog
retained; add project migration guidance and correct command
catalog/defaults. Do not misclassify the bundled skill as a companion
tool. |
| #1735 | microsoft/aspire#20334 — @karolz-ms | **Excluded:** enhanced
startup errors are not in the audited release; no verified backport. |
| #1731 | microsoft/aspire#19847 → microsoft/aspire#20391 — @eerhardt |
**Corrected/adopted:** in-process NuGet and real authenticated-restore
troubleshooting, not cache-command authentication. |
| #1719 | microsoft/aspire#20299 → microsoft/aspire#20407 — @JamesNK |
**Corrected/adopted:** cookie naming/scoping; identical names can
collide but do not guarantee cross-dashboard cookie decryptability or
shared sign-in. |
| #1664 | microsoft/aspire#20011 — @maddymontaquila | **Adopted:**
concise Azure environment icon release note. |
| #1628 | microsoft/aspire#17742 — @davidfowl | **Adapted/expanded:**
canonical Toolbox examples, consumer contract, role/index prerequisites,
approval/security and concurrency limits. |
| #1623 | microsoft/aspire#19810 — @mitchdenny | **Already covered:**
current Sandbox guide/article already describe compute inference,
explicit selection and external endpoints. Preserve that guidance while
removing obsolete suppressions. |
| #1620 | microsoft/aspire#19243 — @sebastienros | **Adapted:** AKS
credential-before-Helm cleanup and destructive-operation warning; omit
misleading ambient-context workaround. |
| #1614 | microsoft/aspire#19870 — @sebastienros | **Adopted:** typed
callback handle behavior in extension authoring and article. |
| #1574 | microsoft/aspire#19430 — @mitchdenny | **Adapted:** canonical
hostname inheritance, explicit-host precedence, catch-all default
backend. |
| #1570 | microsoft/aspire#19590 — @karolz-ms | **Adopted:** Dev Tunnel
URL regression troubleshooting. |
| #1565 | microsoft/aspire#19429 — @mitchdenny | **Corrected/adopted:**
Helm embedded parameters with real `refExpr` and `addParameter(name, {
value })`, not stringifying a handle or using an invalid actual-SDK
overload. |
| #1564 | microsoft/aspire#19026 — @karolz-ms | **Corrected/adopted:**
C#/TypeScript Dotnet gateway walkthrough. Retain both experimental
diagnostics; remove obsolete run-only restriction after
microsoft/aspire#19997 publishing support. Avoid imported ambiguous API
reference. |
| #1499 | microsoft/aspire#19248 — @IEvangelist | **Adopted:** describe
exact secret-value redaction and embedded-secret limit; release article
already covered the fix. |

### Important source-verified corrections to proposals / earlier audit
assumptions

-
[`BlazorGatewayExtensions.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Blazor/BlazorGatewayExtensions.cs):
`AddDotnetProjectBlazorGateway` and the Dotnet `WithBlazorClientApp`
overload still carry `ASPIREDOTNETPROJECT001`; the class carries
`ASPIREBLAZOR001`. They share `WithBlazorClientAppCore`/`WithBlazorApp`
and the publish-companion path. Thus neither blanket diagnostic
retirement nor the proposal's old run-only claim is correct.
-
[`SkillDefinition.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Agents/SkillDefinition.cs)
sets bundled skills' `IsDefault=true`;
[`AgentInitCommand.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Commands/AgentInitCommand.cs)
selects the applicable catalog defaults for both flows. MCP has its own
standalone-only binding.
-
[`TypeScriptAppHostToolchainResolver.cs`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Cli/Projects/TypeScriptAppHostToolchainResolver.cs)
is the source for Deno flags and certificate variable; guest Deno
hosting is separate.
- [`Radius
README`](https://github.com/microsoft/aspire/blob/e8fd6fbb954f50ccd2e66479538392f65e13e71d/src/Aspire.Hosting.Radius/README.md)
supplies the resource-specific credential rules and publish diagnostics,
not assumptions about local endpoints.

## Third-party links and affiliations

<!-- List third-party links and disclose material affiliations. -->

Links point to official Microsoft Learn, VS Code Marketplace debugger
extensions, Rust/Cargo/Bacon documentation, Radius documentation, and
source repositories. No sponsorship, commercial endorsement, or
affiliation claim is introduced. Maintainers should supply any personal
affiliation disclosure required by policy; automation has not inferred
one.

## Validation

<!-- List the checks you ran or explain why validation isn't needed. -->

- **97 passing focused unit checks** across API-reference
authoring/rendering, Twoslash blocks, file-tree formatting, CLI
configuration schema, SEO lengths, and resource catalog.
- **82 passing structured-data checks**, including exact integration
mapping uniqueness and page resolution.
- **11 C# samples compile**, zero warnings/errors, using genuine
`13.6.0-preview.1.26473.12` packages. Scope: Rust, Connector Namespace,
Radius, Toolbox, inline CSI, Helm, Blazor gateway, and provisioning.
`Projects.Api/Worker/Client` use compile-only `IProjectMetadata`
stand-ins; no claim of running those apps or provisioning cloud
resources.
- **10 TypeScript samples pass `tsc`** under `strict`, `NodeNext`, and
`ES2022` against three **unmodified actual SDK files**, not just the
site's declaration bundle. The fixture uses the exact `e8fd6fbb` release
`AtsCapabilityScanner` and genuine `26473.12`
TypeSystem/code-generator/integration binaries, whose informational
source is `a11eca96`. This is an isolated local generation fixture,
**not** a claim that official CLI generation or a new packaged release
was tested. An attempted restore with the older handed-off local CLI
could not discover an AppHost server; the bounded direct generator
fixture was used instead.
- The SDK scan is **not globally warning-free**: it reports a Radius
`withContainerImage` collision on `CSharpAppResource` and an App
Configuration `createRoleAssignment` overload collision. None of the
compiled examples calls those colliding methods; the warnings are
retained in evidence, not suppressed, and no generated declarations were
edited.
- Browser: Connector Namespace, Radius, both Rust pages, Foundry
hosting, and What's new return **HTTP 200**, correct headings, and no
rendered Twoslash errors. New guide/article page-local anchors and the
cross-page Blazor anchor resolve. Connector/Radius mobile layouts have
no horizontal overflow; Connector language-tab interaction works.
Standalone Astro preview emits expected `/api/live` 404s because
StaticHost is not running.
- `git diff --check` passes. No production `pnpm build`, cloud
deployment, REPL runtime session, full product suite, or blanket
validation of every pre-existing example was performed.
- Generated C#/TypeScript API data, declaration bundles, integration
catalogs, image catalogs, and contributor data are unchanged. Only the
authored package-to-guide mapping is updated.

**Before merging:** complete the two packaging/REPL checkboxes above,
inspect CI, and obtain human review. This PR intentionally does not
close or merge the source documentation proposals.

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Karol Zadora-Przylecki (karolz-ms) added a commit to microsoft/aspire.dev that referenced this pull request Sep 28, 2026
Documents changes from microsoft/aspire#20337

``@karolz-ms``

**Target branch**: Targeting `release/13.6` — the latest release branch
on `microsoft/aspire.dev` — because `release/14.0` (from the source PR
milestone `14.0`) does not exist there.

## Why this PR is needed

microsoft/aspire#20337 adds multithreaded .NET project build support:
Aspire now detects the `dotnet` SDK selected for each build context
(honoring `global.json`) and, when the SDK supports the .NET SDK 11 RC1
`-mt` MSBuild switch, enables it for:

- Coordinated traversal builds
- File-based (`.cs`) app builds
- Individual project rebuild commands

`-mt` was not previously documented anywhere on the docs site, and the
existing "Coordinated builds and restore" section on the project
resources page was the natural place for it since it already documents
the build/restore pipeline this feature extends.

## What was changed

Added a new **"Multithreaded builds"** subsection to
`integrations/dotnet/project-resources.mdx`, right after the existing
"Coordinated builds and restore" section. It explains:

- That Aspire automatically applies `-mt` when the detected SDK supports
it, with no configuration required
- The SDK version floors: `11.0.100-rc.1` or later for project/traversal
builds, and `11.0.100-rtm.26473.104` (or stable `11.0.100`+) for
file-based apps, since earlier .NET 11 prereleases lack the safe `-mt`
argument forwarding and compiler-client mutex mitigation
- That Aspire falls back to the existing build behavior when SDK version
detection fails or the SDK doesn't meet the floor
- A cross-reference to the existing rebuild-command docs on the hot
reload/watch page

## Files modified

-
`src/frontend/src/content/docs/integrations/dotnet/project-resources.mdx`
— new "Multithreaded builds" subsection (1 file changed, 17 insertions)

No new pages were created; this is an update to an existing page.

> Generated by [PR Documentation
Check](https://github.com/microsoft/aspire/actions/runs/36045520050) for
#20337 · copilot · auto · 85.3 AIC · ⌖ 11.4 AIC · ⊞ 20.1K ·
[◷](https://github.com/search?q=repo%3Amicrosoft%2Faspire.dev+%22gh-aw-workflow-id%3A+pr-docs-check%22&type=pullrequests)

<!-- gh-aw-agentic-workflow: PR Documentation Check, engine: copilot,
model: auto, id: 36045520050, workflow_id: pr-docs-check, run:
https://github.com/microsoft/aspire/actions/runs/36045520050 -->

<!-- gh-aw-workflow-id: pr-docs-check -->
<!-- gh-aw-workflow-call-id: microsoft/aspire/pr-docs-check -->
@karolz-ms
Karol Zadora-Przylecki (karolz-ms) deleted the dev/karolz/project-v2-multithreaded-build branch September 30, 2026 18:13
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 31, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve Project Resource V2 coordinated build performance

3 participants