dotnet / dotnet/vscode-csharp

`dotnet.generateAssets` persists C# Dev Kit temporary solution paths in build and publish tasks

Open
#9,748 1 comment 0 reactions 0 assignees View on GitHub
Bug C#DK Launch and Task Assets
Dominant language
TypeScript
Stars
3.1k
Forks
737
Avg merge
18h 40m
Merged PRs (30d)
31

Description

Type: Bug

## Summary

`dotnet.generateAssets` can persist C# Dev Kit’s temporary solution path in generated tasks instead of the application’s `.csproj`. This produces machine-specific configuration and, when the workspace and temporary solution are on different Windows drives, an invalid path.

This affects Container Tools’ **Add Docker Files to Workspace** command, which delegates .NET asset generation to the C# extension. Tracked downstream in microsoft/vscode-containers#605.

## Steps to reproduce

1. Install the C# and C# Dev Kit extensions.
2. Create an ASP.NET Core project without a solution file on a drive different from VS Code’s user-data directory:
```powershell
dotnet new mvc -o D:\Sandbox\ExampleApp
```
3. Open that folder in VS Code and allow Dev Kit to load it in workspace mode.
4. Run **Containers: Add Docker Files to Workspace**, selecting ASP.NET Core and Linux.
5. Inspect the generated `.vscode/tasks.json` and run the `build` task.

Container Tools invokes:
```ts
vscode.commands.executeCommand(
'dotnet.generateAssets',
undefined,
{ skipPrompt: true }
);
```

Reproduced with:
- Container Tools 2.5.0
- C# 2.140.9
- C# Dev Kit 3.20.207
- .NET SDK 10.0.400
- Windows, with the project on `D:` and VS Code user data on `C:`

## Actual behavior

The generated build, publish, and watch tasks reference a path shaped like:

```text
./${workspaceFolder}/c:/Users//AppData/Roaming/Code/User/workspaceStorage//ms-dotnettools.csdevkit/ExampleApp.sln
```

The build fails with:

```text
MSBUILD : error MSB1009: Project file does not exist.
```

The original temporary solution **does exist** on `C:`. The generated argument is malformed. Building the actual `.csproj` succeeds.

Even without the cross-drive failure, persisting a solution under VS Code’s workspace storage makes the configuration dependent on the generating user’s environment.

## Expected behavior

Persist the selected project’s workspace-relative path in build, publish, and watch tasks, regardless of whether Dev Kit is installed:

```text
${workspaceFolder}/ExampleApp.csproj
```

Checked-in configuration should work for teammates using the C# extension and .NET SDK without requiring Dev Kit or its generated temporary solution.

## Investigation

