Skip to content

Use C# Dev Kit selected workspace dotnet host for debugger prerequisite checks #9732

Description

@JakeRadMSFT

Problem

When C# Dev Kit owns workspace SDK selection through Workspace Requirements, the C# extension still independently runs dotnet --info against its own configured paths/ambient PATH during debugger activation.

In a Remote SSH Linux workspace with no ambient dotnet on PATH, this produces two competing remediations at once:

  • C# Dev Kit opens Workspace Requirements with Install .NET 10 SDK.
  • The C# extension shows The .NET SDK cannot be located with Get the SDK.

The C# notification is especially confusing because its Get the SDK action already delegates to csdevkit.installDotnetSdk when C# Dev Kit is present, while the prerequisite check that raised it did not use C# Dev Kit's selected host or blocked state.

Observed with:

  • C# Dev Kit 9.9.554-g91f1bb
  • C# 2.140.9
  • VS Code Remote SSH to Ubuntu 24.04 x64
  • no ambient dotnet on the remote PATH

Relevant current code:

  • src/coreclrDebug/util.ts: checkDotNetCli() runs dotnet --info using C# extension paths.
  • src/coreclrDebug/activate.ts: showDotnetToolsWarning() routes Get the SDK to csdevkit.installDotnetSdk when Dev Kit is present.
  • src/utils/getCSharpDevKit.ts and src/csharpDevKitExports.ts: C# already discovers and consumes C# Dev Kit exports, but there is no selected workspace host/readiness contract.

Expected behavior

C# Dev Kit should be the single SDK/host authority when it is active and dotnet.preferCSharpExtension is not selected:

  1. C# obtains the exact workspace dotnet executable and environment selected by C# Dev Kit before debugger prerequisite checks.
  2. If Workspace Requirements is blocked and has opened its remediation UI, C# does not show a second SDK-install notification.
  3. After the user installs or selects the SDK and reloads, both extensions use the same host.
  4. When C# Dev Kit is absent or explicitly bypassed, C# retains its current standalone discovery and notification behavior.

A minimal contract could be an optional C# Dev Kit export returning { status: ready | blocked, dotnetPath?, environment? }. Because workspace host changes are already reload-bound, this does not require live language-server/debugger host switching.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions