diff --git a/docs/core/additional-tools/self-signed-certificates-guide.md b/docs/core/additional-tools/self-signed-certificates-guide.md index 4f795972ae773..330d43420741f 100644 --- a/docs/core/additional-tools/self-signed-certificates-guide.md +++ b/docs/core/additional-tools/self-signed-certificates-guide.md @@ -2,7 +2,7 @@ title: Generate Self-Signed Certificates Overview description: An overview of the dotnet dev-certs tool that adds functionality for .NET and ASP.NET Core projects, and other options for using self-signed certificates. author: angee -ms.date: 12/06/2021 +ms.date: 05/27/2026 ms.custom: sfi-ropc-nochange --- @@ -10,7 +10,7 @@ ms.custom: sfi-ropc-nochange There are different ways to create and use self-signed certificates for development and testing scenarios. This article covers using self-signed certificates with `dotnet dev-certs`, and other options like `PowerShell` and `OpenSSL`. -You can then validate that the certificate will load using an example such as an [ASP.NET Core app](https://github.com/dotnet/dotnet-docker/blob/main/samples/run-aspnetcore-https-development.md) hosted in a container. +You can then validate that the certificate loads using an example such as an [ASP.NET Core app](https://github.com/dotnet/dotnet-docker/blob/main/samples/run-aspnetcore-https-development.md) hosted in a container. ## Prerequisites @@ -20,21 +20,21 @@ For `dotnet dev-certs`, be sure to have the appropriate version of .NET installe * [Install .NET on Linux](../install/linux.md) * [Install .NET on macOS](../install/macos.md) -This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). +This sample requires the [Docker client](https://www.docker.com/products/docker). ## Prepare sample app -For this guide, you'll use a [sample app](https://hub.docker.com/_/microsoft-dotnet-samples) and make changes where appropriate. +For this guide, you'll use a [sample app](https://hub.docker.com/r/microsoft/dotnet-samples) and make changes where appropriate. -Check that the sample app [Dockerfile](https://github.com/dotnet/dotnet-docker/blob/main/samples/aspnetapp/Dockerfile) is using .NET 8. +Check that the sample app [Dockerfile](https://github.com/dotnet/dotnet-docker/blob/main/samples/aspnetapp/Dockerfile) is using .NET 10. -Depending on the host OS, you might need to update the ASP.NET runtime. For example, to target the appropriate Windows runtime, change `mcr.microsoft.com/dotnet/aspnet:8.0-nanoservercore-2009 AS runtime` to `mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime` in the Dockerfile. +Depending on the host OS, you might need to update the ASP.NET runtime. For example, to target the appropriate Windows runtime, change `mcr.microsoft.com/dotnet/aspnet:10.0-nanoservercore-2009 AS runtime` to `mcr.microsoft.com/dotnet/aspnet:10.0-windowsservercore-ltsc2022 AS runtime` in the Dockerfile. For example, this will help with testing the certificates on Windows: ```Dockerfile -# https://hub.docker.com/_/microsoft-dotnet -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +# https://github.com/dotnet/dotnet-docker/blob/main/README.sdk.md +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -48,7 +48,7 @@ WORKDIR /source/aspnetapp RUN dotnet publish -c release -o /app -r win-x64 --self-contained false --no-restore # final stage/image -FROM mcr.microsoft.com/dotnet/aspnet:8.0-windowsservercore-ltsc2022 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:10.0-windowsservercore-ltsc2022 AS runtime WORKDIR /app COPY --from=build /app ./ ENTRYPOINT ["aspnetapp"] @@ -62,7 +62,7 @@ Make sure the `aspnetapp.csproj` includes the appropriate target framework: - net8.0 + net10.0 @@ -97,22 +97,28 @@ You can create a self-signed certificate: You can use `dotnet dev-certs` to work with self-signed certificates. ```powershell -dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p crypticpassword +dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p $CREDENTIAL_PLACEHOLDER$ dotnet dev-certs https --trust ``` > [!NOTE] -> The certificate name, in this case *aspnetapp*.pfx, must match the project assembly name. `crypticpassword` is used as a stand-in for a password of your own choosing. If console returns "A valid HTTPS certificate is already present.", a trusted certificate already exists in your store. It can be exported using MMC Console. +> The certificate name, in this case *aspnetapp*.pfx, must match the project assembly name. `$CREDENTIAL_PLACEHOLDER$` represents a password of your own choosing. If the console returns "A valid HTTPS certificate is already present.", a trusted certificate already exists in your store. You can export it using the MMC Console. +> +> In .NET 10 and later, if you run `dotnet dev-certs https --trust` inside a Windows Subsystem for Linux (WSL) instance, the command also trusts the certificate on the Windows host. +> +> In .NET 10 and later, the generated certificate includes subject alternative names (SANs) for `host.docker.internal` and `host.containers.internal`, which lets you use the certificate directly in container-based local development scenarios without extra configuration. +> +> To verify that a trusted development certificate is present, run `dotnet dev-certs https --check --trust`. Configure application secrets, for the certificate: ```console dotnet user-secrets -p aspnetapp\aspnetapp.csproj init -dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" +dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "$CREDENTIAL_PLACEHOLDER$" ``` > [!NOTE] -> Note: The password must match the password used for the certificate. +> The password must match the password used for the certificate. Run the container image with ASP.NET Core configured for HTTPS: @@ -143,7 +149,7 @@ The certificate will be generated, but for the purposes of testing, should be pl ```powershell $certKeyPath = "c:\certs\contoso.com.pfx" -$password = ConvertTo-SecureString 'password' -AsPlainText -Force +$password = ConvertTo-SecureString '$CREDENTIAL_PLACEHOLDER$' -AsPlainText -Force $cert | Export-PfxCertificate -FilePath $certKeyPath -Password $password $rootCert = $(Import-PfxCertificate -FilePath $certKeyPath -CertStoreLocation 'Cert:\LocalMachine\Root' -Password $password) ``` @@ -153,16 +159,16 @@ At this point, the certificates should be viewable from an [MMC snap-in](../../f You can run the sample container in Windows Subsystem for Linux (WSL): ```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp +docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="$CREDENTIAL_PLACEHOLDER$" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/contoso.com.pfx -v /c/certs:/https/ mcr.microsoft.com/dotnet/samples:aspnetapp ``` > [!NOTE] -> Note that with the volume mount, the file path could be handled differently based on host. For example, in WSL you might replace */c/certs* with */mnt/c/certs*. +> With the volume mount, the file path could be handled differently based on host. For example, in WSL you might replace */c/certs* with */mnt/c/certs*. If you're using the container built earlier for Windows, the run command would look like the following: ```console -docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="password" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample +docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Default__Password="$CREDENTIAL_PLACEHOLDER$" -e ASPNETCORE_Kestrel__Certificates__Default__Path=c:\https\contoso.com.pfx -v c:\certs:C:\https aspnetapp:my-sample ``` Once the application is up, navigate to contoso.com:8001 in a browser. diff --git a/docs/core/additional-tools/uninstall-tool-cli-dry-run.md b/docs/core/additional-tools/uninstall-tool-cli-dry-run.md index 6fc6fb56a85d8..9d6e41dadf4e4 100644 --- a/docs/core/additional-tools/uninstall-tool-cli-dry-run.md +++ b/docs/core/additional-tools/uninstall-tool-cli-dry-run.md @@ -2,7 +2,7 @@ title: dotnet-core-uninstall dry-run command description: The dotnet-core-uninstall dry-run command simulates uninstalling the target .NET SDK or runtime. Status is reported for potential removal. author: adegeo -ms.date: 08/04/2024 +ms.date: 05/27/2026 zone_pivot_groups: operating-systems-set-three --- @@ -22,13 +22,10 @@ zone_pivot_groups: operating-systems-set-three ::: zone pivot="os-windows" ```dotnetcli -dotnet-core-uninstall dry-run [--x64|--x86] ... - [-v|--verbosity ] [--force] +dotnet-core-uninstall dry-run [-v|--verbosity ] + [--force] [-y|--yes] -dotnet-core-uninstall dry-run [--x64|--x86] - [-v|--verbosity ] - -dotnet-core-uninstall dry-run -h|--help|-? +dotnet-core-uninstall dry-run -h|--help ``` ::: zone-end @@ -36,13 +33,10 @@ dotnet-core-uninstall dry-run -h|--help|-? ::: zone pivot="os-macos" ```dotnetcli -dotnet-core-uninstall dry-run ... - [-v|--verbosity ] [--force] [-y|--yes] - -dotnet-core-uninstall dry-run - [-v|--verbosity ] [--force] [-y|--yes] +dotnet-core-uninstall dry-run [-v|--verbosity ] + [--force] [-y|--yes] [--preserve-vs-for-mac-sdks] -dotnet-core-uninstall dry-run -h|--help|-? +dotnet-core-uninstall dry-run -h|--help ``` ::: zone-end @@ -53,10 +47,6 @@ The `dotnet-core-uninstall dry-run` command simulates .NET SDK and runtime remov ### Arguments -**`TARGET`** - - The type you want to uninstall. Valid options are listed in the [Options - TARGET](#options---target) section. - **`VERSION`** The version to uninstall. You can list several versions separated by a space. Response files are also supported. @@ -64,47 +54,53 @@ The `dotnet-core-uninstall dry-run` command simulates .NET SDK and runtime remov > [!TIP] > Response files are an alternative to placing all the versions on the command line. They're text files, typically with a *\*.rsp* extension, and each version is listed on a separate line. To specify a response file for the `VERSION` argument, use the \@ character immediately followed by the response file name. -**`FILTER`** - - Specifies a value used to filter the `TARGET`. Valid options are listed in the [Options - FILTER](#options---filter) section. - ## Options - TARGET ::: zone pivot="os-windows" - **`--aspnet-runtime`** - - Discovers all the ASP.NET Core runtimes that can be uninstalled with this tool. + + Removes ASP.NET Core runtimes only. - **`--hosting-bundle`** - - Lists all the .NET hosting bundles that can be uninstalled with this tool. -::: zone-end + Removes .NET Core Runtime and Hosting Bundles only. - **`--runtime`** - Lists all the .NET runtimes that can be uninstalled with this tool. + Removes .NET Core runtimes only. - **`--sdk`** - Lists all the .NET SDKs that can be uninstalled with this tool. + Removes .NET Core SDKs only. -::: zone pivot="os-windows" +- **`--windows-desktop-runtime`** -- **`--x64`** + Removes Windows Desktop runtimes only. - Lists all the x64 .NET SDKs and runtimes that can be uninstalled with this tool. +- **`--arm64`** - > [!NOTE] - > If `--x64` or `--x86` isn't specified, then both x64 and x86 will be removed. + Use with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove arm64. + +- **`--x64`** + + Use with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove x64. - **`--x86`** - Lists all the x86 .NET SDKs and runtimes that can be uninstalled with this tool. + Use with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove x86. - > [!NOTE] - > If `--x64` or `--x86` isn't specified, then both x64 and x86 will be removed. +::: zone-end + +::: zone pivot="os-macos" + +- **`--runtime`** + + Removes .NET Core runtimes only. + +- **`--sdk`** + + Removes .NET Core SDKs only. ::: zone-end @@ -146,26 +142,56 @@ These options are exclusive. ## Options +::: zone pivot="os-windows" + - **`--force`** Forces removal of versions that might be used by Visual Studio. +::: zone-end + +::: zone pivot="os-macos" + +- **`--force`** + + Forces removal of versions that might be used by Visual Studio for Mac or SDKs. + +- **`--preserve-vs-for-mac-sdks`** + + Prevents removal of SDKs and runtimes that have a high probability of being used by Visual Studio for Mac. + + > [!NOTE] + > Visual Studio for Mac is out of support. + +::: zone-end + - **`-v, --verbosity `** - Sets the verbosity level. The default value is `normal`. Allowed values are: + Sets the verbosity level. Allowed values are: - `q[uiet]` - `m[inimal]` - `n[ormal]` - `d[etailed]` - - `diag[nostic]`. + - `diag[nostic]` - **`-?|-h|--help`** - Shows help and usage information + Shows help and usage information. + +::: zone pivot="os-windows" + +> [!NOTE] +> By default, SDKs and runtimes that have a high probability of being used by Visual Studio aren't removed. To remove these, specify them individually or use `--force`. If removing SDKs or runtimes causes issues with your Visual Studio installation, run Repair. SDKs and runtimes are available for download at [https://aka.ms/dotnet-core-download](https://aka.ms/dotnet-core-download). + +::: zone-end + +::: zone pivot="os-macos" > [!NOTE] -> By default, .NET SDKs and runtimes that might be required by Visual Studio or other SDKs aren't included in the `dotnet-core-uninstall dry-run` output. Also, depending on the state of the machine, some of the specified SDKs and runtimes might not be included in the output. To include all the SDKs and runtimes, list them explicitly as arguments or use the `--force` option. +> Use `--preserve-vs-for-mac-sdks` to prevent removal of SDKs and runtimes that have a high probability of being used by Visual Studio for Mac. Visual Studio for Mac is out of support. SDKs and runtimes are available for download at [https://aka.ms/dotnet-core-download](https://aka.ms/dotnet-core-download). + +::: zone-end - Dry run of removing all the .NET runtimes that have been superseded by higher patches: @@ -176,12 +202,9 @@ These options are exclusive. - Dry run of removing all the .NET SDKs below the version `6.0.301`: ```console - dotnet-core-uninstall whatif --all-below 6.0.301 --sdk + dotnet-core-uninstall dry-run --all-below 6.0.301 --sdk ``` - > [!TIP] - > The `dotnet-core-uninstall whatif` command is the same command as `dry-run`. - ## See also - [.NET uninstall tool overview](uninstall-tool-overview.md) diff --git a/docs/core/additional-tools/uninstall-tool-cli-list.md b/docs/core/additional-tools/uninstall-tool-cli-list.md index 757726772d827..f86e58054be11 100644 --- a/docs/core/additional-tools/uninstall-tool-cli-list.md +++ b/docs/core/additional-tools/uninstall-tool-cli-list.md @@ -2,7 +2,7 @@ title: dotnet-core-uninstall list command description: The dotnet-core-uninstall list command lists .NET SDKs and runtimes that can be removed with the tool. author: adegeo -ms.date: 08/04/2024 +ms.date: 05/27/2026 zone_pivot_groups: operating-systems-set-three --- @@ -19,8 +19,9 @@ zone_pivot_groups: operating-systems-set-three ::: zone pivot="os-windows" ```dotnetcli -dotnet-core-uninstall list [--aspnet-runtime] [--hosting-bundle] - [--runtime] [--sdk] [-v|--verbosity ] [--x64] [--x86] +dotnet-core-uninstall list [--arm64] [--aspnet-runtime] [--hosting-bundle] + [--runtime] [--sdk] [-v|--verbosity ] [--windows-desktop-runtime] + [--x64] [--x86] dotnet-core-uninstall list -?|-h|--help ``` @@ -30,7 +31,8 @@ dotnet-core-uninstall list -?|-h|--help ::: zone pivot="os-macos" ```dotnetcli -dotnet-core-uninstall list [--runtime] [--sdk] [-v|--verbosity ] +dotnet-core-uninstall list [--preserve-vs-for-mac-sdks] [--runtime] [--sdk] + [-v|--verbosity ] dotnet-core-uninstall list -?|-h|--help ``` @@ -45,23 +47,25 @@ The `dotnet-core-uninstall list` command lists installed .NET SDKs or runtimes t ::: zone pivot="os-windows" +- **`--arm64`** + + Lists all arm64 .NET SDKs and runtimes that can be uninstalled with this tool. + - **`--aspnet-runtime`** - - Lists all the ASP.NET Core runtimes that can be uninstalled with this tool. + + Lists all ASP.NET Core runtimes that can be uninstalled with this tool. - **`--hosting-bundle`** - - Lists all the .NET hosting bundles that can be uninstalled with this tool. -::: zone-end + Lists all .NET hosting bundles that can be uninstalled with this tool. - **`--runtime`** - Lists all the .NET runtimes that can be uninstalled with this tool. + Lists all .NET runtimes that can be uninstalled with this tool. - **`--sdk`** - Lists all the .NET SDKs that can be uninstalled with this tool. + Lists all .NET SDKs that can be uninstalled with this tool. - **`-v, --verbosity `** @@ -73,21 +77,56 @@ The `dotnet-core-uninstall list` command lists installed .NET SDKs or runtimes t - `d[etailed]` - `diag[nostic]`. -::: zone pivot="os-windows" +- **`--windows-desktop-runtime`** + + Lists all Windows Desktop runtimes that can be uninstalled with this tool. - **`--x64`** - Lists all the x64 .NET SDKs and runtimes that can be uninstalled with this tool. + Lists all x64 .NET SDKs and runtimes that can be uninstalled with this tool. - **`--x86`** - Lists all the x86 .NET SDKs and runtimes that can be uninstalled with this tool. + Lists all x86 .NET SDKs and runtimes that can be uninstalled with this tool. + +- **`-?|-h|--help`** + + Shows help and usage information. ::: zone-end +::: zone pivot="os-macos" + +- **`--preserve-vs-for-mac-sdks`** + + Prevents removal of SDKs and runtimes that have a high probability of being used by Visual Studio for Mac. + + > [!NOTE] + > Visual Studio for Mac is out of support. + +- **`--runtime`** + + Lists all .NET runtimes that can be uninstalled with this tool. + +- **`--sdk`** + + Lists all .NET SDKs that can be uninstalled with this tool. + +- **`-v, --verbosity `** + + Sets the verbosity level. The default value is `normal`. Allowed values are: + + - `q[uiet]` + - `m[inimal]` + - `n[ormal]` + - `d[etailed]` + - `diag[nostic]`. + - **`-?|-h|--help`** - Shows help and usage information + Shows help and usage information. + +::: zone-end ## Examples diff --git a/docs/core/additional-tools/uninstall-tool-cli-remove.md b/docs/core/additional-tools/uninstall-tool-cli-remove.md index 4ab3acc470c19..6d3ddee2d78f6 100644 --- a/docs/core/additional-tools/uninstall-tool-cli-remove.md +++ b/docs/core/additional-tools/uninstall-tool-cli-remove.md @@ -2,7 +2,7 @@ title: dotnet-core-uninstall remove command description: The dotnet-core-uninstall remove command uninstalls the target .NET SDK or Runtime. Learn about this command's syntax. author: adegeo -ms.date: 08/04/2024 +ms.date: 05/27/2026 zone_pivot_groups: operating-systems-set-three --- @@ -16,16 +16,17 @@ zone_pivot_groups: operating-systems-set-three ## Synopsis +```dotnetcli + +``` + ::: zone pivot="os-windows" ```dotnetcli -dotnet-core-uninstall remove [--x64|--x86] ... - [-v|--verbosity ] [--force] [-y|--yes] - -dotnet-core-uninstall remove [--x64|--x86] - [-v|--verbosity ] [--force] [-y|--yes] +dotnet-core-uninstall remove [-v|--verbosity ] + [--force] [-y|--yes] -dotnet-core-uninstall remove -h|--help|-? +dotnet-core-uninstall remove -h|--help ``` ::: zone-end @@ -33,13 +34,10 @@ dotnet-core-uninstall remove -h|--help|-? ::: zone pivot="os-macos" ```dotnetcli -dotnet-core-uninstall remove ... - [-v|--verbosity ] [--force] [-y|--yes] +dotnet-core-uninstall remove [-v|--verbosity ] + [--force] [-y|--yes] [--preserve-vs-for-mac-sdks] -dotnet-core-uninstall remove - [-v|--verbosity ] [--force] [-y|--yes] - -dotnet-core-uninstall remove -h|--help|-? +dotnet-core-uninstall remove -h|--help ``` ::: zone-end @@ -69,39 +67,49 @@ The `dotnet-core-uninstall remove` command removes .NET SDKs and runtimes from t ::: zone pivot="os-windows" +- **`--arm64`** + + Can be used with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove arm64. + - **`--aspnet-runtime`** - Discovers all the ASP.NET Core runtimes that can be uninstalled with this tool. + Removes ASP.NET Core runtimes only. - **`--hosting-bundle`** - Lists all the .NET hosting bundles that can be uninstalled with this tool. - -::: zone-end + Removes .NET runtime and hosting bundles only. - **`--runtime`** - Lists all the .NET runtimes that can be uninstalled with this tool. + Removes .NET runtimes only. - **`--sdk`** - Lists all the .NET SDKs that can be uninstalled with this tool. + Removes .NET SDKs only. -::: zone pivot="os-windows" +- **`--windows-desktop-runtime`** + + Removes Windows Desktop runtimes only. - **`--x64`** - Lists all the x64 .NET SDKs and runtimes that can be uninstalled with this tool. - - > [!NOTE] - > If `--x64` or `--x86` isn't specified, then both x64 and x86 will be removed. + Can be used with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove x64. - **`--x86`** - Lists all the x86 .NET SDKs and runtimes that can be uninstalled with this tool. + Can be used with `--sdk`, `--runtime`, `--aspnet-runtime`, and `--windows-desktop-runtime` to remove x86. - > [!NOTE] - > If `--x64` or `--x86` isn't specified, then both x64 and x86 will be removed. +::: zone-end + +::: zone pivot="os-macos" + +- **`--runtime`** + + Removes .NET runtimes only. + +- **`--sdk`** + + Removes .NET SDKs only. ::: zone-end @@ -151,6 +159,23 @@ These options are exclusive. Forces removal of versions that might be used by Visual Studio. +::: zone-end + +::: zone pivot="os-macos" + +- **`--force`** + + Forces removal of versions that might be used by Visual Studio for Mac or SDKs. + +- **`--preserve-vs-for-mac-sdks`** + + Prevents removal of SDKs and runtimes that have a high probability of being used by Visual Studio for Mac. + + > [!NOTE] + > Visual Studio for Mac is out of support. + +::: zone-end + - **`-v, --verbosity `** Sets the verbosity level. The default value is `normal`. Allowed values are: @@ -161,7 +186,7 @@ These options are exclusive. - `d[etailed]` - `diag[nostic]`. -- **`-?|-h|--help`** +- **`-h|--help`** Shows help and usage information diff --git a/docs/core/containers/publish-configuration.md b/docs/core/containers/publish-configuration.md index b1c2756e44769..98ba8997b21c3 100644 --- a/docs/core/containers/publish-configuration.md +++ b/docs/core/containers/publish-configuration.md @@ -2,13 +2,39 @@ title: Containerize a .NET app reference description: Reference material for containerizing a .NET app and configuring the container image. ms.topic: reference -ms.date: 04/22/2025 +ms.date: 05/27/2026 --- # Containerize a .NET app reference In this reference article, you learn how to configure the container image generated when you publish a .NET app as a container. This article covers the various properties that you can set to control the image, the execution environment, and the commands that are run when the container starts. +The following MSBuild properties and items are available for container configuration: + +| Property or item | Description | +|---|---| +| [`ContainerAppCommand`](#containerappcommand) | The logical entry point of the app. | +| [`ContainerAppCommandArgs`](#containerappcommandargs) | Logically required arguments for the app. | +| [`ContainerAppCommandInstruction`](#containerappcommandinstruction) | Controls how the entrypoint and command are combined. | +| [`ContainerArchiveOutputPath`](#containerarchiveoutputpath) | Path to write the container image as a _tar.gz_ archive. | +| [`ContainerBaseImage`](#containerbaseimage) | The base image to use for the container. | +| [`ContainerDefaultArgs`](#containerdefaultargs) | User-overridable default arguments for the app. | +| [`ContainerEntrypoint`](#containerentrypoint) | (**Deprecated**) The binary run when the container starts. | +| [`ContainerEntrypointArgs`](#containerentrypointargs) | (**Deprecated**) Default arguments for `ContainerEntrypoint`. | +| [`ContainerEnvironmentVariable`](#containerenvironmentvariable) | Environment variables added to the container. | +| [`ContainerFamily`](#containerfamily) | The family variant of the base image, for example `alpine`. | +| [`ContainerImageFormat`](#containerimageformat) | The image format: `Docker` or `OCI`. | +| [`ContainerImageTag`](#containerimagetag) | The tag or tags generated for the image. | +| [`ContainerLabel`](#containerlabel) | Metadata labels added to the container image. | +| [`ContainerPort`](#containerport) | TCP or UDP ports exposed by the container. | +| [`ContainerPublishInParallel`](#containerpublishinparallel) | Controls whether multi-RID publishing runs in parallel. | +| [`ContainerRegistry`](#containerregistry) | The destination registry for the published image. | +| [`ContainerRepository`](#containerrepository) | The name of the container image. | +| [`ContainerRuntimeIdentifier(s)`](#containerruntimeidentifiers) | The OS and architecture for the container. | +| [`ContainerUser`](#containeruser) | The default user the container runs as. | +| [`ContainerWorkingDirectory`](#containerworkingdirectory) | The working directory inside the container. | +| [`LocalRegistry`](#localregistry) | The local container tool to use: `docker` or `podman`. | + ## Configure container properties You can control many aspects of the generated container through MSBuild properties. In general, if you can use a command in a _Dockerfile_ to set some configuration, you can do the same via MSBuild. @@ -44,7 +70,7 @@ If you set a value here, you should set the fully qualified name of the image to ``` -With .NET SDK version 8.0.200, the `ContainerBaseImage` inference is improved to optimize the size and security: +Starting with .NET SDK version 8.0.200, the `ContainerBaseImage` inference is improved to optimize the size and security: - Targeting the `linux-musl-x64` or `linux-musl-arm64` Runtime Identifiers, automatically chooses the `alpine` image variants to ensure your project runs: - If the project uses `PublishAot=true` then the `nightly/runtime-deps` `jammy-chiseled-aot` variant of the base image for best size and security. @@ -91,6 +117,9 @@ To specify multiple container runtime identifiers for multi-architecture images, > > Setting multiple `ContainerRuntimeIdentifiers` results in a multi-architecture image being created. For more information, see [Multi-architecture images](#multi-architecture-images). +> [!NOTE] +> Starting with .NET 8, Microsoft's container images no longer include Windows variants in the manifest list. To target Windows, use a specific image tag as your `ContainerBaseImage`, for example `mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2022`. + For more information regarding the runtime identifiers supported by .NET, see [RID catalog](../rid-catalog.md). #### Multi-architecture images @@ -142,7 +171,7 @@ The container image tag property controls the tags that are generated for the im Tags are often used to refer to different versions of an app, but they can also refer to different operating system distributions, or even different configurations. -Starting with .NET 8, when a tag isn't provided the default is `latest`. +Starting with .NET 8, when a tag isn't provided the default is `latest`. In prior versions, the default tag was the `Version` of the project. To override the default, specify either of the following properties: @@ -188,7 +217,7 @@ Tags can only contain up to 127 alphanumeric characters, periods, underscores, a ### `ContainerLabel` -The container label adds a metadata label to the container. Labels are often used to store version and authoring metadata for use by security scanners and other infrastructure tools. You can specify any number of container labels. +The container label adds a metadata label to the container. Labels have no impact on the container at runtime, but are often used to store version and authoring metadata for use by security scanners and other infrastructure tools. You can specify any number of container labels. The `ContainerLabel` node has two attributes: @@ -223,6 +252,8 @@ The following properties control runtime-specific execution behavior and multi-a - [`ContainerAppCommandArgs`](#containerappcommandargs) - [`ContainerAppCommandInstruction`](#containerappcommandinstruction) - [`ContainerDefaultArgs`](#containerdefaultargs) +- [`ContainerEntrypoint`](#containerentrypoint) (deprecated) +- [`ContainerEntrypointArgs`](#containerentrypointargs) (deprecated) - [`ContainerEnvironmentVariable`](#containerenvironmentvariable) - [`ContainerPort`](#containerport) - [`ContainerPublishInParallel`](#containerpublishinparallel) @@ -302,6 +333,44 @@ The `ContainerDefaultArgs` configuration has a single `Include` property, which ``` +### `ContainerEntrypoint` + +> [!NOTE] +> This item is deprecated as of .NET 8. Use [`ContainerAppCommand`](#containerappcommand) instead, with [`ContainerAppCommandInstruction`](#containerappcommandinstruction) set to `Entrypoint` or `DefaultArgs`. + +The container entrypoint controls the binary that runs by default when the container starts. By default, for builds that create an executable binary, that binary is set as the `ContainerEntrypoint`. For builds that don't create an executable binary, `dotnet path/to/application.dll` is used. + +The `ContainerEntrypoint` configuration has a single `Include` property, which represents the command, option, or argument to use in the entrypoint command: + +```xml + + + + + + + +``` + +### `ContainerEntrypointArgs` + +> [!NOTE] +> This item is deprecated as of .NET 8. Use [`ContainerAppCommandArgs`](#containerappcommandargs) instead, with [`ContainerAppCommandInstruction`](#containerappcommandinstruction) set to `Entrypoint` or `DefaultArgs`. + +The container entrypoint args item controls the default arguments provided to the `ContainerEntrypoint`. Use this when the `ContainerEntrypoint` is a program the user might want to use on its own. + +The `ContainerEntrypointArgs` configuration has a single `Include` property, which represents the option or argument to apply to the `ContainerEntrypoint` command: + +```xml + + + + + + + +``` + ### `ContainerEnvironmentVariable` The container environment variable node allows you to add environment variables to the container. Environment variables are accessible to the app running in the container immediately, and are often used to change the runtime behavior of the running app. diff --git a/docs/core/containers/sdk-publish.md b/docs/core/containers/sdk-publish.md index c0df876e89251..6f5c3274704b2 100644 --- a/docs/core/containers/sdk-publish.md +++ b/docs/core/containers/sdk-publish.md @@ -1,7 +1,7 @@ --- title: Containerize an app with dotnet publish description: In this tutorial, you learn how to containerize a .NET application with dotnet publish command without the use of a Dockerfile. -ms.date: 01/07/2025 +ms.date: 05/27/2026 ms.topic: tutorial --- @@ -16,7 +16,7 @@ Containers have many features and benefits, such as being an immutable infrastru Install the following prerequisites: -- [.NET 8+ SDK](https://dotnet.microsoft.com/download/dotnet/8.0)\ +- [.NET 8+ SDK](https://dotnet.microsoft.com/download/dotnet)\ If you have .NET installed, use the `dotnet --info` command to determine which SDK you're using. If you plan on running the container locally, you need an Open Container Initiative (OCI)-compatible container runtime, such as: diff --git a/docs/core/distribution-packaging.md b/docs/core/distribution-packaging.md index b60f9f19f1901..7c69c0eacccbc 100644 --- a/docs/core/distribution-packaging.md +++ b/docs/core/distribution-packaging.md @@ -107,7 +107,7 @@ The **shared** folder contains frameworks. A shared framework provides a set of - (15) **NETStandard.Library.Ref** describes the netstandard `x.y` API. These files are used when compiling for that target. -- (16) **/etc/dotnet/install_location** is a file that contains the full path for `{dotnet_root}`. The path may end with a newline. It's not necessary to add this file when the root is `/usr/share/dotnet`. +- (16) **/etc/dotnet/install_location** is a file that contains the full path for `{dotnet_root}`. On some systems, architecture-specific files are also present, such as **/etc/dotnet/install_location_arm64**. The path might end with a newline. It's not necessary to add these files when the root is `/usr/share/dotnet`. - (17) **templates** contains the templates used by the SDK. For example, `dotnet new` finds project templates here. diff --git a/docs/core/rid-catalog.md b/docs/core/rid-catalog.md index 213cf97cf127b..8e881df4cadb5 100644 --- a/docs/core/rid-catalog.md +++ b/docs/core/rid-catalog.md @@ -86,7 +86,8 @@ To be able to use RIDs, you have to know which RIDs exist. For the latest and co RIDs that are considered 'portable'—that is, aren't tied to a specific version or OS distribution—are the recommended choice. This means that portable RIDs should be used for both [building a platform-specific application](./deploying/index.md#native-dependencies) and [creating a NuGet package with RID-specific assets](/nuget/create-packages/supporting-multiple-target-frameworks#architecture-specific-folders). -Starting with .NET 8, the default behavior of the .NET SDK and runtime is to only consider non-version-specific and non-distro-specific RIDs. When restoring and building, the SDK [uses a smaller portable RID graph](./compatibility/sdk/8.0/rid-graph.md). The [returns the platform for which the runtime was built](./compatibility/core-libraries/8.0/runtimeidentifier.md). At runtime, .NET finds [RID-specific assets using a known set of portable RIDs](./compatibility/deployment/8.0/rid-asset-list.md). When building an application with RID-specific assets that may be ignored at runtime, the SDK will emit a warning: [NETSDK1206](./tools/sdk-errors/netsdk1206.md). +> [!IMPORTANT] +> Starting with .NET 8, the default behavior of the .NET SDK and runtime is to only consider non-version-specific and non-distro-specific RIDs. When restoring and building, the SDK [uses a smaller portable RID graph](./compatibility/sdk/8.0/rid-graph.md). The [returns the platform for which the runtime was built](./compatibility/core-libraries/8.0/runtimeidentifier.md). At runtime, .NET finds [RID-specific assets using a known set of portable RIDs](./compatibility/deployment/8.0/rid-asset-list.md). When building an application with RID-specific assets that may be ignored at runtime, the SDK will emit a warning: [NETSDK1206](./tools/sdk-errors/netsdk1206.md). ### Loading assets for a specific OS version or distribution @@ -124,7 +125,8 @@ For more information, see [.NET dependencies and requirements](./install/linux.m macOS RIDs use the older "OSX" branding. -- `osx-x64` (Minimum OS version is macOS 10.12 Sierra) +- `osx` (For universal binaries supporting both x64 and arm64) +- `osx-x64` - `osx-arm64` For more information, see [.NET dependencies and requirements](./install/macos.md). diff --git a/docs/core/runtime-discovery/troubleshoot-app-launch.md b/docs/core/runtime-discovery/troubleshoot-app-launch.md index 592eeeaacc143..0b27567c2cd11 100644 --- a/docs/core/runtime-discovery/troubleshoot-app-launch.md +++ b/docs/core/runtime-discovery/troubleshoot-app-launch.md @@ -3,7 +3,7 @@ title: Troubleshoot app launch failures description: Learn about common reasons for app launch failures and possible solutions. ms.topic: troubleshooting ms.custom: linux-related-content -ms.date: 03/29/2023 +ms.date: 05/27/2026 zone_pivot_groups: operating-systems-set-one --- @@ -32,7 +32,7 @@ Host version: 7.0.0 ::: zone pivot="os-linux" -```bash +```console You must install .NET to run this application. App: /home/user/repos/myapp/myapp @@ -43,12 +43,12 @@ Host version: 7.0.0 This may be due to a [package mix-up](../install/linux-package-mixup.md). -Global installs are registered in the following location: `/etc/dotnet/install_location`. For more information, see [install locations](https://github.com/dotnet/designs/blob/main/accepted/2020/install-locations.md). +Global installs are registered in `/etc/dotnet/install_location`. On some systems, architecture-specific files are also present, such as `/etc/dotnet/install_location_arm64`. ::: zone-end ::: zone pivot="os-macos" -```bash +```console You must install .NET to run this application. App: /home/user/repos/myapp/myapp @@ -57,7 +57,7 @@ Host version: 7.0.0 .NET location: Not found ``` -Global installs are registered in the following location: `/etc/dotnet/install_location`. For more information, see [install locations](https://github.com/dotnet/designs/blob/main/accepted/2020/install-locations.md). +Global installs are registered in `/etc/dotnet/install_location`. On some systems, architecture-specific files are also present, such as `/etc/dotnet/install_location_arm64`. ::: zone-end The error message includes a link to download .NET. You can follow that link to get to the appropriate download page. You can also pick the .NET version (specified by `Host version`) from [.NET downloads](https://dotnet.microsoft.com/download/dotnet). @@ -69,7 +69,7 @@ On the [download page](https://dotnet.microsoft.com/download/dotnet) for the req ::: zone pivot="os-linux" .NET is available through various Linux package managers. For more information, see [Install .NET on Linux](../install/linux.md). (Preview versions of .NET aren't typically available through package managers.) -You need to install the .NET Runtime package for the appropriate version, like `dotnet-runtime6`. +You need to install the .NET Runtime package for the appropriate version, like `dotnet-runtime-10.0`. ::: zone-end Alternatively, on the [download page](https://dotnet.microsoft.com/download/dotnet) for the required .NET version, you can download [**Binaries**](#download-binaries) for the specified architecture. @@ -96,7 +96,7 @@ The following frameworks were found: ::: zone pivot="os-linux" -```bash +```console You must install or update .NET to run this application. App: /home/user/repos/myapp/myapp @@ -112,7 +112,7 @@ The following frameworks were found: ::: zone pivot="os-macos" -```bash +```console You must install or update .NET to run this application. App: /home/user/repos/myapp/myapp @@ -164,7 +164,7 @@ On the [download page](https://dotnet.microsoft.com/download/dotnet) for the req ::: zone pivot="os-linux" .NET is available through various Linux package managers. See [Install .NET on Linux](../install/linux.md) for details. (Preview versions of .NET aren't typically available through package managers.) -You need to install the .NET runtime package for the appropriate version, like `dotnet-runtime6` or `dotnet-aspnet6`. +You need to install the .NET runtime package for the appropriate version, like `dotnet-runtime-10.0` or `aspnetcore-runtime-10.0`. ::: zone-end Alternatively, on the [download page](https://dotnet.microsoft.com/download/dotnet) for the required .NET version, you can download [**Binaries**](#download-binaries) for the specified architecture. @@ -180,67 +180,75 @@ In most cases, when the application that failed to launch is using such an insta `/usr/local/share/dotnet/` ::: zone-end -## Other options +## Check the DOTNET_ROOT environment variable + +The `DOTNET_ROOT` environment variable tells the application where to find the `dotnet` driver and the frameworks it needs. If this variable is set incorrectly, or points to a location that doesn't contain a valid .NET installation, the app fails to launch even when .NET is installed elsewhere on the machine. -There are other installation and workaround options to consider. +Common problems to look for: -### Run the dotnet-install script +- **Variable points to wrong location** — `DOTNET_ROOT` may be set to a path from a previous .NET installation, a CI environment, or a script that no longer reflects the current install location. +- **Variable is set when it shouldn't be** — If `DOTNET_ROOT` is set in the environment, .NET skips the default install location entirely. Remove or update the variable if .NET has moved. +- **Architecture mismatch** — Use the architecture-specific variant when running 32-bit apps on a 64-bit machine. For example, set `DOTNET_ROOT_X86` to point to the 32-bit installation. For more information, see [`DOTNET_ROOT` environment variable](../tools/dotnet-environment-variables.md#dotnet_root-dotnet_rootx86-dotnet_root_x86-dotnet_root_x64). -Download the [dotnet-install script](../tools/dotnet-install-script.md#recommended-version) for your operating system. Run the script with options based on the information in the error message. The [dotnet-install script reference page](../tools/dotnet-install-script.md) shows all available options. +To diagnose, print the current value of the variable and confirm it points to a directory that contains a valid .NET installation: ::: zone pivot="os-windows" -Launch [PowerShell](/powershell) and run: ```powershell -dotnet-install.ps1 -Architecture -InstallDir -Runtime -Version +echo $env:DOTNET_ROOT ``` -For example, the error message in the previous section would correspond to: - -```powershell -dotnet-install.ps1 -Architecture x64 -InstallDir "C:\Program Files\dotnet\" -Runtime dotnet -Version 5.0.15 -``` +::: zone-end -If you encounter an error stating that running scripts is disabled, you may need to set the [execution policy](/powershell/module/microsoft.powershell.core/about/about_execution_policies) to allow the script to run: +::: zone pivot="os-linux,os-macos" -```powershell -Set-ExecutionPolicy Bypass -Scope Process +```bash +echo $DOTNET_ROOT ``` -For more information on installation using the script, see [Install with PowerShell automation](../install/windows.md#install-with-powershell). ::: zone-end -::: zone pivot="os-linux" +If the variable is set, verify that the path exists and contains the expected .NET version. If the variable isn't set, .NET falls back to the default install location for your platform. -```bash -./dotnet-install.sh --architecture --install-dir --runtime --version -``` +::: zone pivot="os-windows" -For example, the error message in the previous section would correspond to: +### Check the install location -```bash -./dotnet-install.sh --architecture x64 --install-dir /usr/share/dotnet/ --runtime dotnet --version 5.0.15 -``` +On Windows, .NET searches only one location—the first location where a .NET installation is found. If the framework lookup fails, verify that .NET is installed in the expected location. + +When you run the application through `dotnet`, frameworks are searched for in subdirectories relative to `dotnet`. When you run the application through its executable (`apphost`), .NET searches the following locations in order and uses the first one where an installation is found: + +1. Subdirectories relative to the `DOTNET_ROOT` environment variable (if set). +1. Globally registered install location (if set) in `HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\\InstallLocation`. +1. Default install location: `%ProgramFiles%\dotnet` (or `%ProgramFiles(x86)%\dotnet` for 32-bit processes on 64-bit Windows). + +If .NET is installed in a non-default location, make sure `DOTNET_ROOT` points to it so the app can find the correct installation. -For more information on installation using the script, see [Scripted install](../install/linux-scripted-manual.md#scripted-install). ::: zone-end -::: zone pivot="os-macos" +## Run the dotnet-install script -```bash -./dotnet-install.sh --architecture --install-dir --runtime --version -``` +Use the dotnet-install script when you need a quick, non-admin installation, such as in CI scenarios or temporary environments. -For example, the error message in the previous section would correspond to: +The script installs .NET to a folder that you choose. It doesn't behave like the standard OS installer, and it creates a private installation. -```bash -./dotnet-install.sh --architecture x64 --install-dir /usr/local/share/dotnet/ --runtime dotnet --version 5.0.15 -``` +To run an app from that private installation, set the [`DOTNET_ROOT` (or the architecture-specific variant)](../tools/dotnet-environment-variables.md#dotnet_root-dotnet_rootx86-dotnet_root_x86-dotnet_root_x64) environment variable when you launch through an executable (known as an `apphost`), or launch through the matching [`dotnet`](../tools/dotnet.md) host from the same install location. -For more information on installation using the script, see [Install .NET with a script](../install/macos.md#install-net-with-a-script). +::: zone pivot="os-windows" +For installation steps on Windows, see [Install with PowerShell](../install/windows.md#install-with-powershell). ::: zone-end -### Download binaries +::: zone pivot="os-linux" +For installation steps on Linux, see [Install .NET with a script](../install/linux-scripted-manual.md#scripted-install). +::: zone-end + +::: zone pivot="os-macos" +For installation steps on macOS, see [Install .NET with a script](../install/macos.md#install-net-with-a-script). +::: zone-end + +For script options and behavior details, see [dotnet-install scripts reference](../tools/dotnet-install-script.md). + +## Download binaries You can download a binary archive of .NET from the [download page](https://dotnet.microsoft.com/download/dotnet). From the **Binaries** column of the runtime download, download the binary release matching the required architecture. Extract the downloaded archive to the ".NET location" specified in the error message. @@ -256,7 +264,7 @@ For more information about manual installation, see [Install .NET on Linux](../i For more information about manual installation, see [Install .NET on macOS](../install/macos.md#install-net-manually) ::: zone-end -### Configure roll-forward behavior +## Configure roll-forward behavior If you already have a higher version of the required framework installed, you can make the application run on that higher version by configuring its roll-forward behavior. @@ -266,30 +274,6 @@ By default, an application requires a framework that matches the same major vers > [!NOTE] > Since using this option lets the application run on a different framework version than the one for which it was designed, it may result in unintended behavior due to changes between versions of a framework. -::: zone pivot="os-windows" - -## Breaking changes - -### Multi-level lookup disabled for .NET 7 and later - -On Windows, before .NET 7, the application could search for frameworks in multiple [install locations](https://github.com/dotnet/designs/blob/main/accepted/2020/install-locations.md). - -1. Subdirectories relative to: - - - `dotnet` executable when running the application through `dotnet`. - - `DOTNET_ROOT` environment variable (if set) when running the application through its executable (`apphost`). - -2. Globally registered install location (if set) in `HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\\InstallLocation`. -3. Default install location of `%ProgramFiles%\dotnet` (or `%ProgramFiles(x86)%\dotnet` for 32-bit processes on 64-bit Windows). - -This multi-level lookup behavior was enabled by default but could be disabled by setting the environment variable `DOTNET_MULTILEVEL_LOOKUP=0`. - -For applications targeting .NET 7 and later, multi-level lookup is completely disabled and only one location—the first location where a .NET installation is found—is searched. When an application is run through `dotnet`, frameworks are only searched for in subdirectories relative to `dotnet`. When an application is run through its executable (`apphost`), frameworks are only searched for in the first of the previously listed locations where .NET is found. - -For more information, see [Multi-level lookup is disabled](../compatibility/deployment/7.0/multilevel-lookup.md). - -::: zone-end - ## See also - [Install .NET](../install/index.yml) diff --git a/docs/core/sdk.md b/docs/core/sdk.md index c92f791b75a77..92c39a62c6d3d 100644 --- a/docs/core/sdk.md +++ b/docs/core/sdk.md @@ -1,7 +1,7 @@ --- title: .NET SDK overview description: Learn about the .NET SDK (formerly known as the .NET Core SDK), which is a set of libraries and tools used to create .NET projects. -ms.date: 08/10/2023 +ms.date: 05/27/2026 --- # What is the .NET SDK? @@ -34,7 +34,7 @@ can coexist on a single machine. For information about how the version gets pick ## Security guide > [!IMPORTANT] -> The .NET SDK locates and executes various tools that ship as separate executable binaries in the SDK. In most cases, the SDK is able to determine the full path to the executable. However, there are exceptions where the SDK cannot determine the path and relies on user input. It's possible that a user can provide input that causes the .NET SDK to execute malicious software. For this reason, you shouldn't trust any repos with binaries that match specific file names in the SDK install location, for example, *msbuild.exe*. The SDK installs to a versioned folder such as *C:\Program Files\dotnet\sdk\7.0.400\\* on Windows or */usr/bin/share/dotnet/sdk/7.0.400* on Linux. +> The .NET SDK locates and executes various tools that ship as separate executable binaries in the SDK. In most cases, the SDK is able to determine the full path to the executable. However, there are exceptions where the SDK cannot determine the path and relies on user input. It's possible that a user can provide input that causes the .NET SDK to execute malicious software. For this reason, you shouldn't trust any repos with binaries that match specific file names in the SDK install location, for example, *msbuild.exe* or *msbuild.dll*. The SDK installs to a versioned folder such as *C:\Program Files\dotnet\sdk\10.0.204\\* on Windows or */usr/share/dotnet/sdk/10.0.204* on Linux. ## See also