| name | dotnet |
| description | Use when configuring dev containers for .NET projects. Covers the dotnet feature, SDK versions, workloads, C# Dev Kit extensions, and NuGet configuration.
USE FOR: .NET dev container setup, dotnet SDK feature, C# Dev Kit extensions, NuGet configuration, .NET workloads in Codespaces
DO NOT USE FOR: Python dev containers (use python), TypeScript dev containers (use typescript), .NET Aspire dev containers (use aspire)
|
| license | MIT |
| metadata | {"displayName":"Dev Container — .NET","author":"Tyler-R-Kendrick"} |
| compatibility | claude, copilot, cursor |
| references | [{"title":"Dev Containers Specification","url":"https://containers.dev/"},{"title":".NET Official Documentation","url":"https://learn.microsoft.com/en-us/dotnet/"}] |
Dev Container — .NET
Overview
Configure a dev container for .NET development using the official dotnet feature. Supports multiple SDK versions, workloads, and integration with C# Dev Kit.
Dotnet Feature
{
"features": {
"ghcr.io/devcontainers/features/dotnet:2": {
"version": "9.0",
"additionalVersions": "8.0"
}
}
}
Feature Options
| Option | Default | Description |
|---|
version | latest | Primary .NET SDK version (9.0, 8.0, latest, none) |
additionalVersions | | Comma-separated extra SDK versions to install |
workloads | | Comma-separated .NET workloads (e.g., aspire, wasm-tools, maui) |
installUsingApt | true | Use apt package manager when available |
Install Workloads
{
"features": {
"ghcr.io/devcontainers/features/dotnet:2": {
"version": "9.0",
"workloads": "aspire, wasm-tools"
}
}
}
Full Example
{
"name": ".NET 9 Development",
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0",
"features": {
"ghcr.io/devcontainers/features/github-cli:1": {}
},
"forwardPorts": [5000, 5001],
"portsAttributes": {
"5000": { "label": "HTTP", "onAutoForward": "notify" },
"5001": { "label": "HTTPS", "onAutoForward": "notify" }
},
"postCreateCommand": "dotnet restore"
Using the Base Image vs Feature
| Approach | When to Use |
|---|
"image": "mcr.microsoft.com/devcontainers/dotnet:9.0" | .NET-only projects; comes preconfigured |
Base image + ghcr.io/devcontainers/features/dotnet:2 | Multi-language projects; compose with other features |
NuGet Configuration
Mount a local NuGet config or set package sources via environment variables:
{
"containerEnv": {
"NUGET_PACKAGES": "/home/vscode/.nuget/packages",
"DOTNET_CLI_TELEMETRY_OPTOUT": "1"
},
"mounts": [
"source=${localEnv:HOME}/.nuget,target=/home/vscode/.nuget,type=bind,consistency=cached"
]
}
Multi-Project Solutions
For solutions with multiple projects, set the workspace folder and default solution:
{
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"settings": {
"dotnet.defaultSolution": "src/MyApp.sln",
"omnisharp.enableMsBuildLoadProjectsOnDemand": true
}
}
},
"postCreateCommand": "dotnet restore src/MyApp.sln"
}
Best Practices
- Use the dedicated
mcr.microsoft.com/devcontainers/dotnet image for .NET-only projects — it includes the SDK, runtime, and common tools.
- Use the dotnet feature on a base image when you need .NET alongside other languages.
- Pin to a major SDK version (
9.0, 8.0) rather than latest for reproducibility.
- Install workloads via the feature's
workloads option rather than in postCreateCommand so they are cached in prebuilds.
- Add
ms-dotnettools.csdevkit for full IDE experience (solution explorer, test explorer, refactoring).
- Set
DOTNET_CLI_TELEMETRY_OPTOUT=1 in containerEnv for CI-like environments.
- Forward ports 5000/5001 for Kestrel HTTP/HTTPS and use
portsAttributes for auto-open behavior.