In [`src/shared/assets.ts`](https://github.com/dotnet/vscode-csharp/blob/acb734bcbdf9e4638d3a4072be54a2ea46fabf8c/src/shared/assets.ts#L303-L325):

- `getBuildProjectPath()` prefers any nonempty `solutionPath` over `projectPath`.
- `getBuildPath()` unconditionally joins `${workspaceFolder}` with `path.relative(workspace, target)`. Across Windows drives, the latter returns an absolute path, making the join invalid.

Solution preference was introduced by commit [`7fb0321`](https://github.com/dotnet/vscode-csharp/commit/7fb032103de19e3d0013aa12a11c2e8c426bf2a2). Dev Kit’s [solution-free workspace behavior](https://github.com/microsoft/vscode-dotnettools/issues/871#issuecomment-2679489226) exposes this by creating solutions outside the workspace.

dotnet/vscode-csharp#9704 already changes **watch** to use the project path. Build and publish still prefer the solution.

## Suggested resolution

Prefer project paths for newly generated persisted tasks, leaving existing user-authored tasks unchanged.

If solution-based build/publish defaults must be retained, please expose a supported `dotnet.generateAssets` option to request project-based tasks. Currently, `selectedIndex` selects a project but does not override solution preference, and `skipPrompt` only controls the Dev Kit recommendation dialog.

Such an option would let Container Tools request portable configuration without duplicating C# asset generation or post-processing `tasks.json` and `launch.json`.

Extension version: 2.140.9
VS Code version: Code 1.137.0 (645f29cc3176500b4b5762ba887cf2a7f0ffdf2c, 2026-09-08T13:43:59-07:00)
OS version: Windows_NT x64 10.0.26200
Modes:

### Logs ###

### C# log ###

```
2026-09-10 12:01:59.170 [info] Locating .NET runtime version 10.0.5
2026-09-10 12:01:59.455 [info] Dotnet path: C:\Program Files\dotnet\dotnet.exe
2026-09-10 12:01:59.455 [info] Activating C# + C# Dev Kit...
2026-09-10 12:02:00.047 [info] info: Program[0]
2026-09-10 12:02:00.047 [info] Server started with process ID 9236
2026-09-10 12:02:00.875 [info] [Program] Language server initialized
2026-09-10 12:02:00.877 [info] [Program] Monitoring client process 9804 for exit
2026-09-10 12:02:01.531 [info] [initialized] [Microsoft.CodeAnalysis.LanguageServer.FileBasedPrograms.FileBasedProgramsEntryPointDiscovery] Finished discovery in 'd:\Sandbox\ContainersIssue605-55ffe9f3' in 9 milliseconds
2026-09-10 12:02:04.881 [info] [serviceBroker/connect] [WorkspaceProjectFactoryService] Project D:\Sandbox\ContainersIssue605-55ffe9f3\ContainersIssue605.csproj loaded by C# Dev Kit

```

### C# LSP Trace Logs log ###

```

```

## Environment Information ##
**VSCode version**: 1.137.0
**C# Extension**: 2.140.9
**Using OmniSharp**: false

Dotnet Information
.NET SDK:
Version: 10.0.400
Commit: 14fbf8d527
Workload version: 10.0.400-manifests.b0ae88bd
MSBuild version: 18.9.6+14fbf8d52

Runtime Environment:
OS Name: Windows
OS Version: 10.0.26200
OS Platform: Windows
RID: win-x64
Base Path: C:\Program Files\dotnet\sdk\10.0.400\

.NET workloads installed:
There are no installed workloads to display.
Configured to use workload sets when installing new manifests.
No workload sets are installed. Run "dotnet workload restore" to install a workload set.

Host:
Version: 10.0.12
Architecture: x64
Commit: 95017c711e

.NET SDKs installed:
8.0.425 [C:\Program Files\dotnet\sdk]
9.0.318 [C:\Program Files\dotnet\sdk]
10.0.400 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.31 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 9.0.20 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 10.0.11 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.31 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 9.0.20 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 10.0.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 10.0.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.WindowsDesktop.App 8.0.31 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 9.0.20 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 10.0.11 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
Microsoft.WindowsDesktop.App 10.0.12 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
x86 [C:\Program Files (x86)\dotnet]
registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
DOTNET_CLI_UI_LANGUAGE [en-US]

global.json file:
Not found

Learn more:
https://aka.ms/dotnet/info

Download .NET:
https://aka.ms/dotnet/download

Visual Studio Code Extensions

|Extension|Author|Version|Folder Name|
|---|---|---|---|
|azure-dev|ms-azuretools|0.10.0|ms-azuretools.azure-dev-0.10.0|
|csdevkit|ms-dotnettools|3.20.207|ms-dotnettools.csdevkit-3.20.207-win32-x64|
|csharp|ms-dotnettools|2.140.9|ms-dotnettools.csharp-2.140.9-win32-x64|
|debugpy|ms-python|2026.6.0|ms-python.debugpy-2026.6.0-win32-x64|
|esbuild-problem-matchers|connor4312|0.0.3|connor4312.esbuild-problem-matchers-0.0.3|
|memento-explorer|bwater|0.1.7|bwater.memento-explorer-0.1.7|
|native-preview|TypeScriptTeam|0.20260708.2|typescriptteam.native-preview-0.20260708.2-win32-x64|
|python|ms-python|2026.4.0|ms-python.python-2026.4.0-win32-x64|
|remote-containers|ms-vscode-remote|0.469.0|ms-vscode-remote.remote-containers-0.469.0|
|remote-explorer|ms-vscode|0.5.0|ms-vscode.remote-explorer-0.5.0|
|remote-ssh|ms-vscode-remote|0.128.0|ms-vscode-remote.remote-ssh-0.128.0|
|remote-ssh-edit|ms-vscode-remote|0.87.0|ms-vscode-remote.remote-ssh-edit-0.87.0|
|vscode-azure-github-copilot|ms-azuretools|1.0.231|ms-azuretools.vscode-azure-github-copilot-1.0.231-win32-x64|
|vscode-azure-mcp-server|ms-azuretools|2.0.46|ms-azuretools.vscode-azure-mcp-server-2.0.46-win32-x64|
|vscode-azureappservice|ms-azuretools|0.27.0|ms-azuretools.vscode-azureappservice-0.27.0|
|vscode-azurefunctions|ms-azuretools|1.22.1|ms-azuretools.vscode-azurefunctions-1.22.1|
|vscode-azureresourcegroups|ms-azuretools|0.12.7|ms-azuretools.vscode-azureresourcegroups-0.12.7|
|vscode-containers|ms-azuretools|2.5.0|ms-azuretools.vscode-containers-2.5.0|
|vscode-dotnet-runtime|ms-dotnettools|3.1.0|ms-dotnettools.vscode-dotnet-runtime-3.1.0|
|vscode-eslint|dbaeumer|3.0.34|dbaeumer.vscode-eslint-3.0.34|
|vscode-pull-request-github|GitHub|0.166.0|github.vscode-pull-request-github-0.166.0|
|vscode-pylance|ms-python|2026.3.1|ms-python.vscode-pylance-2026.3.1|
|vscode-remote-extensionpack|ms-vscode-remote|0.26.0|ms-vscode-remote.vscode-remote-extensionpack-0.26.0|
|vscode-yaml|redhat|1.24.0|redhat.vscode-yaml-1.24.0|;

C# Settings

|Setting|Value|
|---|---|
|preferCSharpExtension|false|
|compilerDiagnosticScope|openFiles|
|analyzerDiagnosticScope|openFiles|
|enableXamlTools|true|
|useServerGC|true|;

System Info

|Item|Value|
|---|---|
|CPUs|Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz (20 x 3696)|
|GPU Status|2d_canvas: enabled
GPU0: VENDOR= 0x8086, DEVICE=0x9bc5 [Intel(R) UHD Graphics 630], DRIVER_VENDOR=Intel, DRIVER_VERSION=30.0.101.1273 *ACTIVE*
GPU1: VENDOR= 0x1414, DEVICE=0x008c [Microsoft Basic Render Driver], DRIVER_VERSION=10.0.26100.9278
Machine model name:
Machine model version:
direct_rendering_display_compositor: disabled_off_ok
gpu_compositing: enabled
multiple_raster_threads: enabled_on
opengl: enabled_on
rasterization: enabled
raw_draw: disabled_off_ok
skia_graphite: disabled_off
trees_in_viz: disabled_off
video_decode: enabled
video_encode: enabled
webgl: enabled
webgpu: enabled
webnn: disabled_off|
|Load (avg)|undefined|
|Memory (System)|126.84GB (102.06GB free)|
|Process Argv|--log ms-azuretools.azureextensionui=trace --log ms-azuretools.vscode-containers=debug --log ms-azuretools.vscode-azure=debug --crash-reporter-id 346e43a8-9268-4087-a447-da84e0fdc384|
|Screen Reader|yes|
|VM|0%|

Contributor guide

Open the contributing guide

Research direction

Start in src/shared/assets.ts at getBuildProjectPath() and getBuildPath(), then review the existing watch-path change referenced as dotnet/vscode-csharp#9704. Reproduce asset generation across Windows drives and verify that generated build, publish, and watch tasks use the selected workspace-relative .csproj path rather than the temporary solution.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp, typescript, vscode
Domain
build-system, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
74/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.