From 5d75492f7d00cbb7e6bdc7dc952988ffe5f3d1c9 Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:51:47 +0900 Subject: [PATCH 01/24] Fix typo in pattern matching code example (#50284) --- docs/fsharp/language-reference/pattern-matching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fsharp/language-reference/pattern-matching.md b/docs/fsharp/language-reference/pattern-matching.md index eca14fe0d96ac..2afe39eded9a9 100644 --- a/docs/fsharp/language-reference/pattern-matching.md +++ b/docs/fsharp/language-reference/pattern-matching.md @@ -289,7 +289,7 @@ let len (str: string | null) = Similarly, you can use new dedicated nullability related [patterns](./active-patterns.md): ```fsharp -let let str = // str is inferred to be `string | null` +let len str = // str is inferred to be `string | null` match str with | Null -> -1 | NonNull (s: string) -> s.Length From 052f76e9c9d280e3149fee446975e19169c018a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:04:49 +0000 Subject: [PATCH 02/24] Bump github/codeql-action from 4.31.5 to 4.31.6 (#50288) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.5 to 4.31.6. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/fdbfb4d2750291e159f0156def62b853c2798ca2...fe4161a26a8629af62121b670040955b330f9af2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.31.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/scorecards.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 07d4125ca8fd6..0712b40fea75c 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -71,6 +71,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # v3.29.5 + uses: github/codeql-action/upload-sarif@fe4161a26a8629af62121b670040955b330f9af2 # v3.29.5 with: sarif_file: results.sarif From 5e70ac18b3aaaa09c0389c58ebe92570ddce12dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:05:29 +0000 Subject: [PATCH 03/24] Bump actions/stale from 10.1.0 to 10.1.1 (#50290) Bumps [actions/stale](https://github.com/actions/stale) from 10.1.0 to 10.1.1. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/5f858e3efba33a5ca4407a664cc011ad407f2008...997185467fa4f803885201cee163a9f38240193d) --- updated-dependencies: - dependency-name: actions/stale dependency-version: 10.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 423d270005119..a3bc00eea5a08 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit - - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 + - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d with: start-date: '2022-03-01T00:00:00Z' # ISO 8601 or RFC 2822 repo-token: ${{ secrets.GITHUB_TOKEN }} From b6dd226959902f0eacfd1d65e89778d6f6c874d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:07:12 +0000 Subject: [PATCH 04/24] Bump the dotnet group with 1 update (#50293) Bumps Refit.HttpClientFactory from 8.0.0 to 9.0.2 --- updated-dependencies: - dependency-name: Refit.HttpClientFactory dependency-version: 9.0.2 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/core/extensions/snippets/http/generated/generated.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/extensions/snippets/http/generated/generated.csproj b/docs/core/extensions/snippets/http/generated/generated.csproj index bcb24b073321d..45b4dcc1a448b 100644 --- a/docs/core/extensions/snippets/http/generated/generated.csproj +++ b/docs/core/extensions/snippets/http/generated/generated.csproj @@ -11,7 +11,7 @@ - + From 5288850dad3d4063b797c83f75ebeb4a5a372001 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:07:46 +0000 Subject: [PATCH 05/24] Bump the dotnet group with 2 updates (#50295) Bumps Azure.Identity from 1.17.0 to 1.17.1 Bumps Microsoft.Extensions.Azure from 1.13.0 to 1.13.1 --- updated-dependencies: - dependency-name: Azure.Identity dependency-version: 1.17.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: Microsoft.Extensions.Azure dependency-version: 1.13.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/azure/sdk/snippets/logging/LoggingSampleApp.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/azure/sdk/snippets/logging/LoggingSampleApp.csproj b/docs/azure/sdk/snippets/logging/LoggingSampleApp.csproj index f38d36a9821e5..9b4ff4ad51198 100644 --- a/docs/azure/sdk/snippets/logging/LoggingSampleApp.csproj +++ b/docs/azure/sdk/snippets/logging/LoggingSampleApp.csproj @@ -9,8 +9,8 @@ - - + + From 621416153bdf391e326e863c11b694bd2e0cf712 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:08:01 +0000 Subject: [PATCH 06/24] Bump the dotnet group with 1 update (#50294) Bumps BenchmarkDotNet from 0.15.6 to 0.15.8 --- updated-dependencies: - dependency-name: BenchmarkDotNet dependency-version: 0.15.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../extensions/snippets/primitives/string/tokenizers.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/extensions/snippets/primitives/string/tokenizers.csproj b/docs/core/extensions/snippets/primitives/string/tokenizers.csproj index 65f48fcada546..6d0292bdcfccb 100644 --- a/docs/core/extensions/snippets/primitives/string/tokenizers.csproj +++ b/docs/core/extensions/snippets/primitives/string/tokenizers.csproj @@ -9,7 +9,7 @@ - + From d55339e89d9997694ca0e6e3b94a890bed533533 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:08:41 +0000 Subject: [PATCH 07/24] Bump the dotnet group with 1 update (#50300) Bumps Microsoft.NET.Test.Sdk from 18.0.0 to 18.0.1 --- updated-dependencies: - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../csharp/after/unit-testing-best-practices-after.csproj | 2 +- .../csharp/before/unit-testing-best-practices-before.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/core/testing/unit-testing-best-practices/csharp/after/unit-testing-best-practices-after.csproj b/samples/snippets/core/testing/unit-testing-best-practices/csharp/after/unit-testing-best-practices-after.csproj index ecd9016971213..52f8bc324716e 100644 --- a/samples/snippets/core/testing/unit-testing-best-practices/csharp/after/unit-testing-best-practices-after.csproj +++ b/samples/snippets/core/testing/unit-testing-best-practices/csharp/after/unit-testing-best-practices-after.csproj @@ -8,7 +8,7 @@ - + diff --git a/samples/snippets/core/testing/unit-testing-best-practices/csharp/before/unit-testing-best-practices-before.csproj b/samples/snippets/core/testing/unit-testing-best-practices/csharp/before/unit-testing-best-practices-before.csproj index ecd9016971213..52f8bc324716e 100644 --- a/samples/snippets/core/testing/unit-testing-best-practices/csharp/before/unit-testing-best-practices-before.csproj +++ b/samples/snippets/core/testing/unit-testing-best-practices/csharp/before/unit-testing-best-practices-before.csproj @@ -8,7 +8,7 @@ - + From 5a80199344f02fe4bedfd389bc41e53717c4d67b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:10:08 +0000 Subject: [PATCH 08/24] Bump the dotnet group with 1 update (#50304) Bumps Microsoft.Extensions.Azure from 1.13.0 to 1.13.1 --- updated-dependencies: - dependency-name: Microsoft.Extensions.Azure dependency-version: 1.13.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../aspnetcore-guidance/MinApiSample/MinApiSample.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/azure/sdk/snippets/aspnetcore-guidance/MinApiSample/MinApiSample.csproj b/docs/azure/sdk/snippets/aspnetcore-guidance/MinApiSample/MinApiSample.csproj index 41534ada7e968..105c96ed588d5 100644 --- a/docs/azure/sdk/snippets/aspnetcore-guidance/MinApiSample/MinApiSample.csproj +++ b/docs/azure/sdk/snippets/aspnetcore-guidance/MinApiSample/MinApiSample.csproj @@ -11,7 +11,7 @@ - + From b9f689b2ae875ad788ed26ae6f4aabc15ca5bad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:11:39 +0000 Subject: [PATCH 09/24] Bump the dotnet group with 3 updates (#50313) Bumps Azure.Identity from 1.17.0 to 1.17.1 Bumps Microsoft.Extensions.Configuration from 9.0.10 to 10.0.0 Bumps Microsoft.Extensions.Configuration.UserSecrets from 9.0.10 to 10.0.0 --- updated-dependencies: - dependency-name: Azure.Identity dependency-version: 1.17.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: Microsoft.Extensions.Configuration dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dotnet - dependency-name: Microsoft.Extensions.Configuration.UserSecrets dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../chat-with-data/azure-openai/VectorDataAI.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/ai/quickstarts/snippets/chat-with-data/azure-openai/VectorDataAI.csproj b/docs/ai/quickstarts/snippets/chat-with-data/azure-openai/VectorDataAI.csproj index 1826987581fbf..61d485ed813e9 100644 --- a/docs/ai/quickstarts/snippets/chat-with-data/azure-openai/VectorDataAI.csproj +++ b/docs/ai/quickstarts/snippets/chat-with-data/azure-openai/VectorDataAI.csproj @@ -10,10 +10,10 @@ - + - - + + From 0181588de60dd2ed1b9841db4b23e99ddd95ca74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:12:49 +0000 Subject: [PATCH 10/24] Bump the dotnet group with 1 update (#50320) Bumps Microsoft.Extensions.Hosting from 10.0.0-rc.2.25502.107 to 10.0.0 --- updated-dependencies: - dependency-name: Microsoft.Extensions.Hosting dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/ai/quickstarts/snippets/mcp-server/SampleMcpServer.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ai/quickstarts/snippets/mcp-server/SampleMcpServer.csproj b/docs/ai/quickstarts/snippets/mcp-server/SampleMcpServer.csproj index 6b697d4b7a21e..26044b768eb55 100644 --- a/docs/ai/quickstarts/snippets/mcp-server/SampleMcpServer.csproj +++ b/docs/ai/quickstarts/snippets/mcp-server/SampleMcpServer.csproj @@ -33,7 +33,7 @@ - + From 2e34c216296ca70650875e8869854d0f21c8fde1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:13:06 +0000 Subject: [PATCH 11/24] Bump the dotnet group with 2 updates (#50321) Bumps OllamaSharp from 5.4.8 to 5.4.11 Bumps OpenTelemetry.Exporter.Console from 1.13.1 to 1.14.0 --- updated-dependencies: - dependency-name: OllamaSharp dependency-version: 5.4.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: OpenTelemetry.Exporter.Console dependency-version: 1.14.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../ConsoleAI.UseTelemetry/ConsoleAI.UseTelemetry.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.UseTelemetry/ConsoleAI.UseTelemetry.csproj b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.UseTelemetry/ConsoleAI.UseTelemetry.csproj index 8da12b0015d0b..9b613b2562243 100644 --- a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.UseTelemetry/ConsoleAI.UseTelemetry.csproj +++ b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.UseTelemetry/ConsoleAI.UseTelemetry.csproj @@ -8,8 +8,8 @@ - - + + From 58dea76b2bd15a0f02ffca6ec0421c1571dc3b03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:13:27 +0000 Subject: [PATCH 12/24] Bump the dotnet group with 2 updates (#50314) Bumps Azure.Identity from 1.17.0 to 1.17.1 Bumps Microsoft.Extensions.AI from 10.0.0 to 10.0.1 --- updated-dependencies: - dependency-name: Azure.Identity dependency-version: 1.17.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: Microsoft.Extensions.AI dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/ai/quickstarts/snippets/structured-output/SOChat.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ai/quickstarts/snippets/structured-output/SOChat.csproj b/docs/ai/quickstarts/snippets/structured-output/SOChat.csproj index 947d6ea1aed68..9bb6b764a9dbd 100644 --- a/docs/ai/quickstarts/snippets/structured-output/SOChat.csproj +++ b/docs/ai/quickstarts/snippets/structured-output/SOChat.csproj @@ -10,8 +10,8 @@ - - + + From a366a63de593ebb38f5b7c87f2b4b5081a37cd86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:13:43 +0000 Subject: [PATCH 13/24] Bump the dotnet group with 2 updates (#50322) Bumps Microsoft.Extensions.Caching.Memory from 10.0.0-rc.2.25502.107 to 10.0.0 Bumps OllamaSharp from 5.4.8 to 5.4.11 --- updated-dependencies: - dependency-name: Microsoft.Extensions.Caching.Memory dependency-version: 10.0.0 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: OllamaSharp dependency-version: 5.4.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../ConsoleAI.CacheResponses/ConsoleAI.CacheResponses.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.CacheResponses/ConsoleAI.CacheResponses.csproj b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.CacheResponses/ConsoleAI.CacheResponses.csproj index 1d41826d30183..971bf45c23f8b 100644 --- a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.CacheResponses/ConsoleAI.CacheResponses.csproj +++ b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.CacheResponses/ConsoleAI.CacheResponses.csproj @@ -8,8 +8,8 @@ - - + + From 213222ca8562f33781649884a9e845817e780fc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:14:35 +0000 Subject: [PATCH 14/24] Bump the dotnet group with 1 update (#50328) Bumps OllamaSharp from 5.4.8 to 5.4.11 --- updated-dependencies: - dependency-name: OllamaSharp dependency-version: 5.4.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../ConsoleAI.GetStreamingResponseAsync.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.GetStreamingResponseAsync/ConsoleAI.GetStreamingResponseAsync.csproj b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.GetStreamingResponseAsync/ConsoleAI.GetStreamingResponseAsync.csproj index 7e663bbd6775f..f0a40345ab8a2 100644 --- a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.GetStreamingResponseAsync/ConsoleAI.GetStreamingResponseAsync.csproj +++ b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.GetStreamingResponseAsync/ConsoleAI.GetStreamingResponseAsync.csproj @@ -8,7 +8,7 @@ - + From 8228b27919afc8ae6714e85dc0b822581d2dba81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:15:41 +0000 Subject: [PATCH 15/24] Bump the dotnet group with 2 updates (#50330) Bumps Azure.Identity from 1.17.0 to 1.17.1 Bumps Microsoft.Extensions.AI.Abstractions from 10.0.0 to 10.0.1 --- updated-dependencies: - dependency-name: Azure.Identity dependency-version: 1.17.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet - dependency-name: Microsoft.Extensions.AI.Abstractions dependency-version: 10.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dotnet ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../evaluate-with-reporting/TestAIWithReporting.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ai/evaluation/snippets/evaluate-with-reporting/TestAIWithReporting.csproj b/docs/ai/evaluation/snippets/evaluate-with-reporting/TestAIWithReporting.csproj index 283a6de1126c2..779b9569dec22 100644 --- a/docs/ai/evaluation/snippets/evaluate-with-reporting/TestAIWithReporting.csproj +++ b/docs/ai/evaluation/snippets/evaluate-with-reporting/TestAIWithReporting.csproj @@ -10,8 +10,8 @@ - - + + From 2230aaa1dcd577dd34851702615b522643108071 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:05:47 +0100 Subject: [PATCH 16/24] Remove System.CommandLine preview warning (#50286) --- docs/standard/commandline/get-started-tutorial.md | 2 -- docs/standard/commandline/how-to-configure-the-parser.md | 2 -- .../commandline/how-to-customize-parsing-and-validation.md | 2 -- docs/standard/commandline/how-to-enable-tab-completion.md | 2 -- docs/standard/commandline/how-to-parse-and-invoke.md | 2 -- docs/standard/commandline/includes/preview.md | 7 ------- docs/standard/commandline/index.md | 2 -- docs/standard/commandline/migration-guide-2.0.0-beta5.md | 2 -- docs/standard/commandline/syntax.md | 2 -- 9 files changed, 23 deletions(-) delete mode 100644 docs/standard/commandline/includes/preview.md diff --git a/docs/standard/commandline/get-started-tutorial.md b/docs/standard/commandline/get-started-tutorial.md index 807d88f7f5f9e..9fb75276e9056 100644 --- a/docs/standard/commandline/get-started-tutorial.md +++ b/docs/standard/commandline/get-started-tutorial.md @@ -11,8 +11,6 @@ helpviewer_keywords: --- # Tutorial: Get started with System.CommandLine -[!INCLUDE [scl-preview](./includes/preview.md)] - This tutorial shows how to create a .NET command-line app that uses the [`System.CommandLine` library](index.md). You'll begin by creating a simple root command that has one option. Then you'll build on that base, creating a more complex app that contains multiple subcommands and different options for each command. In this tutorial, you learn how to: diff --git a/docs/standard/commandline/how-to-configure-the-parser.md b/docs/standard/commandline/how-to-configure-the-parser.md index cfa2a49229a3d..9a133a2bd27b7 100644 --- a/docs/standard/commandline/how-to-configure-the-parser.md +++ b/docs/standard/commandline/how-to-configure-the-parser.md @@ -12,8 +12,6 @@ ms.topic: how-to # How to configure the parser in System.CommandLine -[!INCLUDE [scl-preview](./includes/preview.md)] - Parsing and invocation are two separate steps, so each of them has their own configuration: - is a class that provides properties to configure the parsing. It is an optional argument for every `Parse` method, such as and . diff --git a/docs/standard/commandline/how-to-customize-parsing-and-validation.md b/docs/standard/commandline/how-to-customize-parsing-and-validation.md index 1cd817908a51a..303cc488c9ed4 100644 --- a/docs/standard/commandline/how-to-customize-parsing-and-validation.md +++ b/docs/standard/commandline/how-to-customize-parsing-and-validation.md @@ -12,8 +12,6 @@ ms.topic: how-to # How to customize parsing and validation in System.CommandLine -[!INCLUDE [scl-preview](./includes/preview.md)] - By default, System.CommandLine provides a set of built-in parsers that can parse many common types: * `bool` diff --git a/docs/standard/commandline/how-to-enable-tab-completion.md b/docs/standard/commandline/how-to-enable-tab-completion.md index b3963ff4a04f4..301029d991586 100644 --- a/docs/standard/commandline/how-to-enable-tab-completion.md +++ b/docs/standard/commandline/how-to-enable-tab-completion.md @@ -12,8 +12,6 @@ ms.topic: how-to # Tab completion for System.CommandLine -[!INCLUDE [scl-preview](./includes/preview.md)] - Apps that use `System.CommandLine` have built-in support for tab completion in certain shells. To enable it, the end user must take a few steps once per shell. Once this is done, tab completion is automatic for static values in your app, such as enum values or values defined by calling . You can also customize tab completion by providing values dynamically at runtime. ## Enable tab completion diff --git a/docs/standard/commandline/how-to-parse-and-invoke.md b/docs/standard/commandline/how-to-parse-and-invoke.md index b346f31794555..8e40bf7d6fe08 100644 --- a/docs/standard/commandline/how-to-parse-and-invoke.md +++ b/docs/standard/commandline/how-to-parse-and-invoke.md @@ -11,8 +11,6 @@ helpviewer_keywords: # Parsing and invocation in System.CommandLine -[!INCLUDE [scl-preview](./includes/preview.md)] - System.CommandLine provides a clear separation between command-line parsing and action invocation. The *parsing process* is responsible for parsing command-line input and creating a object that contains the parsed values (and parse errors). The *action invocation process* is responsible for invoking the action associated with the parsed command, option, or directive (arguments can't have actions). In the following example from the [Get started with System.CommandLine](get-started-tutorial.md) tutorial, the `ParseResult` is created by parsing the command-line input. No actions are defined or invoked: diff --git a/docs/standard/commandline/includes/preview.md b/docs/standard/commandline/includes/preview.md deleted file mode 100644 index 247499ccbc93c..0000000000000 --- a/docs/standard/commandline/includes/preview.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -ms.date: 07/31/2025 -ms.topic: include ---- -> [!IMPORTANT] -> `System.CommandLine` is currently in preview. This documentation is for version 2.0 beta 7. -> Some information relates to prerelease product that might be substantially modified before it's released. Microsoft makes no warranties, express or implied, with respect to the information provided here. diff --git a/docs/standard/commandline/index.md b/docs/standard/commandline/index.md index e2d747b67e00e..df74bdb3b0c25 100644 --- a/docs/standard/commandline/index.md +++ b/docs/standard/commandline/index.md @@ -13,8 +13,6 @@ ai-usage: ai-assisted # System.CommandLine overview -[!INCLUDE [scl-preview](./includes/preview.md)] - The `System.CommandLine` library provides functionality commonly needed by command-line apps, such as parsing command-line input and displaying help text. Apps that use `System.CommandLine` include the [.NET CLI](../../core/tools/index.md), [additional tools](../../core/additional-tools/index.md), and many [global and local tools](../../core/tools/global-tools.md). diff --git a/docs/standard/commandline/migration-guide-2.0.0-beta5.md b/docs/standard/commandline/migration-guide-2.0.0-beta5.md index b594d74eee971..334d2e9da2709 100644 --- a/docs/standard/commandline/migration-guide-2.0.0-beta5.md +++ b/docs/standard/commandline/migration-guide-2.0.0-beta5.md @@ -11,8 +11,6 @@ helpviewer_keywords: # System.CommandLine 2.0.0-beta5+ migration guide -[!INCLUDE [scl-preview](./includes/preview.md)] - The main focus for the 2.0.0-beta5 release was to improve the APIs and take a step toward releasing a stable version of System.CommandLine. The APIs have been simplified and made more coherent and consistent with the [Framework design guidelines](../design-guidelines/index.md). This article describes the breaking changes that were made in 2.0.0-beta5 and 2.0.0-beta7, and the reasoning behind them. ## Renaming diff --git a/docs/standard/commandline/syntax.md b/docs/standard/commandline/syntax.md index ff66a446af68c..dba5821751d26 100644 --- a/docs/standard/commandline/syntax.md +++ b/docs/standard/commandline/syntax.md @@ -12,8 +12,6 @@ ms.topic: concept-article # Syntax overview: Commands, options, and arguments -[!INCLUDE [scl-preview](./includes/preview.md)] - This article explains the command-line syntax that `System.CommandLine` recognizes. The information is useful to both users and developers of .NET command-line apps, including the [.NET CLI](../../core/tools/index.md). ## Tokens From ac0a891dc3fa1feeabe50901a5ee0669f647c441 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:48:25 -0500 Subject: [PATCH 17/24] Bump actions/checkout from 6.0.0 to 6.0.1 (#50289) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/1af3b93b6815bc44a9784bd300feb67ff0d1eeb3...8e8c483db84b4bee98b60c0593521ed34d9990e8) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cleanrepo-orphaned-articles.yml | 2 +- .github/workflows/cleanrepo-orphaned-images.yml | 2 +- .github/workflows/cleanrepo-orphaned-includes.yml | 2 +- .github/workflows/cleanrepo-orphaned-snippets.yml | 2 +- .github/workflows/cleanrepo-redirect-hops.yml | 2 +- .github/workflows/cleanrepo-relative-links.yml | 2 +- .github/workflows/cleanrepo-replace-redirects.yml | 2 +- .github/workflows/dependabot-bot.yml | 2 +- .github/workflows/dependency-review.yml | 2 +- .github/workflows/docs-verifier.yml | 2 +- .github/workflows/markdownlint.yml | 2 +- .github/workflows/scorecards.yml | 2 +- .github/workflows/snippets5000.yml | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cleanrepo-orphaned-articles.yml b/.github/workflows/cleanrepo-orphaned-articles.yml index 554689691bb16..6b5319bdca11e 100644 --- a/.github/workflows/cleanrepo-orphaned-articles.yml +++ b/.github/workflows/cleanrepo-orphaned-articles.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-orphaned-images.yml b/.github/workflows/cleanrepo-orphaned-images.yml index e04b327055037..bf47ce2e8aea0 100644 --- a/.github/workflows/cleanrepo-orphaned-images.yml +++ b/.github/workflows/cleanrepo-orphaned-images.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-orphaned-includes.yml b/.github/workflows/cleanrepo-orphaned-includes.yml index 31d8689d8a526..f8936df063432 100644 --- a/.github/workflows/cleanrepo-orphaned-includes.yml +++ b/.github/workflows/cleanrepo-orphaned-includes.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-orphaned-snippets.yml b/.github/workflows/cleanrepo-orphaned-snippets.yml index bb642c6dc2009..e82584e1cd41e 100644 --- a/.github/workflows/cleanrepo-orphaned-snippets.yml +++ b/.github/workflows/cleanrepo-orphaned-snippets.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-redirect-hops.yml b/.github/workflows/cleanrepo-redirect-hops.yml index 931fe9ea87e61..401a3b045559e 100644 --- a/.github/workflows/cleanrepo-redirect-hops.yml +++ b/.github/workflows/cleanrepo-redirect-hops.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-relative-links.yml b/.github/workflows/cleanrepo-relative-links.yml index 24526537863a4..46874e0665fa6 100644 --- a/.github/workflows/cleanrepo-relative-links.yml +++ b/.github/workflows/cleanrepo-relative-links.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/cleanrepo-replace-redirects.yml b/.github/workflows/cleanrepo-replace-redirects.yml index ff26a53c4fa52..f81a631549a39 100644 --- a/.github/workflows/cleanrepo-replace-redirects.yml +++ b/.github/workflows/cleanrepo-replace-redirects.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # Call clean repo - name: Clean repo diff --git a/.github/workflows/dependabot-bot.yml b/.github/workflows/dependabot-bot.yml index 83f33ee238bbd..c110b55567dfd 100644 --- a/.github/workflows/dependabot-bot.yml +++ b/.github/workflows/dependabot-bot.yml @@ -30,7 +30,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 # - name: Setup .NET # uses: actions/setup-dotnet@4d4a70f4a5b2a5a5329f13be4ac933f2c9206ac0 # with: diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 7d526cec230fa..f8545b144e080 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -22,6 +22,6 @@ jobs: egress-policy: audit - name: 'Checkout Repository' - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: 'Dependency Review' uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2 diff --git a/.github/workflows/docs-verifier.yml b/.github/workflows/docs-verifier.yml index 98626918400ef..1afe5b98f6e98 100644 --- a/.github/workflows/docs-verifier.yml +++ b/.github/workflows/docs-verifier.yml @@ -19,7 +19,7 @@ jobs: egress-policy: audit - name: Checkout the repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - name: Validate uses: dotnet/docs-actions/actions/docs-verifier@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index fc3a3a72d5681..c845767aa8167 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -26,7 +26,7 @@ jobs: with: egress-policy: audit - - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: DavidAnson/markdownlint-cli2-action@30a0e04f1870d58f8d717450cc6134995f993c63 # v21.0.0 with: config: ".markdownlint-cli2.jsonc" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 0712b40fea75c..feea5162ce353 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -36,7 +36,7 @@ jobs: egress-policy: audit - name: "Checkout code" - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: persist-credentials: false diff --git a/.github/workflows/snippets5000.yml b/.github/workflows/snippets5000.yml index 6905ea4393cf2..f419e43d00377 100644 --- a/.github/workflows/snippets5000.yml +++ b/.github/workflows/snippets5000.yml @@ -36,7 +36,7 @@ jobs: egress-policy: audit - name: Checkout repository - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 #@v6.0.0 + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #@v6.0.1 # Get the latest preview SDK (or sdk not installed by the runner) - name: Setup .NET From 5e73e2a0e7897c6ccd219ed428c668e12bfd9dbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 08:48:40 -0500 Subject: [PATCH 18/24] Bump step-security/harden-runner from 2.13.2 to 2.13.3 (#50291) Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.13.2 to 2.13.3. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/95d9a5deda9de15063e7595e9719c11c38c90ae2...df199fb7be9f65074067a9eb93f12bb4c5547cf2) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-version: 2.13.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-for-build-warnings.yml | 2 +- .github/workflows/cleanrepo-orphaned-articles.yml | 2 +- .github/workflows/cleanrepo-orphaned-images.yml | 2 +- .github/workflows/cleanrepo-orphaned-includes.yml | 2 +- .github/workflows/cleanrepo-orphaned-snippets.yml | 2 +- .github/workflows/cleanrepo-redirect-hops.yml | 2 +- .github/workflows/cleanrepo-relative-links.yml | 2 +- .github/workflows/cleanrepo-replace-redirects.yml | 2 +- .github/workflows/dependabot-bot.yml | 2 +- .github/workflows/dependency-review.yml | 2 +- .github/workflows/do-not-merge-label-check.yml | 2 +- .github/workflows/docs-verifier.yml | 2 +- .github/workflows/live-protection.yml | 2 +- .github/workflows/markdownlint.yml | 2 +- .github/workflows/profanity-filter.yml | 2 +- .github/workflows/quest-bulk.yml | 2 +- .github/workflows/quest.yml | 2 +- .github/workflows/scorecards.yml | 2 +- .github/workflows/snippets5000.yml | 2 +- .github/workflows/stale.yml | 2 +- .github/workflows/version-sweep.yml | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/check-for-build-warnings.yml b/.github/workflows/check-for-build-warnings.yml index e6b9c42617d0a..80045e68b81e8 100644 --- a/.github/workflows/check-for-build-warnings.yml +++ b/.github/workflows/check-for-build-warnings.yml @@ -16,7 +16,7 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-orphaned-articles.yml b/.github/workflows/cleanrepo-orphaned-articles.yml index 6b5319bdca11e..9f4beb6cef8db 100644 --- a/.github/workflows/cleanrepo-orphaned-articles.yml +++ b/.github/workflows/cleanrepo-orphaned-articles.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-orphaned-images.yml b/.github/workflows/cleanrepo-orphaned-images.yml index bf47ce2e8aea0..5c5ac641c3897 100644 --- a/.github/workflows/cleanrepo-orphaned-images.yml +++ b/.github/workflows/cleanrepo-orphaned-images.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-orphaned-includes.yml b/.github/workflows/cleanrepo-orphaned-includes.yml index f8936df063432..c89775f643f02 100644 --- a/.github/workflows/cleanrepo-orphaned-includes.yml +++ b/.github/workflows/cleanrepo-orphaned-includes.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-orphaned-snippets.yml b/.github/workflows/cleanrepo-orphaned-snippets.yml index e82584e1cd41e..34221905ecac4 100644 --- a/.github/workflows/cleanrepo-orphaned-snippets.yml +++ b/.github/workflows/cleanrepo-orphaned-snippets.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-redirect-hops.yml b/.github/workflows/cleanrepo-redirect-hops.yml index 401a3b045559e..55c202f8fbbec 100644 --- a/.github/workflows/cleanrepo-redirect-hops.yml +++ b/.github/workflows/cleanrepo-redirect-hops.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-relative-links.yml b/.github/workflows/cleanrepo-relative-links.yml index 46874e0665fa6..242e3febffab6 100644 --- a/.github/workflows/cleanrepo-relative-links.yml +++ b/.github/workflows/cleanrepo-relative-links.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/cleanrepo-replace-redirects.yml b/.github/workflows/cleanrepo-replace-redirects.yml index f81a631549a39..3c8f3ffbb0b16 100644 --- a/.github/workflows/cleanrepo-replace-redirects.yml +++ b/.github/workflows/cleanrepo-replace-redirects.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/dependabot-bot.yml b/.github/workflows/dependabot-bot.yml index c110b55567dfd..40b3efae238f2 100644 --- a/.github/workflows/dependabot-bot.yml +++ b/.github/workflows/dependabot-bot.yml @@ -26,7 +26,7 @@ jobs: # Checkout the repo into the workspace within the VM steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index f8545b144e080..f172bf1491730 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/do-not-merge-label-check.yml b/.github/workflows/do-not-merge-label-check.yml index 1e626a6b73b0b..2c7a69d2b8d81 100644 --- a/.github/workflows/do-not-merge-label-check.yml +++ b/.github/workflows/do-not-merge-label-check.yml @@ -22,7 +22,7 @@ jobs: - 'DO NOT MERGE' steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/docs-verifier.yml b/.github/workflows/docs-verifier.yml index 1afe5b98f6e98..5c4dc10587d05 100644 --- a/.github/workflows/docs-verifier.yml +++ b/.github/workflows/docs-verifier.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/live-protection.yml b/.github/workflows/live-protection.yml index c308b2f6c26e3..30fd02dee8f3b 100644 --- a/.github/workflows/live-protection.yml +++ b/.github/workflows/live-protection.yml @@ -11,7 +11,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index c845767aa8167..3f6fb6a00de93 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/profanity-filter.yml b/.github/workflows/profanity-filter.yml index c839a0e00ee05..5ddd5e79ecc5a 100644 --- a/.github/workflows/profanity-filter.yml +++ b/.github/workflows/profanity-filter.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/quest-bulk.yml b/.github/workflows/quest-bulk.yml index 6fd60faafb767..e38bd2abae504 100644 --- a/.github/workflows/quest-bulk.yml +++ b/.github/workflows/quest-bulk.yml @@ -28,7 +28,7 @@ jobs: if: ${{ github.repository_owner == 'dotnet' }} steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/quest.yml b/.github/workflows/quest.yml index e30dbc5b9390a..17476902c55dc 100644 --- a/.github/workflows/quest.yml +++ b/.github/workflows/quest.yml @@ -29,7 +29,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index feea5162ce353..a9a8bd19b2920 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/snippets5000.yml b/.github/workflows/snippets5000.yml index f419e43d00377..81f7e2b24b264 100644 --- a/.github/workflows/snippets5000.yml +++ b/.github/workflows/snippets5000.yml @@ -31,7 +31,7 @@ jobs: steps: # Checkout the repository for the PR - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index a3bc00eea5a08..b412cbcda2373 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit diff --git a/.github/workflows/version-sweep.yml b/.github/workflows/version-sweep.yml index ead1b08fdc392..e48d31fc35ada 100644 --- a/.github/workflows/version-sweep.yml +++ b/.github/workflows/version-sweep.yml @@ -34,7 +34,7 @@ jobs: # Start the .NET version updater action # A composite of the .NET Version Sweeper and the .NET Upgrade Assistant - name: Harden Runner - uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2 + uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 with: egress-policy: audit From 61534d41f883f15825e3d449fe5eed5ad7db8f8a Mon Sep 17 00:00:00 2001 From: Quan Zhuo Date: Wed, 3 Dec 2025 21:49:50 +0800 Subject: [PATCH 19/24] Update Program.cs (#50281) "Title" should me right aligned --- .../tutorials/snippets/StringInterpolation/Program.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/csharp/tutorials/snippets/StringInterpolation/Program.cs b/docs/csharp/tutorials/snippets/StringInterpolation/Program.cs index 8a270a1365ac6..bde39c0dfc6e0 100644 --- a/docs/csharp/tutorials/snippets/StringInterpolation/Program.cs +++ b/docs/csharp/tutorials/snippets/StringInterpolation/Program.cs @@ -71,10 +71,10 @@ private static void SpecifyAlignment() // Output: // Author and Title List // - // |Author |Title | - // |Doyle, Arthur Conan |Hound of the Baskervilles, The | - // |London, Jack | Call of the Wild, The | - // |Shakespeare, William | Tempest, The | + // |Author | Title| + // |Doyle, Arthur Conan |Hound of the Baskervilles, The| + // |London, Jack | Call of the Wild, The| + // |Shakespeare, William | Tempest, The| // } From 653c46c6ad7ba4982e636f29faa9af1bf55075f6 Mon Sep 17 00:00:00 2001 From: Xuyang Cao Date: Thu, 4 Dec 2025 01:06:26 +0800 Subject: [PATCH 20/24] support custom agent for .net appmod (#50282) * support custom agent in cli --- .../migration/appmod/coding-agent-support.md | 121 +++++++++++++-- .../migration/appmod/copilot-cli-support.md | 146 +++++++++++++++--- .../media/coding-agent/migrate-input.png | Bin 54558 -> 0 bytes .../coding-agent/select-custom-agent.png | Bin 0 -> 51259 bytes .../appmod/media/select-custom-agent.png | Bin 0 -> 30716 bytes 5 files changed, 237 insertions(+), 30 deletions(-) delete mode 100644 docs/azure/migration/appmod/media/coding-agent/migrate-input.png create mode 100644 docs/azure/migration/appmod/media/coding-agent/select-custom-agent.png create mode 100644 docs/azure/migration/appmod/media/select-custom-agent.png diff --git a/docs/azure/migration/appmod/coding-agent-support.md b/docs/azure/migration/appmod/coding-agent-support.md index 166a8dc5f3032..0d2ffa1d3b301 100644 --- a/docs/azure/migration/appmod/coding-agent-support.md +++ b/docs/azure/migration/appmod/coding-agent-support.md @@ -34,7 +34,7 @@ This article shows you how to migrate .NET apps using **GitHub Copilot app moder dotnet --info ``` -## Get started +## Add the MCP Server 1. Go to **Settings** for the target repository you want to modernize (admin access required). 1. Select **Copilot**, then select **Coding Agent**. @@ -65,21 +65,118 @@ This article shows you how to migrate .NET apps using **GitHub Copilot app moder 1. (Optional) If environment variables are required, set them under **Environment → Copilot** in the settings. These variables initialize automatically the first time an agentic task is invoked in this repository. 1. Save the MCP configuration. -### Migrate your .NET application to Azure +### Create a custom agent -To migrate your .NET application to Azure, describe your migration scenario in the agent prompt. For example: +1. Go to the agents tab at . +1. In the prompt box, open the dropdown, and select the repository where you want to create the custom agent profile. +1. (Optional) Select the branch where you want to create the agent profile. The default is the main branch. +1. Select the **Copilot** icon, then select **+ Create an agent**. This action opens a template agent profile named `my-agent.agent.md` in the `.github/agents` directory of your target repository. +1. Paste the content below into the template, and rename the file to `appmod-dotnet.agent.md`. -```text -Migrate this project from local file I/O to Azure Blob Storage -Migrate this project from local SQL Server to Azure SQL Database with managed identity -Migrate this project from file-based logging to OpenTelemetry -``` + ``` + --- + # .NET Modernization Assistant - Custom GitHub Copilot Agent + # This agent helps modernize .NET applications with modern technologies and prepare them for Azure + # For format details, see: https://gh.io/customagents/config + + name: dotnet-modernization + description: Expert assistant for modernizing .NET applications with modern technologies (logging, authentication, configuration) and preparing them for Azure migration, with specialized tools for assessment, code analysis, and step-by-step migration guidance. + --- + + # .NET Modernization Assistant + + I am a specialized AI assistant for modernizing .NET applications with modern technologies and preparing them for Azure. + + ## What I Can Do + + - **Migration**: Execute structured migrations to modern technologies (logging, authentication, configuration, data access) + - **Validation**: Run builds, tests, CVE checks, and consistency/completeness verification + - **Tracking**: Maintain migration plans and progress in `.appmod/.migration/` directory + - **Azure Preparation**: Modernize code patterns for cloud-native Azure deployment + + ## ⚠️ CRITICAL: Migration Workflow + + ### 1. Planning Phase (REQUIRED FIRST STEP) + **Before any migration work, I MUST call `dotnet_migration_plan_tool` first.** + + This tool will provide instructions for generating `plan.md` and `progress.md` files in `.appmod/.migration/`. + + ### 2. Execution Phase + **I MUST strictly follow the plan and progress files.** + + Migration phases in order: + 1. **Analysis**: Analyze the solution structure and dependencies + 2. **Dependencies**: Update NuGet packages and project references + 3. **Configuration**: Migrate config files (app.config/web.config → appsettings.json) + 4. **Code**: Transform code to modern .NET patterns + 5. **Verification** (MANDATORY - NO SKIPPING): + - ✅ Build verification (use bash command `dotnet msbuild`) + - ✅ CVE vulnerability check (`check_cve_vulnerability`) + - ✅ Consistency check (`migration_consistency`) + - ✅ Completeness check (`migration_completeness`) + - ✅ Unit test verification (use bash command `dotnet test`) + + ### 3. Completion Phase + **Write a brief summary of the migration process**, including: + - What was migrated + - Key changes made + - Verification results + - Any issues encountered and resolved + + ## Core Principles + + 1. **Always call tools in real-time** - Never reuse previous results + 2. **Follow the plan strictly** - Update `progress.md` after each task + 3. **Never skip verification steps** - All checks are mandatory + 4. **Use tools, not instructions** - Execute actions directly via tools + 5. **Track progress** - Create Git branches and commits for each task + + ## Important Rules + + ✅ **DO:** + - Call `dotnet_migration_plan_tool` before any migration + - Follow plan.md and progress.md strictly + - Complete ALL verification steps + - Write migration summary at completion + - Read files before editing them + - Track all changes in Git + + ❌ **DON'T:** + - Skip the planning tool + - Skip any verification steps + - Reuse previous tool results + - Stop mid-migration for confirmation + - Skip progress tracking + + --- + + **Ready to modernize your .NET applications?** Ask me to start a migration! + + ``` -For details on predefined migration tasks, see [migration tasks](predefined-tasks.md). +1. Commit the file, and merge it into the default branch. +1. Return to the agents tab, and refresh the page if needed. Your custom agent appears in the dropdown when you open the agent selector in the prompt box. -1. Open the Agents panel and enter your prompt. After you submit it, Copilot starts a new session and opens a new pull request. It appears in the list below the prompt box. Copilot works on the task and adds you as a reviewer when it finishes, triggering a notification. + Visit [Create a custom agent profile in a repository on GitHub](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents#creating-a-custom-agent-profile-in-a-repository-on-github) for more information. + +### Migrate the .NET application to Azure + +1. Open the [Agents panel](https://github.com/copilot/agents). +1. Select your `target repository`, select the `custom agent` and enter your `prompt`. + + After you submit it, Copilot starts a new session and opens a new pull request. It appears in the list below the prompt box. Copilot works on the task and adds you as a reviewer when it finishes, triggering a notification. + + :::image type="content" source="./media/coding-agent/select-custom-agent.png" lightbox="./media/coding-agent/select-custom-agent.png" alt-text="Screenshot of .NET migrate task input in Coding Agent."::: + + Here are some prompt examples for your reference: + + ```text + Migrate this project from local file I/O to Azure Blob Storage + Migrate this project from local SQL Server to Azure SQL Database with managed identity + Migrate this project from file-based logging to OpenTelemetry + ``` - :::image type="content" source="./media/coding-agent/migrate-input.png" lightbox="./media/coding-agent/migrate-input.png" alt-text="Screenshot of .NET migrate task input in Coding Agent."::: + For details on predefined migration tasks, see [migration tasks](predefined-tasks.md). 1. After the migration starts, monitor the progress: @@ -89,7 +186,7 @@ For details on predefined migration tasks, see [migration tasks](predefined-task :::image type="content" source="./media/coding-agent/migrate-completion.png" lightbox="./media/coding-agent/migrate-completion.png" alt-text="Screenshot of .NET migrate completion in Coding Agent."::: -### Deploy your .NET application to Azure +### Deploy the .NET application to Azure After migration, deploy directly from Coding Agent using a prompt such as: diff --git a/docs/azure/migration/appmod/copilot-cli-support.md b/docs/azure/migration/appmod/copilot-cli-support.md index e632e4a8f1ffd..c5500d85754ed 100644 --- a/docs/azure/migration/appmod/copilot-cli-support.md +++ b/docs/azure/migration/appmod/copilot-cli-support.md @@ -30,7 +30,7 @@ Learn how to migrate .NET applications to Azure with **GitHub Copilot app modern - A GitHub Copilot subscription. See [Copilot plans](https://github.com/features/copilot/plans?ref_product=copilot). - [Install the .NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0). -## Getting started +## Get started 1. In a terminal, navigate to the .NET project folder containing the code you want to work on. 1. Run `copilot` to start Copilot CLI. @@ -49,13 +49,15 @@ Learn how to migrate .NET applications to Azure with **GitHub Copilot app modern - **Yes, and remember this folder for future sessions**: Trust the files in this folder for this and future sessions. You won't be asked again when you start Copilot CLI here. Only choose this option if you are sure it will always be safe for Copilot to work with files in this location. - **No, exit (Esc)**: End the Copilot CLI session. -1. Add MCP servers. Run `/mcp add` in Copilot CLI using the configuration below. For example, to add the .NET migration MCP server: +### Add the MCP Server - ```bash +1. Run `/mcp add` in Copilot CLI using the configuration below. For example, here are two ways to add the .NET migration MCP server: + + ```text /mcp add DotNetAppModMcpServer-migrate ``` - Fill the fields as follows: +1. Fill the fields as follows: - Server Type: Local - Command: `dnx Microsoft.AppModernization.McpServer.DotNet.Migration --yes --source https://api.nuget.org/v3/index.json` @@ -84,33 +86,141 @@ Learn how to migrate .NET applications to Azure with **GitHub Copilot app modern } ``` - Run `/mcp show` to confirm the MCP server configuration. +1. Run `/mcp show` to confirm the MCP server configuration. - ```bash + ```text /mcp show ``` -1. Run the migration task in Copilot CLI. +### Configure a custom agent - Describe your migration scenario in Copilot CLI to migrate your .NET app to Azure. - Use a prompt like *migrate from X to Y* for any migration task. - Copilot CLI supports predefined migration scenarios that follow Microsoft best practices. For details, see [migration tasks](predefined-tasks.md). +1. Create a file in the local `~/.copilot/agents` directory named `appmod-dotnet.agent.md`. +1. Add the following content to define a User-level custom agent. - Example prompts: + For more information, visit [Use custom agents in Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#use-custom-agents). ```text - Migrate this app from local file I/O to Azure Blob Storage - Migrate this app from local SQL Server to Azure SQL Database with managed identity - Migrate this app from file-based logging to OpenTelemetry + --- + # .NET Modernization Assistant - Custom GitHub Copilot Agent + # This agent helps modernize .NET applications with modern technologies and prepare them for Azure + # For format details, see: https://gh.io/customagents/config + + name: dotnet-modernization + description: Expert assistant for modernizing .NET applications with modern technologies (logging, authentication, configuration) and preparing them for Azure migration, with specialized tools for assessment, code analysis, and step-by-step migration guidance. + --- + + # .NET Modernization Assistant + + I am a specialized AI assistant for modernizing .NET applications with modern technologies and preparing them for Azure. + + ## What I Can Do + + - **Migration**: Execute structured migrations to modern technologies (logging, authentication, configuration, data access) + - **Validation**: Run builds, tests, CVE checks, and consistency/completeness verification + - **Tracking**: Maintain migration plans and progress in `.appmod/.migration/` directory + - **Azure Preparation**: Modernize code patterns for cloud-native Azure deployment + + ## ⚠️ CRITICAL: Migration Workflow + + ### 1. Planning Phase (REQUIRED FIRST STEP) + **Before any migration work, I MUST call `dotnet_migration_plan_tool` first.** + + This tool will provide instructions for generating `plan.md` and `progress.md` files in `.appmod/.migration/`. + + ### 2. Execution Phase + **I MUST strictly follow the plan and progress files.** + + Migration phases in order: + 1. **Analysis**: Analyze the solution structure and dependencies + 2. **Dependencies**: Update NuGet packages and project references + 3. **Configuration**: Migrate config files (app.config/web.config → appsettings.json) + 4. **Code**: Transform code to modern .NET patterns + 5. **Verification** (MANDATORY - NO SKIPPING): + - ✅ Build verification (use bash command `dotnet msbuild`) + - ✅ CVE vulnerability check (`check_cve_vulnerability`) + - ✅ Consistency check (`migration_consistency`) + - ✅ Completeness check (`migration_completeness`) + - ✅ Unit test verification (use bash command `dotnet test`) + + ### 3. Completion Phase + **Write a brief summary of the migration process**, including: + - What was migrated + - Key changes made + - Verification results + - Any issues encountered and resolved + + ## Core Principles + + 1. **Always call tools in real-time** - Never reuse previous results + 2. **Follow the plan strictly** - Update `progress.md` after each task + 3. **Never skip verification steps** - All checks are mandatory + 4. **Use tools, not instructions** - Execute actions directly via tools + 5. **Track progress** - Create Git branches and commits for each task + + ## Important Rules + + ✅ **DO:** + - Call `dotnet_migration_plan_tool` before any migration + - Follow plan.md and progress.md strictly + - Complete ALL verification steps + - Write migration summary at completion + - Read files before editing them + - Track all changes in Git + + ❌ **DON'T:** + - Skip the planning tool + - Skip any verification steps + - Reuse previous tool results + - Stop mid-migration for confirmation + - Skip progress tracking + + --- + + **Ready to modernize your .NET applications?** Ask me to start a migration! + ``` - The migration task runs and shows progress in Copilot CLI. + Use the custom agent in one of the following ways: + + - Use the slash command in interactive mode to select from the list of available custom agents: + + ```text + /agent + ``` + + :::image type="content" source="./media/select-custom-agent.png" lightbox="./media/select-custom-agent.png" alt-text="Screenshot of selecting .NET migration custom agent in Copilot CLI."::: + + - Call the custom agent directly in a prompt: + + ```text + Use the dotnet modernization agent to migrate this application from local File IO to use Azure Blob Storage. + ``` + +### Run the migration task in Copilot CLI + +Describe your migration scenario in Copilot CLI to migrate your .NET app to Azure. Use a prompt like: + +```text +*migrate from X to Y* for any migration task +``` + +Copilot CLI supports predefined migration scenarios that follow Microsoft best practices. For details, see [migration tasks](predefined-tasks.md). + +Example prompts: + +```text +Use the dotnet modernization agent to migrate this app from local file I/O to Azure Blob Storage +Use the dotnet modernization agent to migrate this app from local SQL Server to Azure SQL Database with managed identity +Use the dotnet modernization agent to migrate this app from file-based logging to OpenTelemetry +``` + +The migration task runs and shows progress in Copilot CLI. - :::image type="content" source="./media/migrate-details.png" lightbox="./media/migrate-details.png" alt-text="Screenshot of a .NET migration task progress details in Copilot CLI."::: +:::image type="content" source="./media/migrate-details.png" lightbox="./media/migrate-details.png" alt-text="Screenshot of a .NET migration task progress details in Copilot CLI."::: - After migration, view the summary: +After migration, view the summary: - :::image type="content" source="./media/migrate-summary.png" lightbox="./media/migrate-summary.png" alt-text="Screenshot of the .NET migration summary in Copilot CLI."::: +:::image type="content" source="./media/migrate-summary.png" lightbox="./media/migrate-summary.png" alt-text="Screenshot of the .NET migration summary in Copilot CLI."::: ## Provide feedback diff --git a/docs/azure/migration/appmod/media/coding-agent/migrate-input.png b/docs/azure/migration/appmod/media/coding-agent/migrate-input.png deleted file mode 100644 index 1d6020e3a21bd40c8238163da99ac78f02a60760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54558 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 P06*fwGD1ZkbiDo-e1hft diff --git a/docs/azure/migration/appmod/media/coding-agent/select-custom-agent.png b/docs/azure/migration/appmod/media/coding-agent/select-custom-agent.png new file mode 100644 index 0000000000000000000000000000000000000000..d085a859d9724d42cd0ac5cbea075f8984cc6a6e GIT binary patch literal 51259 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

{cNpRjE~w=BAjtFdFC(8523_v;7f!R>{+q+~eN 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 literal 0 HcmV?d00001 diff --git a/docs/azure/migration/appmod/media/select-custom-agent.png b/docs/azure/migration/appmod/media/select-custom-agent.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7be219d588a81852b05a57e6c1f2cc123684cb GIT binary patch literal 30716 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 Date: Wed, 3 Dec 2025 10:52:42 -0800 Subject: [PATCH 21/24] just use runtime (#50279) --- .../analyzers/platform-compat-analyzer.md | 4 +- .../assembly/create-use-strong-named.md | 4 +- docs/standard/assembly/file-format.md | 2 +- docs/standard/assembly/index.md | 2 +- .../assembly/reference-strong-named.md | 52 +-- docs/standard/assembly/set-attributes.md | 2 +- .../assembly/side-by-side-execution.md | 14 +- docs/standard/assembly/versioning.md | 100 +++--- .../standard/base-types/common-type-system.md | 6 +- .../base-types/composite-formatting.md | 2 +- .../base-types/regular-expression-options.md | 8 +- .../regular-expression-source-generators.md | 2 +- .../standard-date-and-time-format-strings.md | 2 +- .../standard-numeric-format-strings.md | 2 +- docs/standard/base-types/type-conversion.md | 256 +++++++-------- docs/standard/clr.md | 10 +- .../migration-guide-2.0.0-beta5.md | 2 +- docs/standard/data/sqlite/extensions.md | 2 +- .../xml/script-blocks-using-msxsl-script.md | 4 +- .../user-defined-functions-and-variables.md | 62 ++-- docs/standard/design-guidelines/attributes.md | 2 +- .../design-guidelines/events-and-callbacks.md | 2 +- .../design-guidelines/extension-methods.md | 2 +- .../design-guidelines/virtual-members.md | 2 +- docs/standard/events/index.md | 88 ++--- ...-to-create-localized-exception-messages.md | 2 +- docs/standard/frameworks.md | 4 +- .../garbage-collection/using-objects.md | 2 +- docs/standard/generics.md | 4 +- docs/standard/generics/index.md | 2 +- docs/standard/glossary.md | 8 +- .../cross-platform-targeting.md | 2 +- .../standard/library-guidance/dependencies.md | 2 +- docs/standard/library-guidance/versioning.md | 8 +- .../linq/statically-compiled-queries.md | 2 +- docs/standard/managed-execution-process.md | 4 +- ...metadata-and-self-describing-components.md | 4 +- .../native-interop/com-callable-wrapper.md | 2 +- .../comwrappers-source-generation.md | 4 +- .../native-interop/native-library-loading.md | 2 +- .../pinvoke-source-generation.md | 6 +- .../qualify-net-types-for-interoperation.md | 2 +- .../native-interop/tutorial-comwrappers.md | 2 +- .../tutorial-custom-marshaller.md | 2 +- docs/standard/net-standard.md | 4 +- ...ining-tasks-by-using-continuation-tasks.md | 2 +- .../introduction-to-plinq.md | 4 +- .../security/key-security-concepts.md | 2 +- .../winforms-applications.md | 2 +- ...ling-xml-serialization-using-attributes.md | 6 +- .../system-text-json/converters-how-to.md | 10 +- .../system-text-json/custom-contracts.md | 2 +- .../migrate-from-newtonsoft.md | 2 +- .../system-text-json/nullable-annotations.md | 2 +- .../system-text-json/overview.md | 2 +- .../system-text-json/polymorphism.md | 6 +- .../system-text-json/populate-properties.md | 2 +- .../reflection-vs-source-generation.md | 6 +- .../source-generation-modes.md | 4 +- .../system-text-json/source-generation.md | 4 +- .../managed-threading-best-practices.md | 302 +++++++++--------- ...d-relative-static-fields-and-data-slots.md | 86 ++--- 62 files changed, 573 insertions(+), 573 deletions(-) diff --git a/docs/standard/analyzers/platform-compat-analyzer.md b/docs/standard/analyzers/platform-compat-analyzer.md index fbe380085633d..6f97a609f7104 100644 --- a/docs/standard/analyzers/platform-compat-analyzer.md +++ b/docs/standard/analyzers/platform-compat-analyzer.md @@ -216,11 +216,11 @@ The following code snippet shows how you can combine attributes to set the right The recommended way to deal with these diagnostics is to make sure you only call platform-specific APIs when running on an appropriate platform. Following are the options you can use to address the warnings; choose whichever is most appropriate for your situation: -- **Guard the call**. You can achieve this by conditionally calling the code at run time. Check whether you're running on a desired `Platform` by using one of platform-check methods, for example, `OperatingSystem.Is()` or `OperatingSystem.IsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)`. [Example](#guard-platform-specific-apis-with-guard-methods). +- **Guard the call**. You can achieve this by conditionally calling the code at runtime. Check whether you're running on a desired `Platform` by using one of platform-check methods, for example, `OperatingSystem.Is()` or `OperatingSystem.IsVersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)`. [Example](#guard-platform-specific-apis-with-guard-methods). - **Mark the call site as platform-specific**. You can also choose to mark your own APIs as being platform-specific, thus effectively just forwarding the requirements to your callers. Mark the containing method or type or the entire assembly with the same attributes as the referenced platform-dependent call. [Examples](#mark-call-site-as-platform-specific). -- **Assert the call site with platform check**. If you don't want the overhead of an additional `if` statement at run time, use . [Example](#assert-the-call-site-with-platform-check). +- **Assert the call site with platform check**. If you don't want the overhead of an additional `if` statement at runtime, use . [Example](#assert-the-call-site-with-platform-check). - **Delete the code**. Generally not what you want because it means you lose fidelity when your code is used by Windows users. For cases where a cross-platform alternative exists, you're likely better off using that over platform-specific APIs. diff --git a/docs/standard/assembly/create-use-strong-named.md b/docs/standard/assembly/create-use-strong-named.md index 7591a33bdf995..b7edfb08b4ff5 100644 --- a/docs/standard/assembly/create-use-strong-named.md +++ b/docs/standard/assembly/create-use-strong-named.md @@ -40,7 +40,7 @@ The following scenario outlines the process of signing an assembly with a strong 3. Assembly B is a consumer of Assembly A. The reference section of Assembly B's manifest includes a token that represents Assembly A's public key. A token is a portion of the full public key and is used rather than the key itself to save space. -4. The common language runtime verifies the strong name signature when the assembly is placed in the global assembly cache. When binding by strong name at run time, the common language runtime compares the key stored in Assembly B's manifest with the key used to generate the strong name for Assembly A. If the .NET security checks pass and the bind succeeds, Assembly B has a guarantee that Assembly A's bits have not been tampered with and that these bits actually come from the developers of Assembly A. +4. The common language runtime verifies the strong name signature when the assembly is placed in the global assembly cache. When binding by strong name at runtime, the common language runtime compares the key stored in Assembly B's manifest with the key used to generate the strong name for Assembly A. If the .NET security checks pass and the bind succeeds, Assembly B has a guarantee that Assembly A's bits have not been tampered with and that these bits actually come from the developers of Assembly A. > [!NOTE] > This scenario doesn't address trust issues. Assemblies can carry full Microsoft Authenticode signatures in addition to a strong name. Authenticode signatures include a certificate that establishes trust. It's important to note that strong names don't require code to be signed in this way. Strong names only provide a unique identity. @@ -68,7 +68,7 @@ This feature can be disabled for individual applications or for a computer. See |[How to: Create a public-private key pair](create-public-private-key-pair.md)|Describes how to create a cryptographic key pair for signing an assembly.| |[How to: Sign an assembly with a strong name](sign-strong-name.md)|Describes how to create a strong-named assembly.| |[Enhanced strong naming](enhanced-strong-naming.md)|Describes enhancements to strong-names in the .NET Framework 4.5.| -|[How to: Reference a strong-named assembly](reference-strong-named.md)|Describes how to reference types or resources in a strong-named assembly at compile time or run time.| +|[How to: Reference a strong-named assembly](reference-strong-named.md)|Describes how to reference types or resources in a strong-named assembly at compile time or runtime.| |[How to: Disable the strong-name bypass feature](disable-strong-name-bypass-feature.md)|Describes how to disable the feature that bypasses the validation of strong-name signatures. This feature can be disabled for all or for specific applications.| |[Create assemblies](create.md)|Provides an overview of single-file and multifile assemblies.| |[How to delay sign an assembly in Visual Studio](/visualstudio/ide/managing-assembly-and-manifest-signing#how-to-sign-an-assembly-in-visual-studio)|Explains how to sign an assembly with a strong name after the assembly has been created.| diff --git a/docs/standard/assembly/file-format.md b/docs/standard/assembly/file-format.md index 32e9617eefe61..8669d8f2beb40 100644 --- a/docs/standard/assembly/file-format.md +++ b/docs/standard/assembly/file-format.md @@ -28,4 +28,4 @@ Assembly Headers from ECMA 335 II.25.1, Structure of the runtime file format. ## Process the assemblies -It is possible to write tools or APIs to process assemblies. Assembly information enables making programmatic decisions at run time, rewriting assemblies, providing API IntelliSense in an editor, and generating documentation. , , and [Mono.Cecil](https://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/) are good examples of tools that are frequently used for this purpose. +It is possible to write tools or APIs to process assemblies. Assembly information enables making programmatic decisions at runtime, rewriting assemblies, providing API IntelliSense in an editor, and generating documentation. , , and [Mono.Cecil](https://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/) are good examples of tools that are frequently used for this purpose. diff --git a/docs/standard/assembly/index.md b/docs/standard/assembly/index.md index 59f180512dcc2..6d5fb3b678666 100644 --- a/docs/standard/assembly/index.md +++ b/docs/standard/assembly/index.md @@ -103,7 +103,7 @@ In C#, you can use two versions of the same assembly in a single application. Fo |[Assembly placement](../../framework/app-domains/assembly-placement.md)|Where to locate assemblies.| |[Assemblies and side-by-side execution](side-by-side-execution.md)|Use multiple versions of the runtime or an assembly simultaneously.| |[Emit dynamic methods and assemblies](../../fundamentals/reflection/emitting-dynamic-methods-and-assemblies.md)|How to create dynamic assemblies.| -|[How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md)|How the .NET Framework resolves assembly references at run time.| +|[How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md)|How the .NET Framework resolves assembly references at runtime.| ## Reference diff --git a/docs/standard/assembly/reference-strong-named.md b/docs/standard/assembly/reference-strong-named.md index 562135bc04d31..3d68f7a9d4728 100644 --- a/docs/standard/assembly/reference-strong-named.md +++ b/docs/standard/assembly/reference-strong-named.md @@ -2,55 +2,55 @@ title: "How to: Reference a strong-named assembly" description: This article shows you how to reference types or resources in a strong-named .NET assembly, either at compile time or runtime. ms.date: "08/20/2019" -helpviewer_keywords: +helpviewer_keywords: - "strong-named assemblies, compile-time references" - "compile-time assembly referencing" - "assemblies [.NET], strong-named" - "assembly binding, strong-named" ms.topic: how-to -dev_langs: +dev_langs: - "csharp" - "vb" - "cpp" --- # How to: Reference a strong-named assembly -The process for referencing types or resources in a strong-named assembly is usually transparent. You can make the reference either at compile time (early binding) or at run time. - +The process for referencing types or resources in a strong-named assembly is usually transparent. You can make the reference either at compile time (early binding) or at runtime. + A compile-time reference occurs when you indicate to the compiler that the assembly to be compiled explicitly references another assembly. When you use compile-time referencing, the compiler automatically gets the public key of the targeted strong-named assembly and places it in the assembly reference of the assembly being compiled. - + > [!NOTE] -> A strong-named assembly can only use types from other strong-named assemblies. Otherwise, the security of the strong-named assembly would be compromised. - -## Make a compile-time reference to a strong-named assembly +> A strong-named assembly can only use types from other strong-named assemblies. Otherwise, the security of the strong-named assembly would be compromised. + +## Make a compile-time reference to a strong-named assembly -At a command prompt, type the following command: +At a command prompt, type the following command: -\<*compiler command*> **/reference:**\<*assembly name*> +\<*compiler command*> **/reference:**\<*assembly name*> -In this command, *compiler command* is the compiler command for the language you are using, and *assembly name* is the name of the strong-named assembly being referenced. You can also use other compiler options, such as the **/t:library** option for creating a library assembly. +In this command, *compiler command* is the compiler command for the language you are using, and *assembly name* is the name of the strong-named assembly being referenced. You can also use other compiler options, such as the **/t:library** option for creating a library assembly. -The following example creates an assembly called *myAssembly.dll* that references a strong-named assembly called *myLibAssembly.dll* from a code module called *myAssembly.cs*. +The following example creates an assembly called *myAssembly.dll* that references a strong-named assembly called *myLibAssembly.dll* from a code module called *myAssembly.cs*. ```cmd -csc /t:library myAssembly.cs /reference:myLibAssembly.dll -``` +csc /t:library myAssembly.cs /reference:myLibAssembly.dll +``` + +## Make a runtime reference to a strong-named assembly -## Make a run-time reference to a strong-named assembly - -When you make a run-time reference to a strong-named assembly, for example by using the or method, you must use the display name of the referenced strong-named assembly. The syntax of a display name is as follows: +When you make a runtime reference to a strong-named assembly, for example by using the or method, you must use the display name of the referenced strong-named assembly. The syntax of a display name is as follows: -\<*assembly name*>**,** \<*version number*>**,** \<*culture*>**,** \<*public key token*> +\<*assembly name*>**,** \<*version number*>**,** \<*culture*>**,** \<*public key token*> -For example: +For example: ```console myDll, Version=1.1.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33 -``` +``` -In this example, `PublicKeyToken` is the hexadecimal form of the public key token. If there is no culture value, use `Culture=neutral`. +In this example, `PublicKeyToken` is the hexadecimal form of the public key token. If there is no culture value, use `Culture=neutral`. -The following code example shows how to use this information with the method. +The following code example shows how to use this information with the method. ```cpp Assembly^ myDll = @@ -67,13 +67,13 @@ Dim myDll As Assembly = _ Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1") ``` -You can print the hexadecimal format of the public key and public key token for a specific assembly by using the following [Strong Name (Sn.exe)](../../framework/tools/sn-exe-strong-name-tool.md) command: +You can print the hexadecimal format of the public key and public key token for a specific assembly by using the following [Strong Name (Sn.exe)](../../framework/tools/sn-exe-strong-name-tool.md) command: -**sn -Tp \<** *assembly* **>** +**sn -Tp \<** *assembly* **>** -If you have a public key file, you can use the following command instead (note the difference in case on the command-line option): +If you have a public key file, you can use the following command instead (note the difference in case on the command-line option): -**sn -tp \<** *public key file* **>** +**sn -tp \<** *public key file* **>** ## See also diff --git a/docs/standard/assembly/set-attributes.md b/docs/standard/assembly/set-attributes.md index ab174e4c9624a..f9acd5a6c0155 100644 --- a/docs/standard/assembly/set-attributes.md +++ b/docs/standard/assembly/set-attributes.md @@ -68,7 +68,7 @@ You can use informational attributes to provide additional company or product in | | String value specifying a company name. | | | String value specifying copyright information. | | | String value specifying the Win32 file version number. This normally defaults to the assembly version. | -| | String value specifying version information that is not used by the common language runtime, such as a full product version number. **Note:** If this attribute is applied to an assembly, the string it specifies can be obtained at run time by using the property. The string is also used in the path and registry key provided by the and properties. | +| | String value specifying version information that is not used by the common language runtime, such as a full product version number. **Note:** If this attribute is applied to an assembly, the string it specifies can be obtained at runtime by using the property. The string is also used in the path and registry key provided by the and properties. | | | String value specifying product information. | | | String value specifying trademark information. | diff --git a/docs/standard/assembly/side-by-side-execution.md b/docs/standard/assembly/side-by-side-execution.md index 89f50b5727d5c..b06a6e337ddb8 100644 --- a/docs/standard/assembly/side-by-side-execution.md +++ b/docs/standard/assembly/side-by-side-execution.md @@ -2,19 +2,19 @@ title: "Assemblies and side-by-side execution" description: Learn about side-by-side execution, which is the ability to store and run multiple versions of an application or component on the same computer. ms.date: "08/20/2019" -helpviewer_keywords: +helpviewer_keywords: - "side-by-side execution [.NET]" - "assemblies [.NET], side-by-side execution" ms.assetid: e42036ee-7590-47d1-b884-cc856e39bd5d --- # Assemblies and side-by-side execution -Side-by-side execution is the ability to store and execute multiple versions of an application or component on the same computer. This means that you can have multiple versions of the runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time. Side-by-side execution gives you more control over what versions of a component an application binds to, and more control over what version of the runtime an application uses. - -Support for side-by-side storage and execution of different versions of the same assembly is an integral part of strong naming and is built into the infrastructure of the runtime. Because the strong-named assembly's version number is part of its identity, the runtime can store multiple versions of the same assembly in the global assembly cache and load those assemblies at run time. - -Although the runtime provides you with the ability to create side-by-side applications, side-by-side execution is not automatic. For more information on creating applications for side-by-side execution, see [Guidelines for creating components for side-by-side execution](../../framework/deployment/guidelines-for-creating-components-for-side-by-side-execution.md). - +Side-by-side execution is the ability to store and execute multiple versions of an application or component on the same computer. This means that you can have multiple versions of the runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time. Side-by-side execution gives you more control over what versions of a component an application binds to, and more control over what version of the runtime an application uses. + +Support for side-by-side storage and execution of different versions of the same assembly is an integral part of strong naming and is built into the infrastructure of the runtime. Because the strong-named assembly's version number is part of its identity, the runtime can store multiple versions of the same assembly in the global assembly cache and load those assemblies at runtime. + +Although the runtime provides you with the ability to create side-by-side applications, side-by-side execution is not automatic. For more information on creating applications for side-by-side execution, see [Guidelines for creating components for side-by-side execution](../../framework/deployment/guidelines-for-creating-components-for-side-by-side-execution.md). + ## See also - [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md) diff --git a/docs/standard/assembly/versioning.md b/docs/standard/assembly/versioning.md index 996819add92f3..4b92e5d26ebad 100644 --- a/docs/standard/assembly/versioning.md +++ b/docs/standard/assembly/versioning.md @@ -2,7 +2,7 @@ title: "Assembly versioning" description: Learn about versioning of .NET assemblies. All versioning of assemblies that use the CLR is done at the assembly level. ms.date: "08/20/2019" -helpviewer_keywords: +helpviewer_keywords: - "informational versions" - "version numbers, assemblies" - "assemblies [.NET], versioning" @@ -12,57 +12,57 @@ ms.assetid: 775ad4fb-914f-453c-98ef-ce1089b6f903 --- # Assembly versioning -All versioning of assemblies that use the common language runtime is done at the assembly level. The specific version of an assembly and the versions of dependent assemblies are recorded in the assembly's manifest. The default version policy for the runtime is that applications run only with the versions they were built and tested with, unless overridden by explicit version policy in configuration files (the application configuration file, the publisher policy file, and the computer's administrator configuration file). - -The runtime performs several steps to resolve an assembly binding request: - -1. Checks the original assembly reference to determine the version of the assembly to be bound. - -2. Checks for all applicable configuration files to apply version policy. - -3. Determines the correct assembly from the original assembly reference and any redirection specified in the configuration files, and determines the version that should be bound to the calling assembly. - -4. Checks the global assembly cache, codebases specified in configuration files, and then checks the application's directory and subdirectories using the probing rules explained in [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). - -The following illustration shows these steps: - +All versioning of assemblies that use the common language runtime is done at the assembly level. The specific version of an assembly and the versions of dependent assemblies are recorded in the assembly's manifest. The default version policy for the runtime is that applications run only with the versions they were built and tested with, unless overridden by explicit version policy in configuration files (the application configuration file, the publisher policy file, and the computer's administrator configuration file). + +The runtime performs several steps to resolve an assembly binding request: + +1. Checks the original assembly reference to determine the version of the assembly to be bound. + +2. Checks for all applicable configuration files to apply version policy. + +3. Determines the correct assembly from the original assembly reference and any redirection specified in the configuration files, and determines the version that should be bound to the calling assembly. + +4. Checks the global assembly cache, codebases specified in configuration files, and then checks the application's directory and subdirectories using the probing rules explained in [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). + +The following illustration shows these steps: + ![Diagram that shows steps in assembly binding request resolution.](./media/versioning/resolve-assembly-binding-request.gif) - -For more information about configuring applications, see [Configure apps](../../framework/configure-apps/index.md). For more information about binding policy, see [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). - -## Version information - -Each assembly has two distinct ways of expressing version information: - -- The assembly's version number, which, together with the assembly name and culture information, is part of the assembly's identity. This number is used by the runtime to enforce version policy and plays a key part in the type resolution process at run time. - -- An informational version, which is a string that represents additional version information included for informational purposes only. - -### Assembly version number - -Each assembly has a version number as part of its identity. As such, two assemblies that differ by version number are considered by the runtime to be completely different assemblies. This version number is physically represented as a four-part string with the following format: - -\<*major version*>.\<*minor version*>.\<*build number*>.\<*revision*> - -For example, version 1.5.1254.0 indicates 1 as the major version, 5 as the minor version, 1254 as the build number, and 0 as the revision number. - -The version number is stored in the assembly manifest along with other identity information, including the assembly name and public key, as well as information on relationships and identities of other assemblies connected with the application. - -When an assembly is built, the development tool records dependency information for each assembly that is referenced in the assembly manifest. The runtime uses these version numbers, in conjunction with configuration information set by an administrator, an application, or a publisher, to load the proper version of a referenced assembly. - -The runtime distinguishes between regular and strong-named assemblies for the purposes of versioning. Version checking only occurs with strong-named assemblies. - -For information about specifying version binding policies, see [Configure apps](../../framework/configure-apps/index.md). For information about how the runtime uses version information to find a particular assembly, see [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). - -### Assembly informational version - -The informational version is a string that attaches additional version information to an assembly for informational purposes only; this information is not used at run time. The text-based informational version corresponds to the product's marketing literature, packaging, or product name and is not used by the runtime. For example, an informational version could be "Common Language Runtime version 1.0" or "NET Control SP 2". On the Version tab of the file properties dialog in Microsoft Windows, this information appears in the item "Product Version". - + +For more information about configuring applications, see [Configure apps](../../framework/configure-apps/index.md). For more information about binding policy, see [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). + +## Version information + +Each assembly has two distinct ways of expressing version information: + +- The assembly's version number, which, together with the assembly name and culture information, is part of the assembly's identity. This number is used by the runtime to enforce version policy and plays a key part in the type resolution process at runtime. + +- An informational version, which is a string that represents additional version information included for informational purposes only. + +### Assembly version number + +Each assembly has a version number as part of its identity. As such, two assemblies that differ by version number are considered by the runtime to be completely different assemblies. This version number is physically represented as a four-part string with the following format: + +\<*major version*>.\<*minor version*>.\<*build number*>.\<*revision*> + +For example, version 1.5.1254.0 indicates 1 as the major version, 5 as the minor version, 1254 as the build number, and 0 as the revision number. + +The version number is stored in the assembly manifest along with other identity information, including the assembly name and public key, as well as information on relationships and identities of other assemblies connected with the application. + +When an assembly is built, the development tool records dependency information for each assembly that is referenced in the assembly manifest. The runtime uses these version numbers, in conjunction with configuration information set by an administrator, an application, or a publisher, to load the proper version of a referenced assembly. + +The runtime distinguishes between regular and strong-named assemblies for the purposes of versioning. Version checking only occurs with strong-named assemblies. + +For information about specifying version binding policies, see [Configure apps](../../framework/configure-apps/index.md). For information about how the runtime uses version information to find a particular assembly, see [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md). + +### Assembly informational version + +The informational version is a string that attaches additional version information to an assembly for informational purposes only; this information is not used at runtime. The text-based informational version corresponds to the product's marketing literature, packaging, or product name and is not used by the runtime. For example, an informational version could be "Common Language Runtime version 1.0" or "NET Control SP 2". On the Version tab of the file properties dialog in Microsoft Windows, this information appears in the item "Product Version". + > [!NOTE] -> Although you can specify any text, a warning message appears on compilation if the string is not in the format used by the assembly version number, or if it is in that format but contains wildcards. This warning is harmless. - -The informational version is represented using the custom attribute . For more information about the informational version attribute, see [Set assembly attributes](set-attributes.md). - +> Although you can specify any text, a warning message appears on compilation if the string is not in the format used by the assembly version number, or if it is in that format but contains wildcards. This warning is harmless. + +The informational version is represented using the custom attribute . For more information about the informational version attribute, see [Set assembly attributes](set-attributes.md). + ## See also - [How the runtime locates assemblies](../../framework/deployment/how-the-runtime-locates-assemblies.md) diff --git a/docs/standard/base-types/common-type-system.md b/docs/standard/base-types/common-type-system.md index 52a4b0e269021..674a50546974a 100644 --- a/docs/standard/base-types/common-type-system.md +++ b/docs/standard/base-types/common-type-system.md @@ -154,7 +154,7 @@ A type definition includes the following: ### Attributes -Attributes provide additional user-defined metadata. Most commonly, they are used to store additional information about a type in its assembly, or to modify the behavior of a type member in either the design-time or run-time environment. +Attributes provide additional user-defined metadata. Most commonly, they are used to store additional information about a type in its assembly, or to modify the behavior of a type member in either the design-time or runtime environment. Attributes are themselves classes that inherit from . Languages that support the use of attributes each have their own syntax for applying attributes to a language element. Attributes can be applied to almost any language element; the specific elements to which an attribute can be applied are defined by the that is applied to that attribute class. @@ -268,7 +268,7 @@ The common type system allows type members to have a variety of characteristics; |literal|Fields|The value assigned to the field is a fixed value, known at compile time, of a built-in value type. Literal fields are sometimes referred to as constants.| |newslot or override|All|Defines how the member interacts with inherited members that have the same signature:

newslot
Hides inherited members that have the same signature.

override
Replaces the definition of an inherited virtual method.

The default is newslot.| |static|Fields, methods, properties, and events|The member belongs to the type it is defined on, not to a particular instance of the type; the member exists even if an instance of the type is not created, and it is shared among all instances of the type.| -|virtual|Methods, properties, and events|The method can be implemented by a derived type and can be invoked either statically or dynamically. If dynamic invocation is used, the type of the instance that makes the call at run time (rather than the type known at compile time) determines which implementation of the method is called. To invoke a virtual method statically, the variable might have to be cast to a type that uses the desired version of the method.| +|virtual|Methods, properties, and events|The method can be implemented by a derived type and can be invoked either statically or dynamically. If dynamic invocation is used, the type of the instance that makes the call at runtime (rather than the type known at compile time) determines which implementation of the method is called. To invoke a virtual method statically, the variable might have to be cast to a type that uses the desired version of the method.| ### Overloading @@ -283,7 +283,7 @@ A derived type inherits all members of its base type; that is, these members are - A derived type can hide an inherited member by defining a new member with the same signature. This might be done to make a previously public member private or to define new behavior for an inherited method that is marked as `sealed`. -- A derived type can override an inherited virtual method. The overriding method provides a new definition of the method that will be invoked based on the type of the value at run time rather than the type of the variable known at compile time. A method can override a virtual method only if the virtual method is not marked as `sealed` and the new method is at least as accessible as the virtual method. +- A derived type can override an inherited virtual method. The overriding method provides a new definition of the method that will be invoked based on the type of the value at runtime rather than the type of the variable known at compile time. A method can override a virtual method only if the virtual method is not marked as `sealed` and the new method is at least as accessible as the virtual method. ## See also diff --git a/docs/standard/base-types/composite-formatting.md b/docs/standard/base-types/composite-formatting.md index 19430f835a054..4a4be55abd5b5 100644 --- a/docs/standard/base-types/composite-formatting.md +++ b/docs/standard/base-types/composite-formatting.md @@ -64,7 +64,7 @@ Multiple format items can refer to the same element in the list of objects by sp :::code language="csharp" source="./snippets/composite-formatting/net/csharp/Program.cs" id="multiple"::: :::code language="vb" source="./snippets/composite-formatting/net/vb/Program.vb" id="multiple"::: -Each format item can refer to any object in the list. For example, if there are three objects, you can format the second, first, and third object by specifying a composite format string such as `{1} {0} {2}`. An object that isn't referenced by a format item is ignored. A is thrown at run time if a parameter specifier designates an item outside the bounds of the list of objects. +Each format item can refer to any object in the list. For example, if there are three objects, you can format the second, first, and third object by specifying a composite format string such as `{1} {0} {2}`. An object that isn't referenced by a format item is ignored. A is thrown at runtime if a parameter specifier designates an item outside the bounds of the list of objects. ### Width component diff --git a/docs/standard/base-types/regular-expression-options.md b/docs/standard/base-types/regular-expression-options.md index 911d9ca8a6c87..02eca90d7eeee 100644 --- a/docs/standard/base-types/regular-expression-options.md +++ b/docs/standard/base-types/regular-expression-options.md @@ -228,9 +228,9 @@ Finally, you can use the inline group element `(?n:)` to suppress automatic capt > [!NOTE] > Where possible, use [source-generated regular expressions](regular-expression-source-generators.md) instead of compiling regular expressions using the option. Source generation can help your app start faster, run more quickly and be more trimmable. To learn when source generation is possible, see [When to use it](regular-expression-source-generators.md#when-to-use-it). -By default, regular expressions in .NET are interpreted. When a object is instantiated or a static method is called, the regular expression pattern is parsed into a set of custom opcodes, and an interpreter uses these opcodes to run the regular expression. This involves a tradeoff: the cost of initializing the regular expression engine is minimized at the expense of run-time performance. +By default, regular expressions in .NET are interpreted. When a object is instantiated or a static method is called, the regular expression pattern is parsed into a set of custom opcodes, and an interpreter uses these opcodes to run the regular expression. This involves a tradeoff: the cost of initializing the regular expression engine is minimized at the expense of runtime performance. -You can use compiled instead of interpreted regular expressions by using the option. In this case, when a pattern is passed to the regular expression engine, it is parsed into a set of opcodes and then converted to common intermediate language (CIL), which can be passed directly to the common language runtime. Compiled regular expressions maximize run-time performance at the expense of initialization time. +You can use compiled instead of interpreted regular expressions by using the option. In this case, when a pattern is passed to the regular expression engine, it is parsed into a set of opcodes and then converted to common intermediate language (CIL), which can be passed directly to the common language runtime. Compiled regular expressions maximize runtime performance at the expense of initialization time. > [!NOTE] > A regular expression can be compiled only by supplying the value to the `options` parameter of a class constructor or a static pattern-matching method. It's not available as an inline option. @@ -266,9 +266,9 @@ However, in the following cases, white-space characters in a regular expression - White space isn't allowed within a character sequence that introduces a language element. For example: - - The language element `(?:`*subexpression*`)` represents a noncapturing group, and the `(?:` portion of the element can't have embedded spaces. The pattern `(? :`*subexpression*`)` throws an at run time because the regular expression engine can't parse the pattern, and the pattern `( ?:`*subexpression*`)` fails to match *subexpression*. + - The language element `(?:`*subexpression*`)` represents a noncapturing group, and the `(?:` portion of the element can't have embedded spaces. The pattern `(? :`*subexpression*`)` throws an at runtime because the regular expression engine can't parse the pattern, and the pattern `( ?:`*subexpression*`)` fails to match *subexpression*. - - The language element `\p{`*name*`}`, which represents a Unicode category or named block, can't include embedded spaces in the `\p{` portion of the element. If you do include a white space, the element throws an at run time. + - The language element `\p{`*name*`}`, which represents a Unicode category or named block, can't include embedded spaces in the `\p{` portion of the element. If you do include a white space, the element throws an at runtime. Enabling this option helps simplify regular expressions that are often difficult to parse and to understand. It improves readability, and makes it possible to document a regular expression. diff --git a/docs/standard/base-types/regular-expression-source-generators.md b/docs/standard/base-types/regular-expression-source-generators.md index b87579359ef0e..bcde7e299f5ea 100644 --- a/docs/standard/base-types/regular-expression-source-generators.md +++ b/docs/standard/base-types/regular-expression-source-generators.md @@ -368,7 +368,7 @@ Also, neither `RegexCompiler` nor the source generator supports the new `RegexOp The general guidance is if you can use the source generator, use it. If you're using `Regex` today in C# with arguments known at compile time, and especially if you're already using `RegexOptions.Compiled` (because the regex has been identified as a hot spot that would benefit from faster throughput), you should prefer to use the source generator. The source generator will give your regex the following benefits: - All the throughput benefits of `RegexOptions.Compiled`. -- The startup benefits of not having to do all the regex parsing, analysis, and compilation at run time. +- The startup benefits of not having to do all the regex parsing, analysis, and compilation at runtime. - The option of using ahead-of-time compilation with the code generated for the regex. - Better debuggability and understanding of the regex. - The possibility to reduce the size of your trimmed app by trimming out large swaths of code associated with `RegexCompiler` (and potentially even reflection emit itself). diff --git a/docs/standard/base-types/standard-date-and-time-format-strings.md b/docs/standard/base-types/standard-date-and-time-format-strings.md index b5bd0d22c9c42..54abb1eb1ab0d 100644 --- a/docs/standard/base-types/standard-date-and-time-format-strings.md +++ b/docs/standard/base-types/standard-date-and-time-format-strings.md @@ -49,7 +49,7 @@ A standard date and time format string uses a single character as the format spe |"u"|Universal sortable date/time pattern.

More information: [The universal sortable ("u") format specifier](#UniversalSortable).|With a value: 2009-06-15T13:45:30 -> 2009-06-15 13:45:30Z

With a value: 2009-06-15T13:45:30 -> 2009-06-15 20:45:30Z| |"U"|Universal full date/time pattern.

More information: [The universal full ("U") format specifier](#UniversalFull).|2009-06-15T13:45:30 -> Monday, June 15, 2009 8:45:30 PM (en-US)

2009-06-15T13:45:30 -> den 15 juni 2009 20:45:30 (sv-SE)

2009-06-15T13:45:30 -> Δευτέρα, 15 Ιουνίου 2009 8:45:30 μμ (el-GR)| |"Y", "y"|Year month pattern.

More information: [The year month ("Y") format specifier](#YearMonth).|2009-06-15T13:45:30 -> June 2009 (en-US)

2009-06-15T13:45:30 -> juni 2009 (da-DK)

2009-06-15T13:45:30 -> Juni 2009 (id-ID)| -|Any other single character|Unknown specifier.|Throws a run-time .| +|Any other single character|Unknown specifier.|Throws a runtime .| ## How standard format strings work diff --git a/docs/standard/base-types/standard-numeric-format-strings.md b/docs/standard/base-types/standard-numeric-format-strings.md index b084452518e0b..2a2848c077043 100644 --- a/docs/standard/base-types/standard-numeric-format-strings.md +++ b/docs/standard/base-types/standard-numeric-format-strings.md @@ -63,7 +63,7 @@ The following table describes the standard numeric format specifiers and display | "P" or "p" | Percent | Result: Number multiplied by 100 and displayed with a percent symbol.

Supported by: All numeric types.

Precision specifier: Desired number of decimal places.

Default precision specifier: Defined by .

More information: [The Percent ("P") Format Specifier](#PFormatString). | 1 ("P", en-US)
-> 100.00 %

1 ("P", fr-FR)
-> 100,00 %

-0.39678 ("P1", en-US)
-> -39.7 %

-0.39678 ("P1", fr-FR)
-> -39,7 % | | "R" or "r" | Round-trip | Result: A string that can round-trip to an identical number.

Supported by: , , and .

Note: Recommended for the type only. For types, use "G17"; for types, use "G9".
Precision specifier: Ignored.

More information: [The Round-trip ("R") Format Specifier](#RFormatString). | 123456789.12345678 ("R")
-> 123456789.12345678

-1234567890.12345678 ("R")
-> -1234567890.1234567 | | "X" or "x" | Hexadecimal | Result: A hexadecimal string.

Supported by: Integral types only.

Precision specifier: Number of digits in the result string.

More information: [The Hexadecimal ("X") Format Specifier](#XFormatString). | 255 ("X")
-> FF

-1 ("x")
-> ff

255 ("x4")
-> 00ff

-1 ("X4")
-> 00FF | -| Any other single character | Unknown specifier | Result: Throws a at run time. | | +| Any other single character | Unknown specifier | Result: Throws a at runtime. | | ## Use standard numeric format strings diff --git a/docs/standard/base-types/type-conversion.md b/docs/standard/base-types/type-conversion.md index 1482b1f5c8a02..abef4340b59e6 100644 --- a/docs/standard/base-types/type-conversion.md +++ b/docs/standard/base-types/type-conversion.md @@ -3,10 +3,10 @@ title: "Type Conversion in .NET" description: Read about type conversion in .NET, which creates a value in a new type that's equivalent to the old type's value, but may not keep the original's identity. ms.topic: article ms.date: 03/30/2017 -dev_langs: +dev_langs: - "csharp" - "vb" -helpviewer_keywords: +helpviewer_keywords: - "widening conversions" - "explicit conversions" - "narrowing conversions" @@ -28,171 +28,171 @@ ms.assetid: ba36154f-064c-47d3-9f05-72f93a7ca96d --- # Type conversion in .NET -Every value has an associated type, which defines attributes such as the amount of space allocated to the value, the range of possible values it can have, and the members that it makes available. Many values can be expressed as more than one type. For example, the value 4 can be expressed as an integer or a floating-point value. Type conversion creates a value in a new type that is equivalent to the value of an old type, but does not necessarily preserve the identity (or exact value) of the original object. - -.NET automatically supports the following conversions: - -- Conversion from a derived class to a base class. This means, for example, that an instance of any class or structure can be converted to an instance. This conversion does not require a casting or conversion operator. - -- Conversion from a base class back to the original derived class. In C#, this conversion requires a casting operator. In Visual Basic, it requires the `CType` operator if `Option Strict` is on. - -- Conversion from a type that implements an interface to an interface object that represents that interface. This conversion does not require a casting or conversion operator. - -- Conversion from an interface object back to the original type that implements that interface. In C#, this conversion requires a casting operator. In Visual Basic, it requires the `CType` operator if `Option Strict` is on. - -In addition to these automatic conversions, .NET provides several features that support custom type conversion. These include the following: - -- The `Implicit` operator, which defines the available widening conversions between types. For more information, see the [Implicit Conversion with the Implicit Operator](#implicit-conversion-with-the-implicit-operator) section. - -- The `Explicit` operator, which defines the available narrowing conversions between types. For more information, see the [Explicit Conversion with the Explicit Operator](#explicit-conversion-with-the-explicit-operator) section. - -- The interface, which defines conversions to each of the base .NET data types. For more information, see [The IConvertible Interface](#the-iconvertible-interface) section. - -- The class, which provides a set of methods that implement the methods in the interface. For more information, see [The Convert Class](#the-convert-class) section. - -- The class, which is a base class that can be extended to support the conversion of a specified type to any other type. For more information, see [The TypeConverter Class](#the-typeconverter-class) section. +Every value has an associated type, which defines attributes such as the amount of space allocated to the value, the range of possible values it can have, and the members that it makes available. Many values can be expressed as more than one type. For example, the value 4 can be expressed as an integer or a floating-point value. Type conversion creates a value in a new type that is equivalent to the value of an old type, but does not necessarily preserve the identity (or exact value) of the original object. + +.NET automatically supports the following conversions: + +- Conversion from a derived class to a base class. This means, for example, that an instance of any class or structure can be converted to an instance. This conversion does not require a casting or conversion operator. + +- Conversion from a base class back to the original derived class. In C#, this conversion requires a casting operator. In Visual Basic, it requires the `CType` operator if `Option Strict` is on. + +- Conversion from a type that implements an interface to an interface object that represents that interface. This conversion does not require a casting or conversion operator. + +- Conversion from an interface object back to the original type that implements that interface. In C#, this conversion requires a casting operator. In Visual Basic, it requires the `CType` operator if `Option Strict` is on. + +In addition to these automatic conversions, .NET provides several features that support custom type conversion. These include the following: + +- The `Implicit` operator, which defines the available widening conversions between types. For more information, see the [Implicit Conversion with the Implicit Operator](#implicit-conversion-with-the-implicit-operator) section. + +- The `Explicit` operator, which defines the available narrowing conversions between types. For more information, see the [Explicit Conversion with the Explicit Operator](#explicit-conversion-with-the-explicit-operator) section. + +- The interface, which defines conversions to each of the base .NET data types. For more information, see [The IConvertible Interface](#the-iconvertible-interface) section. + +- The class, which provides a set of methods that implement the methods in the interface. For more information, see [The Convert Class](#the-convert-class) section. + +- The class, which is a base class that can be extended to support the conversion of a specified type to any other type. For more information, see [The TypeConverter Class](#the-typeconverter-class) section. ## Implicit conversion with the implicit operator -Widening conversions involve the creation of a new value from the value of an existing type that has either a more restrictive range or a more restricted member list than the target type. Widening conversions cannot result in data loss (although they may result in a loss of precision). Because data cannot be lost, compilers can handle the conversion implicitly or transparently, without requiring the use of an explicit conversion method or a casting operator. - +Widening conversions involve the creation of a new value from the value of an existing type that has either a more restrictive range or a more restricted member list than the target type. Widening conversions cannot result in data loss (although they may result in a loss of precision). Because data cannot be lost, compilers can handle the conversion implicitly or transparently, without requiring the use of an explicit conversion method or a casting operator. + > [!NOTE] -> Although code that performs an implicit conversion can call a conversion method or use a casting operator, their use is not required by compilers that support implicit conversions. - - For example, the type supports implicit conversions from , , , , , , , , and values. The following example illustrates some of these implicit conversions in assigning values to a variable. - +> Although code that performs an implicit conversion can call a conversion method or use a casting operator, their use is not required by compilers that support implicit conversions. + + For example, the type supports implicit conversions from , , , , , , , , and values. The following example illustrates some of these implicit conversions in assigning values to a variable. + [!code-csharp[Conceptual.Conversion#1](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/implicit1.cs#1)] - [!code-vb[Conceptual.Conversion#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#1)] - - If a particular language compiler supports custom operators, you can also define implicit conversions in your own custom types. The following example provides a partial implementation of a signed byte data type named `ByteWithSign` that uses sign-and-magnitude representation. It supports implicit conversion of and values to `ByteWithSign` values. - + [!code-vb[Conceptual.Conversion#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#1)] + + If a particular language compiler supports custom operators, you can also define implicit conversions in your own custom types. The following example provides a partial implementation of a signed byte data type named `ByteWithSign` that uses sign-and-magnitude representation. It supports implicit conversion of and values to `ByteWithSign` values. + [!code-csharp[Conceptual.Conversion#2](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/implicit1.cs#2)] - [!code-vb[Conceptual.Conversion#2](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#2)] - - Client code can then declare a `ByteWithSign` variable and assign it and values without performing any explicit conversions or using any casting operators, as the following example shows. - + [!code-vb[Conceptual.Conversion#2](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#2)] + + Client code can then declare a `ByteWithSign` variable and assign it and values without performing any explicit conversions or using any casting operators, as the following example shows. + [!code-csharp[Conceptual.Conversion#3](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/implicit1.cs#3)] - [!code-vb[Conceptual.Conversion#3](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#3)] + [!code-vb[Conceptual.Conversion#3](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/implicit1.vb#3)] ## Explicit conversion with the explicit operator -Narrowing conversions involve the creation of a new value from the value of an existing type that has either a greater range or a larger member list than the target type. Because a narrowing conversion can result in a loss of data, compilers often require that the conversion be made explicit through a call to a conversion method or a casting operator. That is, the conversion must be handled explicitly in developer code. - +Narrowing conversions involve the creation of a new value from the value of an existing type that has either a greater range or a larger member list than the target type. Because a narrowing conversion can result in a loss of data, compilers often require that the conversion be made explicit through a call to a conversion method or a casting operator. That is, the conversion must be handled explicitly in developer code. + > [!NOTE] -> The major purpose of requiring a conversion method or casting operator for narrowing conversions is to make the developer aware of the possibility of data loss or an so that it can be handled in code. However, some compilers can relax this requirement. For example, in Visual Basic, if `Option Strict` is off (its default setting), the Visual Basic compiler tries to perform narrowing conversions implicitly. - - For example, the , , and data types have ranges that exceed that the data type, as the following table shows. - -|Type|Comparison with range of Int32| -|----------|------------------------------------| -|| is greater than , and is less than (has a greater negative range than) .| -|| is greater than .| -|| is greater than .| - - To handle such narrowing conversions, .NET allows types to define an `Explicit` operator. Individual language compilers can then implement this operator using their own syntax, or a member of the class can be called to perform the conversion. (For more information about the class, see [The Convert Class](#the-convert-class) later in this topic.) The following example illustrates the use of language features to handle the explicit conversion of these potentially out-of-range integer values to values. - +> The major purpose of requiring a conversion method or casting operator for narrowing conversions is to make the developer aware of the possibility of data loss or an so that it can be handled in code. However, some compilers can relax this requirement. For example, in Visual Basic, if `Option Strict` is off (its default setting), the Visual Basic compiler tries to perform narrowing conversions implicitly. + + For example, the , , and data types have ranges that exceed that the data type, as the following table shows. + +|Type|Comparison with range of Int32| +|----------|------------------------------------| +|| is greater than , and is less than (has a greater negative range than) .| +|| is greater than .| +|| is greater than .| + + To handle such narrowing conversions, .NET allows types to define an `Explicit` operator. Individual language compilers can then implement this operator using their own syntax, or a member of the class can be called to perform the conversion. (For more information about the class, see [The Convert Class](#the-convert-class) later in this topic.) The following example illustrates the use of language features to handle the explicit conversion of these potentially out-of-range integer values to values. + [!code-csharp[Conceptual.Conversion#4](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/explicit1.cs#4)] - [!code-vb[Conceptual.Conversion#4](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#4)] - - Explicit conversions can produce different results in different languages, and these results can differ from the value returned by the corresponding method. For example, if the value 12.63251 is converted to an , both the Visual Basic `CInt` method and the .NET method round the to return a value of 13, but the C# `(int)` operator truncates the to return a value of 12. Similarly, the C# `(int)` operator does not support Boolean-to-integer conversion, but the Visual Basic `CInt` method converts a value of `true` to -1. On the other hand, the method converts a value of `true` to 1. - - Most compilers allow explicit conversions to be performed in a checked or unchecked manner. When a checked conversion is performed, an is thrown when the value of the type to be converted is outside the range of the target type. When an unchecked conversion is performed under the same conditions, the conversion might not throw an exception, but the exact behavior becomes undefined and an incorrect value might result. - + [!code-vb[Conceptual.Conversion#4](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#4)] + + Explicit conversions can produce different results in different languages, and these results can differ from the value returned by the corresponding method. For example, if the value 12.63251 is converted to an , both the Visual Basic `CInt` method and the .NET method round the to return a value of 13, but the C# `(int)` operator truncates the to return a value of 12. Similarly, the C# `(int)` operator does not support Boolean-to-integer conversion, but the Visual Basic `CInt` method converts a value of `true` to -1. On the other hand, the method converts a value of `true` to 1. + + Most compilers allow explicit conversions to be performed in a checked or unchecked manner. When a checked conversion is performed, an is thrown when the value of the type to be converted is outside the range of the target type. When an unchecked conversion is performed under the same conditions, the conversion might not throw an exception, but the exact behavior becomes undefined and an incorrect value might result. + > [!NOTE] -> In C#, checked conversions can be performed by using the `checked` keyword together with a casting operator, or by specifying the `/checked+` compiler option. Conversely, unchecked conversions can be performed by using the `unchecked` keyword together with the casting operator, or by specifying the `/checked-` compiler option. By default, explicit conversions are unchecked. In Visual Basic, checked conversions can be performed by clearing the **Remove integer overflow checks** check box in the project's **Advanced Compiler Settings** dialog box, or by specifying the `/removeintchecks-` compiler option. Conversely, unchecked conversions can be performed by selecting the **Remove integer overflow checks** check box in the project's **Advanced Compiler Settings** dialog box or by specifying the `/removeintchecks+` compiler option. By default, explicit conversions are checked. - - The following C# example uses the `checked` and `unchecked` keywords to illustrate the difference in behavior when a value outside the range of a is converted to a . The checked conversion throws an exception, but the unchecked conversion assigns to the variable. - - [!code-csharp[Conceptual.Conversion#12](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/explicit1.cs#12)] - - If a particular language compiler supports custom overloaded operators, you can also define explicit conversions in your own custom types. The following example provides a partial implementation of a signed byte data type named `ByteWithSign` that uses sign-and-magnitude representation. It supports explicit conversion of and values to `ByteWithSign` values. - +> In C#, checked conversions can be performed by using the `checked` keyword together with a casting operator, or by specifying the `/checked+` compiler option. Conversely, unchecked conversions can be performed by using the `unchecked` keyword together with the casting operator, or by specifying the `/checked-` compiler option. By default, explicit conversions are unchecked. In Visual Basic, checked conversions can be performed by clearing the **Remove integer overflow checks** check box in the project's **Advanced Compiler Settings** dialog box, or by specifying the `/removeintchecks-` compiler option. Conversely, unchecked conversions can be performed by selecting the **Remove integer overflow checks** check box in the project's **Advanced Compiler Settings** dialog box or by specifying the `/removeintchecks+` compiler option. By default, explicit conversions are checked. + + The following C# example uses the `checked` and `unchecked` keywords to illustrate the difference in behavior when a value outside the range of a is converted to a . The checked conversion throws an exception, but the unchecked conversion assigns to the variable. + + [!code-csharp[Conceptual.Conversion#12](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/explicit1.cs#12)] + + If a particular language compiler supports custom overloaded operators, you can also define explicit conversions in your own custom types. The following example provides a partial implementation of a signed byte data type named `ByteWithSign` that uses sign-and-magnitude representation. It supports explicit conversion of and values to `ByteWithSign` values. + [!code-csharp[Conceptual.Conversion#5](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/explicit1.cs#5)] - [!code-vb[Conceptual.Conversion#5](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#5)] - - Client code can then declare a `ByteWithSign` variable and assign it and values if the assignments include a casting operator or a conversion method, as the following example shows. - + [!code-vb[Conceptual.Conversion#5](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#5)] + + Client code can then declare a `ByteWithSign` variable and assign it and values if the assignments include a casting operator or a conversion method, as the following example shows. + [!code-csharp[Conceptual.Conversion#6](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/explicit1.cs#6)] - [!code-vb[Conceptual.Conversion#6](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#6)] + [!code-vb[Conceptual.Conversion#6](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/explicit1.vb#6)] ## The IConvertible interface -To support the conversion of any type to a common language runtime base type, .NET provides the interface. The implementing type is required to provide the following: - -- A method that returns the of the implementing type. - -- Methods to convert the implementing type to each common language runtime base type (, , , , , and so on). - -- A generalized conversion method to convert an instance of the implementing type to another specified type. Conversions that are not supported should throw an . - - Each common language runtime base type (that is, the , , , , , , , , , , , , , , and ), as well as the and types, implement the interface. However, these are explicit interface implementations; the conversion method can be called only through an interface variable, as the following example shows. This example converts an value to its equivalent value. - +To support the conversion of any type to a common language runtime base type, .NET provides the interface. The implementing type is required to provide the following: + +- A method that returns the of the implementing type. + +- Methods to convert the implementing type to each common language runtime base type (, , , , , and so on). + +- A generalized conversion method to convert an instance of the implementing type to another specified type. Conversions that are not supported should throw an . + + Each common language runtime base type (that is, the , , , , , , , , , , , , , , and ), as well as the and types, implement the interface. However, these are explicit interface implementations; the conversion method can be called only through an interface variable, as the following example shows. This example converts an value to its equivalent value. + [!code-csharp[Conceptual.Conversion#7](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/iconvertible1.cs#7)] - [!code-vb[Conceptual.Conversion#7](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible1.vb#7)] - - The requirement to call the conversion method on its interface rather than on the implementing type makes explicit interface implementations relatively expensive. Instead, we recommend that you call the appropriate member of the class to convert between common language runtime base types. For more information, see the next section, [The Convert Class](#the-convert-class). - + [!code-vb[Conceptual.Conversion#7](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible1.vb#7)] + + The requirement to call the conversion method on its interface rather than on the implementing type makes explicit interface implementations relatively expensive. Instead, we recommend that you call the appropriate member of the class to convert between common language runtime base types. For more information, see the next section, [The Convert Class](#the-convert-class). + > [!NOTE] -> In addition to the interface and the class provided by .NET, individual languages may also provide ways to perform conversions. For example, C# uses casting operators; Visual Basic uses compiler-implemented conversion functions such as `CType`, `CInt`, and `DirectCast`. - +> In addition to the interface and the class provided by .NET, individual languages may also provide ways to perform conversions. For example, C# uses casting operators; Visual Basic uses compiler-implemented conversion functions such as `CType`, `CInt`, and `DirectCast`. + For the most part, the interface is designed to support conversion between the base types in .NET. However, the interface can also be implemented by a custom type to support conversion of that type to other custom types. For more information, see the section [Custom Conversions with the ChangeType Method](#custom-conversions-with-the-changetype-method) later in this topic. ## The Convert class -Although each base type's interface implementation can be called to perform a type conversion, calling the methods of the class is the recommended language-neutral way to convert from one base type to another. In addition, the method can be used to convert from a specified custom type to another type. - +Although each base type's interface implementation can be called to perform a type conversion, calling the methods of the class is the recommended language-neutral way to convert from one base type to another. In addition, the method can be used to convert from a specified custom type to another type. + ### Conversions between base types -The class provides a language-neutral way to perform conversions between base types and is available to all languages that target the common language runtime. It provides a complete set of methods for both widening and narrowing conversions, and throws an for conversions that are not supported (such as the conversion of a value to an integer value). Narrowing conversions are performed in a checked context, and an is thrown if the conversion fails. - +The class provides a language-neutral way to perform conversions between base types and is available to all languages that target the common language runtime. It provides a complete set of methods for both widening and narrowing conversions, and throws an for conversions that are not supported (such as the conversion of a value to an integer value). Narrowing conversions are performed in a checked context, and an is thrown if the conversion fails. + > [!IMPORTANT] -> Because the class includes methods to convert to and from each base type, it eliminates the need to call each base type's explicit interface implementation. - - The following example illustrates the use of the class to perform several widening and narrowing conversions between .NET base types. - +> Because the class includes methods to convert to and from each base type, it eliminates the need to call each base type's explicit interface implementation. + + The following example illustrates the use of the class to perform several widening and narrowing conversions between .NET base types. + [!code-csharp[Conceptual.Conversion#8](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/convert1.cs#8)] - [!code-vb[Conceptual.Conversion#8](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/convert1.vb#8)] - - In some cases, particularly when converting to and from floating-point values, a conversion may involve a loss of precision, even though it does not throw an . The following example illustrates this loss of precision. In the first case, a value has less precision (fewer significant digits) when it is converted to a . In the second case, a value is rounded from 42.72 to 43 in order to complete the conversion. - + [!code-vb[Conceptual.Conversion#8](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/convert1.vb#8)] + + In some cases, particularly when converting to and from floating-point values, a conversion may involve a loss of precision, even though it does not throw an . The following example illustrates this loss of precision. In the first case, a value has less precision (fewer significant digits) when it is converted to a . In the second case, a value is rounded from 42.72 to 43 in order to complete the conversion. + [!code-csharp[Conceptual.Conversion#9](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/convert1.cs#9)] - [!code-vb[Conceptual.Conversion#9](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/convert1.vb#9)] - - For a table that lists both the widening and narrowing conversions supported by the class, see [Type Conversion Tables](conversion-tables.md). + [!code-vb[Conceptual.Conversion#9](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/convert1.vb#9)] + + For a table that lists both the widening and narrowing conversions supported by the class, see [Type Conversion Tables](conversion-tables.md). ### Custom conversions with the ChangeType method -In addition to supporting conversions to each of the base types, the class can be used to convert a custom type to one or more predefined types. This conversion is performed by the method, which in turn wraps a call to the method of the `value` parameter. This means that the object represented by the `value` parameter must provide an implementation of the interface. - +In addition to supporting conversions to each of the base types, the class can be used to convert a custom type to one or more predefined types. This conversion is performed by the method, which in turn wraps a call to the method of the `value` parameter. This means that the object represented by the `value` parameter must provide an implementation of the interface. + > [!NOTE] -> Because the and methods use a object to specify the target type to which `value` is converted, they can be used to perform a dynamic conversion to an object whose type is not known at compile time. However, note that the implementation of `value` must still support this conversion. - - The following example illustrates a possible implementation of the interface that allows a `TemperatureCelsius` object to be converted to a `TemperatureFahrenheit` object and vice versa. The example defines a base class, `Temperature`, that implements the interface and overrides the method. The derived `TemperatureCelsius` and `TemperatureFahrenheit` classes each override the `ToType` and the `ToString` methods of the base class. - +> Because the and methods use a object to specify the target type to which `value` is converted, they can be used to perform a dynamic conversion to an object whose type is not known at compile time. However, note that the implementation of `value` must still support this conversion. + + The following example illustrates a possible implementation of the interface that allows a `TemperatureCelsius` object to be converted to a `TemperatureFahrenheit` object and vice versa. The example defines a base class, `Temperature`, that implements the interface and overrides the method. The derived `TemperatureCelsius` and `TemperatureFahrenheit` classes each override the `ToType` and the `ToString` methods of the base class. + [!code-csharp[Conceptual.Conversion#10](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/iconvertible2.cs#10)] - [!code-vb[Conceptual.Conversion#10](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible2.vb#10)] - - The following example illustrates several calls to these implementations to convert `TemperatureCelsius` objects to `TemperatureFahrenheit` objects and vice versa. - + [!code-vb[Conceptual.Conversion#10](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible2.vb#10)] + + The following example illustrates several calls to these implementations to convert `TemperatureCelsius` objects to `TemperatureFahrenheit` objects and vice versa. + [!code-csharp[Conceptual.Conversion#11](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.conversion/cs/iconvertible2.cs#11)] - [!code-vb[Conceptual.Conversion#11](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible2.vb#11)] + [!code-vb[Conceptual.Conversion#11](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.conversion/vb/iconvertible2.vb#11)] ## The TypeConverter class -.NET also allows you to define a type converter for a custom type by extending the class and associating the type converter with the type through a attribute. The following table highlights the differences between this approach and implementing the interface for a custom type. - +.NET also allows you to define a type converter for a custom type by extending the class and associating the type converter with the type through a attribute. The following table highlights the differences between this approach and implementing the interface for a custom type. + > [!NOTE] -> Design-time support can be provided for a custom type only if it has a type converter defined for it. - -|Conversion using TypeConverter|Conversion using IConvertible| -|------------------------------------|-----------------------------------| -|Is implemented for a custom type by deriving a separate class from . This derived class is associated with the custom type by applying a attribute.|Is implemented by a custom type to perform conversion. A user of the type invokes an conversion method on the type.| -|Can be used both at design time and at run time.|Can be used only at run time.| -|Uses reflection; therefore, is slower than conversion enabled by .|Does not use reflection.| -|Allows two-way type conversions from the custom type to other data types, and from other data types to the custom type. For example, a defined for `MyType` allows conversions from `MyType` to , and from to `MyType`.|Allows conversion from a custom type to other data types, but not from other data types to the custom type.| - - For more information about using type converters to perform conversions, see . - +> Design-time support can be provided for a custom type only if it has a type converter defined for it. + +|Conversion using TypeConverter|Conversion using IConvertible| +|------------------------------------|-----------------------------------| +|Is implemented for a custom type by deriving a separate class from . This derived class is associated with the custom type by applying a attribute.|Is implemented by a custom type to perform conversion. A user of the type invokes an conversion method on the type.| +|Can be used both at design time and at runtime.|Can be used only at runtime.| +|Uses reflection; therefore, is slower than conversion enabled by .|Does not use reflection.| +|Allows two-way type conversions from the custom type to other data types, and from other data types to the custom type. For example, a defined for `MyType` allows conversions from `MyType` to , and from to `MyType`.|Allows conversion from a custom type to other data types, but not from other data types to the custom type.| + + For more information about using type converters to perform conversions, see . + ## See also - diff --git a/docs/standard/clr.md b/docs/standard/clr.md index b1948b3380f71..baea559dcc2bc 100644 --- a/docs/standard/clr.md +++ b/docs/standard/clr.md @@ -1,10 +1,10 @@ --- title: "Common Language Runtime (CLR) overview - .NET" titleSuffix: "" -description: Get started with common language runtime (CLR), .NET's run-time environment. The CLR runs code and provides services to make the development process easier. +description: Get started with common language runtime (CLR), .NET's runtime environment. The CLR runs code and provides services to make the development process easier. ms.date: 10/21/2025 ms.custom: devdivchpfy22 -helpviewer_keywords: +helpviewer_keywords: - "compiling source code, runtime functionality" - "code, execution" - "managed data" @@ -21,14 +21,14 @@ ai-usage: ai-assisted --- # Common Language Runtime (CLR) overview -.NET provides a run-time environment called the common language runtime that runs the code and provides services that make the development process easier. +.NET provides a runtime environment called the common language runtime that runs the code and provides services that make the development process easier. Compilers and tools expose the common language runtime's functionality and enable you to write code that benefits from the managed execution environment. Code that you develop with a language compiler that targets the runtime is called managed code. Managed code benefits from features such as cross-language integration, cross-language exception handling, enhanced security, versioning and deployment support, a simplified model for component interaction, and debugging and profiling services. > [!NOTE] -> Compilers and tools can produce output that the common language runtime can consume because the type system, the format of metadata, and the run-time environment (the virtual execution system) are all defined by a public standard, the ECMA Common Language Infrastructure specification. For more information, see [ECMA C# and Common Language Infrastructure Specifications](../fundamentals/standards.md). +> Compilers and tools can produce output that the common language runtime can consume because the type system, the format of metadata, and the runtime environment (the virtual execution system) are all defined by a public standard, the ECMA Common Language Infrastructure specification. For more information, see [ECMA C# and Common Language Infrastructure Specifications](../fundamentals/standards.md). -To enable the runtime to provide services to managed code, language compilers must emit metadata that describes the types, members, and references in your code. Metadata is stored with the code; every loadable common language runtime portable executable (PE) file contains metadata. The runtime uses metadata to locate and load classes, lay out instances in memory, resolve method invocations, generate native code, enforce security, and set run-time context boundaries. +To enable the runtime to provide services to managed code, language compilers must emit metadata that describes the types, members, and references in your code. Metadata is stored with the code; every loadable common language runtime portable executable (PE) file contains metadata. The runtime uses metadata to locate and load classes, lay out instances in memory, resolve method invocations, generate native code, enforce security, and set runtime context boundaries. The runtime automatically handles object layout and manages references to objects, releasing them when they're no longer being used. Objects whose lifetimes are managed this way are called managed data. Garbage collection eliminates memory leaks and some other common programming errors. If your code is managed, you can use managed data, unmanaged data, or both in your .NET application. Because language compilers supply their own types, such as primitive types, you might not always know or need to know whether your data is being managed. diff --git a/docs/standard/commandline/migration-guide-2.0.0-beta5.md b/docs/standard/commandline/migration-guide-2.0.0-beta5.md index 334d2e9da2709..9eb6ba6e49191 100644 --- a/docs/standard/commandline/migration-guide-2.0.0-beta5.md +++ b/docs/standard/commandline/migration-guide-2.0.0-beta5.md @@ -98,7 +98,7 @@ Option beta5 = new("--help", "-h", "/h") ## Default values and custom parsing -In 2.0.0-beta4, you could set default values for options and arguments by using the `SetDefaultValue` methods. Those methods accepted an `object` value, which wasn't type safe and could lead to run-time errors if the value wasn't compatible with the option or argument type: +In 2.0.0-beta4, you could set default values for options and arguments by using the `SetDefaultValue` methods. Those methods accepted an `object` value, which wasn't type safe and could lead to runtime errors if the value wasn't compatible with the option or argument type: ```csharp Option option = new("--number"); diff --git a/docs/standard/data/sqlite/extensions.md b/docs/standard/data/sqlite/extensions.md index d19b879f7937e..e039a5c4cba37 100644 --- a/docs/standard/data/sqlite/extensions.md +++ b/docs/standard/data/sqlite/extensions.md @@ -5,7 +5,7 @@ description: Learn how to load SQLite extensions. --- # Extensions -SQLite supports loading extensions at run time. Extensions include things like additional SQL functions, collations, virtual tables, and more. +SQLite supports loading extensions at runtime. Extensions include things like additional SQL functions, collations, virtual tables, and more. .NET includes additional logic for locating native libraries in additional places like referenced NuGet packages. Unfortunately, SQLite can't leverage this logic; it calls the platform API directly to load libraries. Because of this, you may need to modify the `PATH`, `LD_LIBRARY_PATH`, or `DYLD_LIBRARY_PATH` environment variables before loading SQLite extensions. There's [a sample](https://github.com/dotnet/docs/blob/main/samples/snippets/standard/data/sqlite/ExtensionsSample/Program.cs) on GitHub that demonstrates finding binaries for the current runtime inside a referenced NuGet package. diff --git a/docs/standard/data/xml/script-blocks-using-msxsl-script.md b/docs/standard/data/xml/script-blocks-using-msxsl-script.md index 37a862edff588..9ffa8834eac27 100644 --- a/docs/standard/data/xml/script-blocks-using-msxsl-script.md +++ b/docs/standard/data/xml/script-blocks-using-msxsl-script.md @@ -12,14 +12,14 @@ ms.assetid: fde6f43f-c594-486f-abcb-2211197fae20 > [!NOTE] > Script blocks are supported only in .NET Framework. They are _not_ supported on .NET Core or .NET 5 or later. -The class supports embedded scripts using the `msxsl:script` element. When the style sheet is loaded, any defined functions are compiled to common intermediate language (CIL) by the Code Document Object Model (CodeDOM) and are executed during run time. The assembly generated from the embedded script block is separate than the assembly generated for the style sheet. +The class supports embedded scripts using the `msxsl:script` element. When the style sheet is loaded, any defined functions are compiled to common intermediate language (CIL) by the Code Document Object Model (CodeDOM) and are executed during runtime. The assembly generated from the embedded script block is separate than the assembly generated for the style sheet. ## Enable XSLT script Support for embedded scripts is an optional XSLT setting on the class. Script support is disabled by default. To enable script support, create an object with the property set to `true` and pass the object to the method. > [!WARNING] -> Starting in .NET 10, the property is marked as obsolete and generates warning SYSLIB0062. Since script blocks aren't supported on .NET Core or .NET 5+, this property has no effect and setting it to `true` throws a at run time. +> Starting in .NET 10, the property is marked as obsolete and generates warning SYSLIB0062. Since script blocks aren't supported on .NET Core or .NET 5+, this property has no effect and setting it to `true` throws a at runtime. > [!NOTE] > XSLT scripting should be enabled only if you require script support and you are working in a fully trusted environment. diff --git a/docs/standard/data/xml/user-defined-functions-and-variables.md b/docs/standard/data/xml/user-defined-functions-and-variables.md index 84f27f82ee459..a08a11f474413 100644 --- a/docs/standard/data/xml/user-defined-functions-and-variables.md +++ b/docs/standard/data/xml/user-defined-functions-and-variables.md @@ -2,45 +2,45 @@ description: "Learn more about: User Defined Functions and Variables" title: "User Defined Functions and Variables" ms.date: "03/30/2017" -dev_langs: +dev_langs: - "csharp" - "vb" ms.assetid: 4772f20e-1e7f-496e-93c2-1484473be555 --- # User Defined Functions and Variables -The class provides a set of methods that are used to interact with data. You can supplement the standard XPath functions by implementing extension functions and variables for use by XPath query expressions. The method can accept a user defined context derived from . User defined functions are resolved by the custom context. - - Extension functions and variables can be useful in prevention of XML injection attacks. In these scenarios user input is assigned to custom variables and processed by extension functions, not as raw input concatenated with processing instructions. Extension functions and variables contain user input so that it only acts on XML data as intended by the designer. - - To use extensions you implement a custom class along with the interfaces and that support extension functions and variables. An adds user input with its to the custom . - - The represents a compiled query that uses to find and process the nodes identified by the expression. - - The following example shows implementation of a custom context class derived from . Comments in the code describe class members and their use in custom functions. Function and variable implementations and a sample application that uses these implementations follow this code segment. - +The class provides a set of methods that are used to interact with data. You can supplement the standard XPath functions by implementing extension functions and variables for use by XPath query expressions. The method can accept a user defined context derived from . User defined functions are resolved by the custom context. + + Extension functions and variables can be useful in prevention of XML injection attacks. In these scenarios user input is assigned to custom variables and processed by extension functions, not as raw input concatenated with processing instructions. Extension functions and variables contain user input so that it only acts on XML data as intended by the designer. + + To use extensions you implement a custom class along with the interfaces and that support extension functions and variables. An adds user input with its to the custom . + + The represents a compiled query that uses to find and process the nodes identified by the expression. + + The following example shows implementation of a custom context class derived from . Comments in the code describe class members and their use in custom functions. Function and variable implementations and a sample application that uses these implementations follow this code segment. + [!code-csharp[XPathExtensionFunctions#2](../../../../samples/snippets/csharp/VS_Snippets_Data/xpathextensionfunctions/cs/xpathextensionfunctions.cs#2)] - [!code-vb[XPathExtensionFunctions#2](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#2)] - - The following code implements . The class that implements resolves and executes user-defined functions. This example uses the function identified by the declaration: `private int CountChar(string title, char charToCount)`. - - Code comments describe class members. - + [!code-vb[XPathExtensionFunctions#2](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#2)] + + The following code implements . The class that implements resolves and executes user-defined functions. This example uses the function identified by the declaration: `private int CountChar(string title, char charToCount)`. + + Code comments describe class members. + [!code-csharp[XPathExtensionFunctions#3](../../../../samples/snippets/csharp/VS_Snippets_Data/xpathextensionfunctions/cs/xpathextensionfunctions.cs#3)] - [!code-vb[XPathExtensionFunctions#3](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#3)] - - The following code implements . This class resolves references to user-defined variables in XPath query expressions at run time. An instance of this class is created and returned by the overridden method of the custom class. - - Code comments describe the class members. - + [!code-vb[XPathExtensionFunctions#3](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#3)] + + The following code implements . This class resolves references to user-defined variables in XPath query expressions at runtime. An instance of this class is created and returned by the overridden method of the custom class. + + Code comments describe the class members. + [!code-csharp[XPathExtensionFunctions#4](../../../../samples/snippets/csharp/VS_Snippets_Data/xpathextensionfunctions/cs/xpathextensionfunctions.cs#4)] - [!code-vb[XPathExtensionFunctions#4](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#4)] - - With the previous class definitions in scope, the following code uses the custom function to count characters in the elements of the `Tasks.xml` document. Comments in the code describe the code that compiles the custom function and runs it against the `Tasks.xml` document. - + [!code-vb[XPathExtensionFunctions#4](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#4)] + + With the previous class definitions in scope, the following code uses the custom function to count characters in the elements of the `Tasks.xml` document. Comments in the code describe the code that compiles the custom function and runs it against the `Tasks.xml` document. + [!code-csharp[XPathExtensionFunctions#1](../../../../samples/snippets/csharp/VS_Snippets_Data/xpathextensionfunctions/cs/xpathextensionfunctions.cs#1)] - [!code-vb[XPathExtensionFunctions#1](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#1)] - - This example uses the following XML data. - + [!code-vb[XPathExtensionFunctions#1](../../../../samples/snippets/visualbasic/VS_Snippets_Data/xpathextensionfunctions/vb/xpathextensionfunctions.vb#1)] + + This example uses the following XML data. + [!code-xml[XPathExtensionFunctions#5](../../../../samples/snippets/xml/VS_Snippets_Data/xpathextensionfunctions/XML/tasks.xml#5)] diff --git a/docs/standard/design-guidelines/attributes.md b/docs/standard/design-guidelines/attributes.md index 58a5fe5e6dd00..1f59d9766d42a 100644 --- a/docs/standard/design-guidelines/attributes.md +++ b/docs/standard/design-guidelines/attributes.md @@ -13,7 +13,7 @@ ms.assetid: ee0038ef-b247-4747-a650-3c5c5cd58d8b is a base class used to define custom attributes. - Attributes are annotations that can be added to programming elements such as assemblies, types, members, and parameters. They are stored in the metadata of the assembly and can be accessed at run time using the reflection APIs. For example, the Framework defines the , which can be applied to a type or a member to indicate that the type or member has been deprecated. + Attributes are annotations that can be added to programming elements such as assemblies, types, members, and parameters. They are stored in the metadata of the assembly and can be accessed at runtime using the reflection APIs. For example, the Framework defines the , which can be applied to a type or a member to indicate that the type or member has been deprecated. Attributes can have one or more properties that carry additional data related to the attribute. For example, `ObsoleteAttribute` could carry additional information about the release in which a type or a member got deprecated and the description of the new APIs replacing the obsolete API. diff --git a/docs/standard/design-guidelines/events-and-callbacks.md b/docs/standard/design-guidelines/events-and-callbacks.md index 12c365827f27b..9e2e361e2ddd7 100644 --- a/docs/standard/design-guidelines/events-and-callbacks.md +++ b/docs/standard/design-guidelines/events-and-callbacks.md @@ -27,7 +27,7 @@ Callbacks are extensibility points that allow a framework to call back into user ✔️ DO use the new `Func<...>`, `Action<...>`, or `Expression<...>` types instead of custom delegates, when defining APIs with callbacks. - `Func<...>` and `Action<...>` represent generic delegates. `Expression<...>` represents function definitions that can be compiled and subsequently invoked at run time but can also be serialized and passed to remote processes. + `Func<...>` and `Action<...>` represent generic delegates. `Expression<...>` represents function definitions that can be compiled and subsequently invoked at runtime but can also be serialized and passed to remote processes. ✔️ DO measure and understand performance implications of using `Expression<...>`, instead of using `Func<...>` and `Action<...>` delegates. diff --git a/docs/standard/design-guidelines/extension-methods.md b/docs/standard/design-guidelines/extension-methods.md index c37995e61e045..e3bfc54e18113 100644 --- a/docs/standard/design-guidelines/extension-methods.md +++ b/docs/standard/design-guidelines/extension-methods.md @@ -24,7 +24,7 @@ Extension methods are a language feature that allows static methods to be called ❌ AVOID defining extension methods on . - VB users will not be able to call such methods on object references using the extension method syntax. VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at run time), while bindings to extension methods are determined at compile-time (early bound). + VB users will not be able to call such methods on object references using the extension method syntax. VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound). Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported. diff --git a/docs/standard/design-guidelines/virtual-members.md b/docs/standard/design-guidelines/virtual-members.md index 8d75ba3f701f6..8a976ba28ddba 100644 --- a/docs/standard/design-guidelines/virtual-members.md +++ b/docs/standard/design-guidelines/virtual-members.md @@ -16,7 +16,7 @@ Virtual members can be overridden, thus changing the behavior of the subclass. T Virtual members perform better than callbacks and events, but do not perform better than non-virtual methods. - The main disadvantage of virtual members is that the behavior of a virtual member can only be modified at the time of compilation. The behavior of a callback can be modified at run time. + The main disadvantage of virtual members is that the behavior of a virtual member can only be modified at the time of compilation. The behavior of a callback can be modified at runtime. Virtual members, like callbacks (and maybe more than callbacks), are costly to design, test, and maintain because any call to a virtual member can be overridden in unpredictable ways and can execute arbitrary code. Also, much more effort is usually required to clearly define the contract of virtual members, so the cost of designing and documenting them is higher. diff --git a/docs/standard/events/index.md b/docs/standard/events/index.md index 7d31120ede1ef..dd763be6dc2b5 100644 --- a/docs/standard/events/index.md +++ b/docs/standard/events/index.md @@ -4,10 +4,10 @@ description: Learn to handle and raise .NET events, which are based on the deleg ms.date: 03/17/2025 ms.topic: concept-article ms.custom: devdivchpfy22 -dev_langs: +dev_langs: - "csharp" - "vb" -helpviewer_keywords: +helpviewer_keywords: - "delegate model for events" - "application development [.NET], events" - "application development [.NET], events" @@ -22,72 +22,72 @@ ms.assetid: b6f65241-e0ad-4590-a99f-200ce741bb1f # Handle and raise events Events in .NET are based on the delegate model. The delegate model follows the [observer design pattern](observer-design-pattern.md), which enables a subscriber to register with and receive notifications from a provider. An event sender pushes a notification when an event occurs. An event receiver defines the response. This article describes the major components of the delegate model, how to consume events in applications, and how to implement events in your code. - + ## Raise events with an event sender -An event is a message sent by an object to signal the occurrence of an action. The action might be user interaction, such as a button press, or it might result from other program logic, such as a property value change. The object that raises the event is called the *event sender*. The event sender doesn't know the object or method that receives (handles) the events it raises. The event is typically a member of the event sender. For example, the event is a member of the class, and the event is a member of the class that implements the interface. - -To define an event, you use the C# [event](../../csharp/language-reference/keywords/event.md) or the Visual Basic [Event](../../visual-basic/language-reference/statements/event-statement.md) keyword in the signature of your event class, and specify the type of delegate for the event. Delegates are described in the next section. - -Typically, to raise an event, you add a method that is marked as `protected` and `virtual` (in C#) or `Protected` and `Overridable` (in Visual Basic). The naming convention for the method is `On`, such as `OnDataReceived`. The method should take one parameter that specifies an event data object, which is an object of type or a derived type. You provide this method to enable derived classes to override the logic for raising the event. A derived class should always call the `On` method of the base class to ensure registered delegates receive the event. +An event is a message sent by an object to signal the occurrence of an action. The action might be user interaction, such as a button press, or it might result from other program logic, such as a property value change. The object that raises the event is called the *event sender*. The event sender doesn't know the object or method that receives (handles) the events it raises. The event is typically a member of the event sender. For example, the event is a member of the class, and the event is a member of the class that implements the interface. + +To define an event, you use the C# [event](../../csharp/language-reference/keywords/event.md) or the Visual Basic [Event](../../visual-basic/language-reference/statements/event-statement.md) keyword in the signature of your event class, and specify the type of delegate for the event. Delegates are described in the next section. + +Typically, to raise an event, you add a method that is marked as `protected` and `virtual` (in C#) or `Protected` and `Overridable` (in Visual Basic). The naming convention for the method is `On`, such as `OnDataReceived`. The method should take one parameter that specifies an event data object, which is an object of type or a derived type. You provide this method to enable derived classes to override the logic for raising the event. A derived class should always call the `On` method of the base class to ensure registered delegates receive the event. The following example shows how to declare an event named `ThresholdReached`. The event is associated with the delegate and raised in a method named `OnThresholdReached`: - + [!code-csharp[EventsOverview#1](~/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programtruncated.cs#1)] -[!code-vb[EventsOverview#1](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#1)] - +[!code-vb[EventsOverview#1](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#1)] + ## Declare delegate signatures for event handlers -A delegate is a type that holds a reference to a method. A delegate is declared with a signature that shows the return type and parameters for the methods it references. It can hold references only to methods that match its signature. A delegate is equivalent to a type-safe function pointer or a callback. A delegate declaration is sufficient to define a delegate class. - -Delegates have many uses in .NET. In the context of events, a delegate is an intermediary (or pointer-like mechanism) between the event source and the code that handles the event. You associate a delegate with an event by including the delegate type in the event declaration, as shown in the example in the previous section. For more information about delegates, see the class. - -.NET provides the and delegates to support most event scenarios. Use the delegate for all events that don't include event data. Use the delegate for events that include data about the event. These delegates have no return type value and take two parameters (an object for the source of the event and an object for event data). - -Delegates are [multicast](xref:System.MulticastDelegate) class objects, which means they can hold references to more than one event-handling method. For more information, see the reference page. Delegates provide flexibility and fine-grained control in event handling. A delegate acts as an event dispatcher for the class that raises the event by maintaining a list of registered event handlers for the event. - -Use the and delegate types to define the needed delegate. You mark a delegate with the `delegate` type in [C#](../../csharp/language-reference/builtin-types/reference-types.md#the-delegate-type) or the `Delegate` type in [Visual Basic](../../visual-basic/language-reference/statements/delegate-statement.md) in the declaration. The following example shows how to declare a delegate named `ThresholdReachedEventHandler`: - +A delegate is a type that holds a reference to a method. A delegate is declared with a signature that shows the return type and parameters for the methods it references. It can hold references only to methods that match its signature. A delegate is equivalent to a type-safe function pointer or a callback. A delegate declaration is sufficient to define a delegate class. + +Delegates have many uses in .NET. In the context of events, a delegate is an intermediary (or pointer-like mechanism) between the event source and the code that handles the event. You associate a delegate with an event by including the delegate type in the event declaration, as shown in the example in the previous section. For more information about delegates, see the class. + +.NET provides the and delegates to support most event scenarios. Use the delegate for all events that don't include event data. Use the delegate for events that include data about the event. These delegates have no return type value and take two parameters (an object for the source of the event and an object for event data). + +Delegates are [multicast](xref:System.MulticastDelegate) class objects, which means they can hold references to more than one event-handling method. For more information, see the reference page. Delegates provide flexibility and fine-grained control in event handling. A delegate acts as an event dispatcher for the class that raises the event by maintaining a list of registered event handlers for the event. + +Use the and delegate types to define the needed delegate. You mark a delegate with the `delegate` type in [C#](../../csharp/language-reference/builtin-types/reference-types.md#the-delegate-type) or the `Delegate` type in [Visual Basic](../../visual-basic/language-reference/statements/delegate-statement.md) in the declaration. The following example shows how to declare a delegate named `ThresholdReachedEventHandler`: + [!code-csharp[EventsOverview#4](~/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programtruncated.cs#4)] -[!code-vb[EventsOverview#4](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#4)] - +[!code-vb[EventsOverview#4](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#4)] + ## Work with event data classes -Data associated with an event can be provided through an event data class. .NET provides many event data classes that you can use in your applications. For example, the class is the event data class for the event. .NET follows a naming pattern where all event data classes end with the `EventArgs` suffix. You determine which event data class is associated with an event by looking at the delegate for the event. For example, the delegate includes the class as a parameter. - -The class is typically the base type for event data classes. You also use this class if an event doesn't have any data associated with it. When you create an event that notifies subscribers that something happened without any additional data, include the class as the second parameter in the delegate. You can pass the value when no data is provided. The delegate includes the class as a parameter. - -You can create a class that derives from the class to provide any members needed to pass data related to the event. Typically, you should use the same naming pattern as .NET and end your event data class name with the `EventArgs` suffix. - +Data associated with an event can be provided through an event data class. .NET provides many event data classes that you can use in your applications. For example, the class is the event data class for the event. .NET follows a naming pattern where all event data classes end with the `EventArgs` suffix. You determine which event data class is associated with an event by looking at the delegate for the event. For example, the delegate includes the class as a parameter. + +The class is typically the base type for event data classes. You also use this class if an event doesn't have any data associated with it. When you create an event that notifies subscribers that something happened without any additional data, include the class as the second parameter in the delegate. You can pass the value when no data is provided. The delegate includes the class as a parameter. + +You can create a class that derives from the class to provide any members needed to pass data related to the event. Typically, you should use the same naming pattern as .NET and end your event data class name with the `EventArgs` suffix. + The following example shows an event data class named `ThresholdReachedEventArgs` that contains properties that are specific to the event being raised: - + [!code-csharp[EventsOverview#3](~/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programtruncated.cs#3)] -[!code-vb[EventsOverview#3](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#3)] - +[!code-vb[EventsOverview#3](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#3)] + ## Respond to events with handlers -To respond to an event, you define an event handler method in the event receiver. This method must match the signature of the delegate for the event you're handling. In the event handler, you perform the actions that are required when the event is raised, such as collecting user input after the user presses a button. To receive notifications when the event occurs, your event handler method must subscribe to the event. - +To respond to an event, you define an event handler method in the event receiver. This method must match the signature of the delegate for the event you're handling. In the event handler, you perform the actions that are required when the event is raised, such as collecting user input after the user presses a button. To receive notifications when the event occurs, your event handler method must subscribe to the event. + The following example shows an event handler method named `c_ThresholdReached` that matches the signature for the delegate. The method subscribes to the `ThresholdReached` event: - + [!code-csharp[EventsOverview#2](~/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programtruncated.cs#2)] -[!code-vb[EventsOverview#2](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#2)] +[!code-vb[EventsOverview#2](~/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1truncated.vb#2)] + +## Use static and dynamic event handlers -## Use static and dynamic event handlers +.NET allows subscribers to register for event notifications either statically or dynamically. Static event handlers are in effect for the entire life of the class whose events they handle. Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. You can use dynamic handlers when event notifications are needed only under certain conditions, or when runtime conditions determine the specific handler to call. The example in the previous section shows how to dynamically add an event handler. For more information, see [Events](../../visual-basic/programming-guide/language-features/events/index.md) (in Visual Basic) and [Events](../../csharp/programming-guide/events/index.md) (in C#). -.NET allows subscribers to register for event notifications either statically or dynamically. Static event handlers are in effect for the entire life of the class whose events they handle. Dynamic event handlers are explicitly activated and deactivated during program execution, usually in response to some conditional program logic. You can use dynamic handlers when event notifications are needed only under certain conditions, or when run-time conditions determine the specific handler to call. The example in the previous section shows how to dynamically add an event handler. For more information, see [Events](../../visual-basic/programming-guide/language-features/events/index.md) (in Visual Basic) and [Events](../../csharp/programming-guide/events/index.md) (in C#). - ## Raise multiple events -If your class raises multiple events, the compiler generates one field per event delegate instance. If the number of events is large, the storage cost of one field per delegate might not be acceptable. For these scenarios, .NET provides event properties that you can use with another data structure of your choice to store event delegates. - +If your class raises multiple events, the compiler generates one field per event delegate instance. If the number of events is large, the storage cost of one field per delegate might not be acceptable. For these scenarios, .NET provides event properties that you can use with another data structure of your choice to store event delegates. + Event properties consist of event declarations accompanied by event accessors. Event accessors are methods that you define to add or remove event delegate instances from the storage data structure. > [!NOTE] > The event properties are slower than the event fields because each event delegate must be retrieved before it can be invoked. -The trade-off is between memory and speed. If your class defines many events that are infrequently raised, you should implement event properties. For more information, see [Handle multiple events by using event properties](how-to-handle-multiple-events-using-event-properties.md). - +The trade-off is between memory and speed. If your class defines many events that are infrequently raised, you should implement event properties. For more information, see [Handle multiple events by using event properties](how-to-handle-multiple-events-using-event-properties.md). + ## Explore related tasks The following resources describe other tasks and concepts related to working with events: @@ -100,7 +100,7 @@ The following resources describe other tasks and concepts related to working wit Specification reference documentation is available for the APIs that support event handling: -| API name | API type | Reference | +| API name | API type | Reference | | --- | --- | --- | | EventHandler | Delegate | | | EventHandler\ | Delegate | | diff --git a/docs/standard/exceptions/how-to-create-localized-exception-messages.md b/docs/standard/exceptions/how-to-create-localized-exception-messages.md index 836f9a77ab071..9819c618e45a6 100644 --- a/docs/standard/exceptions/how-to-create-localized-exception-messages.md +++ b/docs/standard/exceptions/how-to-create-localized-exception-messages.md @@ -122,7 +122,7 @@ Throw New StudentNotFoundException("The student cannot be found.", "John") ``` The problem with the previous line is that `"The student cannot be found."` is just a constant string. In a localized application, you want to have different messages depending on user culture. -[Satellite assemblies](../../core/extensions/create-satellite-assemblies.md) are a good way to do that. A satellite assembly is a DLL that contains resources for a specific language. When you ask for a specific resources at run time, the CLR finds that resource depending on user culture. If no satellite assembly is found for that culture, the resources of the default culture are used. +[Satellite assemblies](../../core/extensions/create-satellite-assemblies.md) are a good way to do that. A satellite assembly is a DLL that contains resources for a specific language. When you ask for a specific resources at runtime, the CLR finds that resource depending on user culture. If no satellite assembly is found for that culture, the resources of the default culture are used. To create the localized exception messages: diff --git a/docs/standard/frameworks.md b/docs/standard/frameworks.md index c6fcc14740dd9..82dea61268b4b 100644 --- a/docs/standard/frameworks.md +++ b/docs/standard/frameworks.md @@ -99,7 +99,7 @@ Use these guidelines to determine which TFM to use in your app: #### OS version in TFMs -You can also specify an optional OS version at the end of an OS-specific TFM, for example, `net8.0-ios17.2`. The version indicates which APIs are available to your app or library. It doesn't control the OS version that your app or library supports at run time. It's used to select the reference assemblies that your project compiles against, and to select assets from NuGet packages. Think of this version as the "platform version" or "OS API version" to disambiguate it from the run-time OS version. +You can also specify an optional OS version at the end of an OS-specific TFM, for example, `net8.0-ios17.2`. The version indicates which APIs are available to your app or library. It doesn't control the OS version that your app or library supports at runtime. It's used to select the reference assemblies that your project compiles against, and to select assets from NuGet packages. Think of this version as the "platform version" or "OS API version" to disambiguate it from the runtime OS version. The .NET SDK is designed to be able to support newly released APIs for an individual platform without a new version of the base TFM. This enables you to access platform-specific functionality without waiting for a major release of .NET. You can gain access to these newly released APIs by incrementing the platform version in the TFM. For example, if the Android platform added API level 34 APIs in a .NET 8.0.x SDK update, you could access them by using the TFM `net8.0-android34.0`. @@ -130,7 +130,7 @@ If your app references a package that has multiple assets for different TFMs, th #### Support older OS versions -Although a platform-specific app or library is compiled against APIs from a specific version of that OS, you can make it compatible with earlier OS versions by adding the `SupportedOSPlatformVersion` property to your project file. The `SupportedOSPlatformVersion` property indicates the minimum OS version required to run your app or library. If you don't explicitly specify this minimum run-time OS version in the project, it defaults to the platform version from the TFM. +Although a platform-specific app or library is compiled against APIs from a specific version of that OS, you can make it compatible with earlier OS versions by adding the `SupportedOSPlatformVersion` property to your project file. The `SupportedOSPlatformVersion` property indicates the minimum OS version required to run your app or library. If you don't explicitly specify this minimum runtime OS version in the project, it defaults to the platform version from the TFM. For your app to run correctly on an older OS version, it can't call APIs that don't exist on that version of the OS. However, you can add guards around calls to newer APIs so they are only called when running on a version of the OS that supports them. This pattern allows you to design your app or library to support running on older OS versions while taking advantage of newer OS functionality when running on newer OS versions. diff --git a/docs/standard/garbage-collection/using-objects.md b/docs/standard/garbage-collection/using-objects.md index f687222e4a0a1..864d33d2f3576 100644 --- a/docs/standard/garbage-collection/using-objects.md +++ b/docs/standard/garbage-collection/using-objects.md @@ -56,7 +56,7 @@ Instead of wrapping a `try/finally` block in a `using` statement, you may choose - To include a `catch` block to handle exceptions thrown in the `try` block. Otherwise, any exceptions thrown within the `using` statement are unhandled. - To instantiate an object that implements whose scope is not local to the block within which it is declared. -The following example is similar to the previous example, except that it uses a `try/catch/finally` block to instantiate, use, and dispose of a object, and to handle any exceptions thrown by the constructor and its method. The code in the `finally` block checks that the object that implements isn't `null` before it calls the method. Failure to do this can result in a exception at run time. +The following example is similar to the previous example, except that it uses a `try/catch/finally` block to instantiate, use, and dispose of a object, and to handle any exceptions thrown by the constructor and its method. The code in the `finally` block checks that the object that implements isn't `null` before it calls the method. Failure to do this can result in a exception at runtime. :::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.disposable/cs/TryExplicitCatchFinally.cs"::: :::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.disposable/vb/TryExplicitCatchFinally.vb"::: diff --git a/docs/standard/generics.md b/docs/standard/generics.md index a9642d87761d6..b4a2622d32c3e 100644 --- a/docs/standard/generics.md +++ b/docs/standard/generics.md @@ -13,9 +13,9 @@ First introduced in .NET Framework 2.0, generics are essentially a "code templat To understand why generics are useful, let's take a look at a specific class before and after adding generics: . In .NET Framework 1.0, the `ArrayList` elements were of type . Any element added to the collection was silently converted into an `Object`. The same would happen when reading elements from the list. This process is known as [boxing and unboxing](../csharp/programming-guide/types/boxing-and-unboxing.md), and it impacts performance. Aside from performance, however, there's no way to determine the type of data in the list at compile time, which makes for some fragile code. Generics solve this problem by defining the type of data each instance of list will contain. For example, you can only add integers to `List` and only add Persons to `List`. -Generics are also available at run time. The runtime knows what type of data structure you're using and can store it in memory more efficiently. +Generics are also available at runtime. The runtime knows what type of data structure you're using and can store it in memory more efficiently. -The following example is a small program that illustrates the efficiency of knowing the data structure type at run time: +The following example is a small program that illustrates the efficiency of knowing the data structure type at runtime: ```csharp using System; diff --git a/docs/standard/generics/index.md b/docs/standard/generics/index.md index d341bc8491dc2..c88990c75c8da 100644 --- a/docs/standard/generics/index.md +++ b/docs/standard/generics/index.md @@ -74,7 +74,7 @@ The following terms are used to discuss generics in .NET: There are many advantages to using generic collections and delegates: -- Type safety. Generics shift the burden of type safety from you to the compiler. There is no need to write code to test for the correct data type because it is enforced at compile time. The need for type casting and the possibility of run-time errors are reduced. +- Type safety. Generics shift the burden of type safety from you to the compiler. There is no need to write code to test for the correct data type because it is enforced at compile time. The need for type casting and the possibility of runtime errors are reduced. - Less code and code is more easily reused. There is no need to inherit from a base type and override members. For example, the is ready for immediate use. For example, you can create a linked list of strings with the following variable declaration: diff --git a/docs/standard/glossary.md b/docs/standard/glossary.md index f3e4e043ee1ae..7a96c5ed33ffc 100644 --- a/docs/standard/glossary.md +++ b/docs/standard/glossary.md @@ -12,7 +12,7 @@ The primary goal of this glossary is to clarify meanings of selected terms and a Ahead-of-time compiler. -Similar to [JIT](#jit), this compiler also translates [IL](#il) to machine code. In contrast to JIT compilation, AOT compilation happens before the application is executed and is usually performed on a different machine. Because AOT tool chains don't compile at run time, they don't have to minimize time spent compiling. That means they can spend more time optimizing. Since the context of AOT is the entire application, the AOT compiler also performs cross-module linking and whole-program analysis, which means that all references are followed and a single executable is produced. +Similar to [JIT](#jit), this compiler also translates [IL](#il) to machine code. In contrast to JIT compilation, AOT compilation happens before the application is executed and is usually performed on a different machine. Because AOT tool chains don't compile at runtime, they don't have to minimize time spent compiling. That means they can spend more time optimizing. Since the context of AOT is the entire application, the AOT compiler also performs cross-module linking and whole-program analysis, which means that all references are followed and a single executable is produced. See [CoreRT](#corert) and [.NET Native](#net-native). @@ -86,7 +86,7 @@ See [CLR](#clr). ## CoreRT -In contrast to the [CLR](#clr), CoreRT is not a virtual machine, which means it doesn't include the facilities to generate and run code on-the-fly because it doesn't include a [JIT](#jit). It does, however, include the [GC](#gc) and the ability for run-time type identification (RTTI) and reflection. However, its type system is designed so that metadata for reflection isn't required. Not requiring metadata enables having an [AOT](#aot) tool chain that can link away superfluous metadata and (more importantly) identify code that the app doesn't use. CoreRT is in development. +In contrast to the [CLR](#clr), CoreRT is not a virtual machine, which means it doesn't include the facilities to generate and run code on-the-fly because it doesn't include a [JIT](#jit). It does, however, include the [GC](#gc) and the ability for runtime type identification (RTTI) and reflection. However, its type system is designed so that metadata for reflection isn't required. Not requiring metadata enables having an [AOT](#aot) tool chain that can link away superfluous metadata and (more importantly) identify code that the app doesn't use. CoreRT is in development. See [Intro to CoreRT](https://github.com/dotnet/corert/blob/master/Documentation/intro-to-corert.md) and [.NET Runtime Lab](https://github.com/dotnet/runtimelab/blob/docs/README.md). @@ -141,7 +141,7 @@ Higher-level .NET languages, such as C#, compile down to a hardware-agnostic ins Just-in-time compiler. -Similar to [AOT](#aot), this compiler translates [IL](#il) to machine code that the processor understands. Unlike AOT, JIT compilation happens on demand and is performed on the same machine that the code needs to run on. Since JIT compilation occurs during execution of the application, the compile time is part of the run time. Thus, JIT compilers have to balance time spent optimizing code against the savings that the resulting code can produce. But a JIT knows the actual hardware and can free developers from having to ship different implementations. +Similar to [AOT](#aot), this compiler translates [IL](#il) to machine code that the processor understands. Unlike AOT, JIT compilation happens on demand and is performed on the same machine that the code needs to run on. Since JIT compilation occurs during execution of the application, the compile time is part of the runtime. Thus, JIT compilers have to balance time spent optimizing code against the savings that the resulting code can produce. But a JIT knows the actual hardware and can free developers from having to ship different implementations. ## implementation of .NET @@ -181,7 +181,7 @@ For more information, see the [Mono documentation](https://www.mono-project.com/ ## Native AOT -A deployment mode where the app is self-contained and is [ahead-of-time](#aot) compiled to native code at the time of publish. Native AOT apps don't use a [JIT](#jit) compiler at run time. They can run on machines that don't have the .NET runtime installed. +A deployment mode where the app is self-contained and is [ahead-of-time](#aot) compiled to native code at the time of publish. Native AOT apps don't use a [JIT](#jit) compiler at runtime. They can run on machines that don't have the .NET runtime installed. For more information, see [Native AOT deployment](../core/deploying/native-aot/index.md). diff --git a/docs/standard/library-guidance/cross-platform-targeting.md b/docs/standard/library-guidance/cross-platform-targeting.md index 50cb2593205fd..b2f7b750423c0 100644 --- a/docs/standard/library-guidance/cross-platform-targeting.md +++ b/docs/standard/library-guidance/cross-platform-targeting.md @@ -70,7 +70,7 @@ To shield your consumers from having to build for individual frameworks, you sho > Targeting .NET implementations allows you to call platform-specific APIs that are outside of .NET Standard. > -> Do not drop support for .NET Standard when you do this. Instead, throw from the implementation and offer capability APIs. This way, your library can be used anywhere and supports run-time light-up of features. +> Do not drop support for .NET Standard when you do this. Instead, throw from the implementation and offer capability APIs. This way, your library can be used anywhere and supports runtime light-up of features. ```csharp public static class GpsLocation diff --git a/docs/standard/library-guidance/dependencies.md b/docs/standard/library-guidance/dependencies.md index c4e65b7303739..a7c156baae98d 100644 --- a/docs/standard/library-guidance/dependencies.md +++ b/docs/standard/library-guidance/dependencies.md @@ -18,7 +18,7 @@ At build time, NuGet analyzes all the packages that a project depends on, includ Most diamond dependencies are easily resolved; however, they can create issues in certain circumstances: - **Conflicting NuGet package references** prevent a version from being resolved during package restore. -- **Breaking changes between the versions** cause bugs and exceptions at run time. +- **Breaking changes between the versions** cause bugs and exceptions at runtime. - **The package assembly is strong named**, the assembly version changed, and the app is running on .NET Framework. Assembly binding redirects are required. It's not possible to know what packages will be used alongside your own. A good way to reduce the likelihood of a diamond dependency breaking your library is to minimize the number of packages you depend on. diff --git a/docs/standard/library-guidance/versioning.md b/docs/standard/library-guidance/versioning.md index cdb1f473532b0..f27777a3ee7e2 100644 --- a/docs/standard/library-guidance/versioning.md +++ b/docs/standard/library-guidance/versioning.md @@ -42,15 +42,15 @@ Because the NuGet package version is the most visible version to developers, it' ### Assembly version -The assembly version is what the CLR uses at run time to select which version of an assembly to load. Selecting an assembly using versioning only applies to assemblies with a strong name. +The assembly version is what the CLR uses at runtime to select which version of an assembly to load. Selecting an assembly using versioning only applies to assemblies with a strong name. ```xml 1.0.0.0 ``` -The .NET Framework CLR demands an exact match to load a strong-named assembly. For example, `Library1, Version=1.0.0.0` was compiled with a reference to `Newtonsoft.Json, Version=11.0.0.0`. .NET Framework will only load that exact version `11.0.0.0`. To load a different version at run time, a binding redirect must be added to the .NET application's config file. +The .NET Framework CLR demands an exact match to load a strong-named assembly. For example, `Library1, Version=1.0.0.0` was compiled with a reference to `Newtonsoft.Json, Version=11.0.0.0`. .NET Framework will only load that exact version `11.0.0.0`. To load a different version at runtime, a binding redirect must be added to the .NET application's config file. -Strong naming combined with assembly version enables [strict assembly version loading](../assembly/versioning.md). While strong naming a library has a number of benefits, it often results in run-time exceptions that an assembly can't be found and [requires binding redirects](../../framework/configure-apps/redirect-assembly-versions.md) in `app.config` or `web.config` to be fixed. In .NET (Core), assembly loading is more relaxed. The .NET (Core) runtime automatically loads assemblies with a higher version at run time. +Strong naming combined with assembly version enables [strict assembly version loading](../assembly/versioning.md). While strong naming a library has a number of benefits, it often results in runtime exceptions that an assembly can't be found and [requires binding redirects](../../framework/configure-apps/redirect-assembly-versions.md) in `app.config` or `web.config` to be fixed. In .NET (Core), assembly loading is more relaxed. The .NET (Core) runtime automatically loads assemblies with a higher version at runtime. ✔️ CONSIDER only including a major version in the AssemblyVersion. @@ -66,7 +66,7 @@ Strong naming combined with assembly version enables [strict assembly version lo ### Assembly file version -The assembly file version is used to display a file version in Windows and has no effect on run-time behavior. Setting this version is optional. It's visible in the File Properties dialog in Windows Explorer: +The assembly file version is used to display a file version in Windows and has no effect on runtime behavior. Setting this version is optional. It's visible in the File Properties dialog in Windows Explorer: ```xml 11.0.2.21924 diff --git a/docs/standard/linq/statically-compiled-queries.md b/docs/standard/linq/statically-compiled-queries.md index 2bdb3f7740efc..094192accd170 100644 --- a/docs/standard/linq/statically-compiled-queries.md +++ b/docs/standard/linq/statically-compiled-queries.md @@ -9,7 +9,7 @@ ms.assetid: 3bf558fe-0705-479d-86d4-00188f5fcf9c --- # Statically compiled queries (LINQ to XML) -One of the most important performance advantages of LINQ to XML, as compared to , is that queries in LINQ to XML are statically compiled, whereas XPath queries must be interpreted at run time. This feature is built into LINQ to XML, so you don't have to perform extra steps to take advantage of it, but it's helpful to understand the distinction when choosing between the two technologies. This article explains the difference. +One of the most important performance advantages of LINQ to XML, as compared to , is that queries in LINQ to XML are statically compiled, whereas XPath queries must be interpreted at runtime. This feature is built into LINQ to XML, so you don't have to perform extra steps to take advantage of it, but it's helpful to understand the distinction when choosing between the two technologies. This article explains the difference. ## Statically compiled queries vs. XPath diff --git a/docs/standard/managed-execution-process.md b/docs/standard/managed-execution-process.md index 635cc914c3291..2805b54af915c 100644 --- a/docs/standard/managed-execution-process.md +++ b/docs/standard/managed-execution-process.md @@ -41,13 +41,13 @@ The managed execution process includes the following steps, which are discussed ### Compilation by the JIT compiler - JIT compilation converts CIL to native code on demand at application run time, when the contents of an assembly are loaded and executed. Because the common language runtime supplies a JIT compiler for each supported CPU architecture, developers can build a set of CIL assemblies that can be JIT-compiled and run on different computers with different machine architectures. However, if your managed code calls platform-specific native APIs or a platform-specific class library, it will run only on that operating system. + JIT compilation converts CIL to native code on demand at application runtime, when the contents of an assembly are loaded and executed. Because the common language runtime supplies a JIT compiler for each supported CPU architecture, developers can build a set of CIL assemblies that can be JIT-compiled and run on different computers with different machine architectures. However, if your managed code calls platform-specific native APIs or a platform-specific class library, it will run only on that operating system. JIT compilation takes into account the possibility that some code might never be called during execution. Instead of using time and memory to convert all the CIL in a PE file to native code, it converts the CIL as needed during execution and stores the resulting native code in memory so that it is accessible for subsequent calls in the context of that process. The loader creates and attaches a stub to each method in a type when the type is loaded and initialized. When a method is called for the first time, the stub passes control to the JIT compiler, which converts the CIL for that method into native code and modifies the stub to point directly to the generated native code. Therefore, subsequent calls to the JIT-compiled method go directly to the native code. ### Install-time code generation using NGen.exe - Because the JIT compiler converts an assembly's CIL to native code when individual methods defined in that assembly are called, it affects performance adversely at run time. In most cases, that diminished performance is acceptable. More importantly, the code generated by the JIT compiler is bound to the process that triggered the compilation. It cannot be shared across multiple processes. To allow the generated code to be shared across multiple invocations of an application or across multiple processes that share a set of assemblies, the common language runtime supports an ahead-of-time compilation mode. This ahead-of-time compilation mode uses the [Ngen.exe (Native Image Generator)](../framework/tools/ngen-exe-native-image-generator.md) to convert CIL assemblies to native code much like the JIT compiler does. However, the operation of Ngen.exe differs from that of the JIT compiler in three ways: + Because the JIT compiler converts an assembly's CIL to native code when individual methods defined in that assembly are called, it affects performance adversely at runtime. In most cases, that diminished performance is acceptable. More importantly, the code generated by the JIT compiler is bound to the process that triggered the compilation. It cannot be shared across multiple processes. To allow the generated code to be shared across multiple invocations of an application or across multiple processes that share a set of assemblies, the common language runtime supports an ahead-of-time compilation mode. This ahead-of-time compilation mode uses the [Ngen.exe (Native Image Generator)](../framework/tools/ngen-exe-native-image-generator.md) to convert CIL assemblies to native code much like the JIT compiler does. However, the operation of Ngen.exe differs from that of the JIT compiler in three ways: - It performs the conversion from CIL to native code before running the application instead of while the application is running. - It compiles an entire assembly at a time, instead of one method at a time. diff --git a/docs/standard/metadata-and-self-describing-components.md b/docs/standard/metadata-and-self-describing-components.md index d6df8be656e8e..f459ce9faeff4 100644 --- a/docs/standard/metadata-and-self-describing-components.md +++ b/docs/standard/metadata-and-self-describing-components.md @@ -58,7 +58,7 @@ Metadata is the key to a simpler programming model, and eliminates the need for - Attributes. - .NET lets you declare specific kinds of metadata, called attributes, in your compiled file. Attributes can be found throughout .NET and are used to control in more detail how your program behaves at run time. Additionally, you can emit your own custom metadata into .NET files through user-defined custom attributes. For more information, see [Attributes](attributes/index.md). + .NET lets you declare specific kinds of metadata, called attributes, in your compiled file. Attributes can be found throughout .NET and are used to control in more detail how your program behaves at runtime. Additionally, you can emit your own custom metadata into .NET files through user-defined custom attributes. For more information, see [Attributes](attributes/index.md). ## Metadata and the PE File Structure @@ -92,7 +92,7 @@ When a program is compiled for the common language runtime, it is converted to a ## Run-Time Use of Metadata -To better understand metadata and its role in the common language runtime, it might be helpful to construct a simple program and illustrate how metadata affects its run-time life. The following code example shows two methods inside a class called `MyApp`. The `Main` method is the program entry point, while the `Add` method simply returns the sum of two integer arguments. +To better understand metadata and its role in the common language runtime, it might be helpful to construct a simple program and illustrate how metadata affects its runtime life. The following code example shows two methods inside a class called `MyApp`. The `Main` method is the program entry point, while the `Add` method simply returns the sum of two integer arguments. ```vb Public Class MyApp diff --git a/docs/standard/native-interop/com-callable-wrapper.md b/docs/standard/native-interop/com-callable-wrapper.md index 50453b09e6776..a3037bfb10243 100644 --- a/docs/standard/native-interop/com-callable-wrapper.md +++ b/docs/standard/native-interop/com-callable-wrapper.md @@ -170,7 +170,7 @@ public class LoanApp } ``` -To get the DispId of an interface member at run time, COM clients can call **IDispatch.GetIdsOfNames**. To invoke a method on the interface, pass the returned DispId as an argument to **IDispatch.Invoke**. +To get the DispId of an interface member at runtime, COM clients can call **IDispatch.GetIdsOfNames**. To invoke a method on the interface, pass the returned DispId as an argument to **IDispatch.Invoke**. ### Restrict using the dual interface option for the class interface. diff --git a/docs/standard/native-interop/comwrappers-source-generation.md b/docs/standard/native-interop/comwrappers-source-generation.md index 7c874770f23c3..cd0495a0e2694 100644 --- a/docs/standard/native-interop/comwrappers-source-generation.md +++ b/docs/standard/native-interop/comwrappers-source-generation.md @@ -8,9 +8,9 @@ ms.date: 08/25/2023 .NET 8 introduces a source generator that creates an implementation of the [ComWrappers](./com-wrappers.md) API for you. The generator recognizes the . -The .NET runtime's built-in (not source-generated), Windows-only, COM interop system generates an IL stub—a stream of IL instructions that's JIT-ed—at run time to facilitate the transition from managed code to COM, and vice-versa. Since this IL stub is generated at run time, it's incompatible with [NativeAOT](../../core/deploying/native-aot/index.md) and [IL trimming](../../core/deploying/trimming/trim-self-contained.md). Stub generation at run time can also make diagnosing marshalling issues difficult. +The .NET runtime's built-in (not source-generated), Windows-only, COM interop system generates an IL stub—a stream of IL instructions that's JIT-ed—at runtime to facilitate the transition from managed code to COM, and vice-versa. Since this IL stub is generated at runtime, it's incompatible with [NativeAOT](../../core/deploying/native-aot/index.md) and [IL trimming](../../core/deploying/trimming/trim-self-contained.md). Stub generation at runtime can also make diagnosing marshalling issues difficult. -Built-in interop uses attributes such as `ComImport` or `DllImport`, which rely on code generation at run time. The following code shows an example of this: +Built-in interop uses attributes such as `ComImport` or `DllImport`, which rely on code generation at runtime. The following code shows an example of this: ```csharp [ComImport] diff --git a/docs/standard/native-interop/native-library-loading.md b/docs/standard/native-interop/native-library-loading.md index 7a660f107da5d..b6b55ce512b72 100644 --- a/docs/standard/native-interop/native-library-loading.md +++ b/docs/standard/native-interop/native-library-loading.md @@ -54,7 +54,7 @@ In this case, the library name variations are tried in the following order: ## Custom import resolver -In more complex scenarios, you can use to resolve DLL imports at run time. In the following example, `nativedep` is resolved to `nativedep_avx2` if the CPU supports it. +In more complex scenarios, you can use to resolve DLL imports at runtime. In the following example, `nativedep` is resolved to `nativedep_avx2` if the CPU supports it. > [!TIP] > This functionality is only available in .NET Core 3.1 and .NET 5+. diff --git a/docs/standard/native-interop/pinvoke-source-generation.md b/docs/standard/native-interop/pinvoke-source-generation.md index 35c051e5d2596..61d8fc1210588 100644 --- a/docs/standard/native-interop/pinvoke-source-generation.md +++ b/docs/standard/native-interop/pinvoke-source-generation.md @@ -8,7 +8,7 @@ ms.date: 07/25/2022 .NET 7 introduces a [source generator](../../csharp/roslyn-sdk/index.md#source-generators) for P/Invokes that recognizes the in C# code. -When it's not using source generation, the built-in interop system in the .NET runtime generates an IL stub—a stream of IL instructions that is JIT-ed—at run time to facilitate the transition from managed to unmanaged. The following code shows defining and then calling a P/Invoke that uses this mechanism: +When it's not using source generation, the built-in interop system in the .NET runtime generates an IL stub—a stream of IL instructions that is JIT-ed—at runtime to facilitate the transition from managed to unmanaged. The following code shows defining and then calling a P/Invoke that uses this mechanism: ```csharp [DllImport( @@ -20,9 +20,9 @@ internal static extern string ToLower(string str); // string lower = ToLower("StringToConvert"); ``` -The IL stub handles [marshalling](type-marshalling.md) of parameters and return values and calling the unmanaged code while respecting settings on that affect how the unmanaged code should be invoked (for example, ). Since this IL stub is generated at run time, it isn't available for ahead-of-time (AOT) compiler or IL trimming scenarios. Generation of the IL represents an important cost to consider for marshalling. This cost can be measured in terms of application performance and support for potential target platforms that may not permit dynamic code generation. The [Native AOT](../../core/deploying/native-aot/index.md) application model addresses issues with dynamic code generation by precompiling all code ahead of time directly into native code. Using `DllImport` isn't an option for platforms that require full Native AOT scenarios and therefore using other approaches (for example, source generation) is more appropriate. Debugging the marshalling logic in `DllImport` scenarios is also a non-trivial exercise. +The IL stub handles [marshalling](type-marshalling.md) of parameters and return values and calling the unmanaged code while respecting settings on that affect how the unmanaged code should be invoked (for example, ). Since this IL stub is generated at runtime, it isn't available for ahead-of-time (AOT) compiler or IL trimming scenarios. Generation of the IL represents an important cost to consider for marshalling. This cost can be measured in terms of application performance and support for potential target platforms that may not permit dynamic code generation. The [Native AOT](../../core/deploying/native-aot/index.md) application model addresses issues with dynamic code generation by precompiling all code ahead of time directly into native code. Using `DllImport` isn't an option for platforms that require full Native AOT scenarios and therefore using other approaches (for example, source generation) is more appropriate. Debugging the marshalling logic in `DllImport` scenarios is also a non-trivial exercise. -The P/Invoke source generator, included with the .NET 7 SDK and enabled by default, looks for on a `static` and `partial` method to trigger compile-time source generation of marshalling code, removing the need for the generation of an IL stub at run time and allowing the P/Invoke to be inlined. [Analyzers](../../fundamentals/syslib-diagnostics/syslib1050-1069.md) and code fixers are also included to help with migration from the built-in system to the source generator and with usage in general. +The P/Invoke source generator, included with the .NET 7 SDK and enabled by default, looks for on a `static` and `partial` method to trigger compile-time source generation of marshalling code, removing the need for the generation of an IL stub at runtime and allowing the P/Invoke to be inlined. [Analyzers](../../fundamentals/syslib-diagnostics/syslib1050-1069.md) and code fixers are also included to help with migration from the built-in system to the source generator and with usage in general. ## Basic usage diff --git a/docs/standard/native-interop/qualify-net-types-for-interoperation.md b/docs/standard/native-interop/qualify-net-types-for-interoperation.md index bb134ed242dcb..d9dcd4cb35fc4 100644 --- a/docs/standard/native-interop/qualify-net-types-for-interoperation.md +++ b/docs/standard/native-interop/qualify-net-types-for-interoperation.md @@ -205,7 +205,7 @@ Virtual function table layouts: | 2 | `IUnknown::Release` | | 3 | `IComInterface2::Method3` | -As these virtual function tables differ from the C++ example, this will lead to serious problems at run time. The correct definition of these interfaces in .NET with is as follows: +As these virtual function tables differ from the C++ example, this will lead to serious problems at runtime. The correct definition of these interfaces in .NET with is as follows: ```csharp [ComImport] diff --git a/docs/standard/native-interop/tutorial-comwrappers.md b/docs/standard/native-interop/tutorial-comwrappers.md index dacfadd94cdc1..913ef9cbb8c32 100644 --- a/docs/standard/native-interop/tutorial-comwrappers.md +++ b/docs/standard/native-interop/tutorial-comwrappers.md @@ -248,7 +248,7 @@ return new DemoNativeStaticWrapper() #### Dynamic Native Object Wrapper -Dynamic wrappers are more flexible because they provide a way for types to be queried at run time instead of statically. To provide this support, you'll use [`IDynamicInterfaceCastable`][api_idynamicinterfacecastable]. Observe that `DemoNativeDynamicWrapper` only implements this interface. The functionality that the interface provides is a chance to determine what type is supported at run time. The source for this tutorial does a static check during creation but that is simply for code sharing since the check could be deferred until a call is made to `DemoNativeDynamicWrapper.IsInterfaceImplemented()`. +Dynamic wrappers are more flexible because they provide a way for types to be queried at runtime instead of statically. To provide this support, you'll use [`IDynamicInterfaceCastable`][api_idynamicinterfacecastable]. Observe that `DemoNativeDynamicWrapper` only implements this interface. The functionality that the interface provides is a chance to determine what type is supported at runtime. The source for this tutorial does a static check during creation but that is simply for code sharing since the check could be deferred until a call is made to `DemoNativeDynamicWrapper.IsInterfaceImplemented()`. ```csharp // See referenced sample for implementation. diff --git a/docs/standard/native-interop/tutorial-custom-marshaller.md b/docs/standard/native-interop/tutorial-custom-marshaller.md index 8b19bc32d6dde..c6f70f5c96cb0 100644 --- a/docs/standard/native-interop/tutorial-custom-marshaller.md +++ b/docs/standard/native-interop/tutorial-custom-marshaller.md @@ -19,7 +19,7 @@ All source code used in this tutorial is available in the [dotnet/samples reposi ## Overview of the `LibraryImport` source generator -The [`System.Runtime.InteropServices.LibraryImportAttribute`][api_libraryimportattribute] type is the user entry point for a source generator introduced in .NET 7. This source generator is designed to generate all marshalling code at compile time instead of at run time. Entry points have historically been specified using `DllImport`, but that approach comes with costs that may not always be acceptable—for more information, see [P/Invoke source generation][pinvoke_source_generation]. The `LibraryImport` source generator can generate all marshalling code and remove the run-time generation requirement intrinsic to `DllImport`. +The [`System.Runtime.InteropServices.LibraryImportAttribute`][api_libraryimportattribute] type is the user entry point for a source generator introduced in .NET 7. This source generator is designed to generate all marshalling code at compile time instead of at runtime. Entry points have historically been specified using `DllImport`, but that approach comes with costs that may not always be acceptable—for more information, see [P/Invoke source generation][pinvoke_source_generation]. The `LibraryImport` source generator can generate all marshalling code and remove the runtime generation requirement intrinsic to `DllImport`. To express the details needed to generated marshalling code both for the runtime and for users to customize for their own types, several types are needed. The following types are used throughout this tutorial: diff --git a/docs/standard/net-standard.md b/docs/standard/net-standard.md index 84ae857031196..a0f583af41837 100644 --- a/docs/standard/net-standard.md +++ b/docs/standard/net-standard.md @@ -132,9 +132,9 @@ Here are some problems with .NET Standard that help explain why .NET 5 and later **Solution in .NET 5+:** There's no separation between a .NET 5+ API specification and its implementation. The result is a simplified TFM scheme. There's one TFM prefix for all workloads: `net10.0` is used for libraries, console apps, and web apps. The only variation is a [suffix that specifies platform-specific APIs](frameworks.md#os-specific-tfms) for a particular platform, such as `net10.0-windows`. Thanks to this TFM naming convention, you can easily tell whether a given app can use a given library. No version number equivalents table, like the one for .NET Standard, is needed. -- Platform-unsupported exceptions at run time +- Platform-unsupported exceptions at runtime - .NET Standard exposes platform-specific APIs. Your code might compile without errors and appear to be portable to any platform even if it isn't portable. When it runs on a platform that doesn't have an implementation for a given API, you get run-time errors. + .NET Standard exposes platform-specific APIs. Your code might compile without errors and appear to be portable to any platform even if it isn't portable. When it runs on a platform that doesn't have an implementation for a given API, you get runtime errors. **Solution in .NET 5+:** The .NET 5+ SDKs include code analyzers that are enabled by default. The platform compatibility analyzer detects unintentional use of APIs that aren't supported on the platforms you intend to run on. For more information, see [Platform compatibility analyzer](analyzers/platform-compat-analyzer.md). diff --git a/docs/standard/parallel-programming/chaining-tasks-by-using-continuation-tasks.md b/docs/standard/parallel-programming/chaining-tasks-by-using-continuation-tasks.md index fcb61088422d2..ac1bc74d3d144 100644 --- a/docs/standard/parallel-programming/chaining-tasks-by-using-continuation-tasks.md +++ b/docs/standard/parallel-programming/chaining-tasks-by-using-continuation-tasks.md @@ -56,7 +56,7 @@ The following example calls the overload that takes a enumeration value to specify the conditions under which the continuation starts. For example, you can specify that the continuation is to run only if the antecedent completes successfully, or only if it completes in a faulted state. If the condition isn't true when the antecedent is ready to invoke the continuation, the continuation transitions directly to the state and can't be started later. -Many multi-task continuation methods, such as overloads of the method, also include a parameter. However, only a subset of all enumeration members is valid. You can specify values that have counterparts in the enumeration, such as , , and . If you specify any of the `NotOn` or `OnlyOn` options with a multi-task continuation, an exception will be thrown at run time. +Many multi-task continuation methods, such as overloads of the method, also include a parameter. However, only a subset of all enumeration members is valid. You can specify values that have counterparts in the enumeration, such as , , and . If you specify any of the `NotOn` or `OnlyOn` options with a multi-task continuation, an exception will be thrown at runtime. For more information on task continuation options, see the article. diff --git a/docs/standard/parallel-programming/introduction-to-plinq.md b/docs/standard/parallel-programming/introduction-to-plinq.md index 9db7d2d964ded..9e61731ab3a38 100644 --- a/docs/standard/parallel-programming/introduction-to-plinq.md +++ b/docs/standard/parallel-programming/introduction-to-plinq.md @@ -59,7 +59,7 @@ The extension method binds t ## Execution Modes -By default, PLINQ is conservative. At run time, the PLINQ infrastructure analyzes the overall structure of the query. If the query is likely to yield speedups by parallelization, PLINQ partitions the source sequence into tasks that can be run concurrently. If it is not safe to parallelize a query, PLINQ just runs the query sequentially. If PLINQ has a choice between a potentially expensive parallel algorithm or an inexpensive sequential algorithm, it chooses the sequential algorithm by default. You can use the method and the enumeration to instruct PLINQ to select the parallel algorithm. This is useful when you know by testing and measurement that a particular query executes faster in parallel. For more information, see [How to: Specify the Execution Mode in PLINQ](how-to-specify-the-execution-mode-in-plinq.md). +By default, PLINQ is conservative. At runtime, the PLINQ infrastructure analyzes the overall structure of the query. If the query is likely to yield speedups by parallelization, PLINQ partitions the source sequence into tasks that can be run concurrently. If it is not safe to parallelize a query, PLINQ just runs the query sequentially. If PLINQ has a choice between a potentially expensive parallel algorithm or an inexpensive sequential algorithm, it chooses the sequential algorithm by default. You can use the method and the enumeration to instruct PLINQ to select the parallel algorithm. This is useful when you know by testing and measurement that a particular query executes faster in parallel. For more information, see [How to: Specify the Execution Mode in PLINQ](how-to-specify-the-execution-mode-in-plinq.md). ## Degree of Parallelism @@ -123,7 +123,7 @@ In some cases, you can improve query performance by writing a custom partitioner [!code-csharp[PLINQ#2](../../../samples/snippets/csharp/VS_Snippets_Misc/plinq/cs/plinq2_cs.cs#2)] [!code-vb[PLINQ#2](../../../samples/snippets/visualbasic/VS_Snippets_Misc/plinq/vb/plinq3.vb#2)] -PLINQ supports a fixed number of partitions (although data may be dynamically reassigned to those partitions during run time for load balancing.). and support only dynamic partitioning, which means that the number of partitions changes at run time. For more information, see [Custom Partitioners for PLINQ and TPL](custom-partitioners-for-plinq-and-tpl.md). +PLINQ supports a fixed number of partitions (although data may be dynamically reassigned to those partitions during runtime for load balancing.). and support only dynamic partitioning, which means that the number of partitions changes at runtime. For more information, see [Custom Partitioners for PLINQ and TPL](custom-partitioners-for-plinq-and-tpl.md). ## Measuring PLINQ Performance diff --git a/docs/standard/security/key-security-concepts.md b/docs/standard/security/key-security-concepts.md index f0ea2e7660378..803251e93cc83 100644 --- a/docs/standard/security/key-security-concepts.md +++ b/docs/standard/security/key-security-concepts.md @@ -52,7 +52,7 @@ A variety of authentication mechanisms are used today, many of which can be used The following example requires that the active principal be an administrator. The `name` parameter is `null`, which allows any user who is an administrator to pass the demand. > [!NOTE] -> In Windows Vista, User Account Control (UAC) determines the privileges of a user. If you are a member of the Built-in Administrators group, you are assigned two run-time access tokens: a standard user access token and an administrator access token. By default, you are in the standard user role. To execute the code that requires you to be an administrator, you must first elevate your privileges from standard user to administrator. You can do this when you start an application by right-clicking the application icon and indicating that you want to run as an administrator. +> In Windows Vista, User Account Control (UAC) determines the privileges of a user. If you are a member of the Built-in Administrators group, you are assigned two runtime access tokens: a standard user access token and an administrator access token. By default, you are in the standard user role. To execute the code that requires you to be an administrator, you must first elevate your privileges from standard user to administrator. You can do this when you start an application by right-clicking the application icon and indicating that you want to run as an administrator. [!code-csharp[Classic PrincipalPermission Example#1](../../../samples/snippets/csharp/VS_Snippets_CLR_Classic/classic PrincipalPermission Example/CS/source.cs#1)] [!code-vb[Classic PrincipalPermission Example#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR_Classic/classic PrincipalPermission Example/VB/source.vb#1)] diff --git a/docs/standard/serialization/binaryformatter-migration-guide/winforms-applications.md b/docs/standard/serialization/binaryformatter-migration-guide/winforms-applications.md index bb984836b7621..b48e5dc888880 100644 --- a/docs/standard/serialization/binaryformatter-migration-guide/winforms-applications.md +++ b/docs/standard/serialization/binaryformatter-migration-guide/winforms-applications.md @@ -76,7 +76,7 @@ Types that had been previously serialized into resource files via [BinaryFormatt ##### Generating resource files via MSBuild -When you generate resource files via MSBuild, you might encounter an `MSB3825` error. This error specifies that your binary-formatted resources might be deserialized using [BinaryFormatter] during run time. The warning is being removed from builds targeting .NET 9 and later, however the removal is not yet complete in all releases of .NET 9. The warning should be only of concern when targeting .NET 8 and lower. As stated earlier, these resources will not deserialize using [BinaryFormatter] during run time in .NET 9 and later versions. You can turn the warning off by setting the property `GenerateResourceWarnOnBinaryFormatterUse` to `false`. In rare cases that deserialization cannot occur without [BinaryFormatter], it can be added back with an unsupported compatibility package. For more information, see [BinaryFormatter migration guide: Compatibility package](compatibility-package.md). Note that an additional step of setting the `System.Resources.Extensions.UseBinaryFormatter` app context switch to `true` is required to use [BinaryFormatter] for resources. +When you generate resource files via MSBuild, you might encounter an `MSB3825` error. This error specifies that your binary-formatted resources might be deserialized using [BinaryFormatter] during runtime. The warning is being removed from builds targeting .NET 9 and later, however the removal is not yet complete in all releases of .NET 9. The warning should be only of concern when targeting .NET 8 and lower. As stated earlier, these resources will not deserialize using [BinaryFormatter] during runtime in .NET 9 and later versions. You can turn the warning off by setting the property `GenerateResourceWarnOnBinaryFormatterUse` to `false`. In rare cases that deserialization cannot occur without [BinaryFormatter], it can be added back with an unsupported compatibility package. For more information, see [BinaryFormatter migration guide: Compatibility package](compatibility-package.md). Note that an additional step of setting the `System.Resources.Extensions.UseBinaryFormatter` app context switch to `true` is required to use [BinaryFormatter] for resources. ## Migrate away from BinaryFormatter diff --git a/docs/standard/serialization/controlling-xml-serialization-using-attributes.md b/docs/standard/serialization/controlling-xml-serialization-using-attributes.md index ccbb877b0a6d6..9bd0f321ebeb3 100644 --- a/docs/standard/serialization/controlling-xml-serialization-using-attributes.md +++ b/docs/standard/serialization/controlling-xml-serialization-using-attributes.md @@ -3,10 +3,10 @@ title: "Controlling XML Serialization Using Attributes" description: Attributes can be used to control the XML serialization of an object or to create an alternate XML stream from the same set of classes. ms.date: "08/05/2022" ms.custom: devdivchpfy22 -dev_langs: +dev_langs: - "csharp" - "vb" -helpviewer_keywords: +helpviewer_keywords: - "classes, serializing" - "XML serialization, examples" - "derived classes, serializing" @@ -159,7 +159,7 @@ The resulting XML might resemble the following code: ## Serializing Derived Classes -Another use of the is to allow the serialization of derived classes. For example, another class named `Manager` that derives from `Employee` can be added to the previous example. If you don't apply the , the code will fail at run time because the derived class type won't be recognized. To remedy this outcome, apply the attribute twice, each time setting the property for each acceptable type (base and derived). +Another use of the is to allow the serialization of derived classes. For example, another class named `Manager` that derives from `Employee` can be added to the previous example. If you don't apply the , the code will fail at runtime because the derived class type won't be recognized. To remedy this outcome, apply the attribute twice, each time setting the property for each acceptable type (base and derived). ```vb Public Class Group diff --git a/docs/standard/serialization/system-text-json/converters-how-to.md b/docs/standard/serialization/system-text-json/converters-how-to.md index bc246901b9903..be4207133a567 100644 --- a/docs/standard/serialization/system-text-json/converters-how-to.md +++ b/docs/standard/serialization/system-text-json/converters-how-to.md @@ -47,7 +47,7 @@ Some examples of types that can be handled by the basic pattern include: * * -The basic pattern creates a class that can handle one type. The factory pattern creates a class that determines, at run time, which specific type is required and dynamically creates the appropriate converter. +The basic pattern creates a class that can handle one type. The factory pattern creates a class that determines, at runtime, which specific type is required and dynamically creates the appropriate converter. ## Sample basic converter @@ -57,7 +57,7 @@ The following sample is a converter that overrides default serialization for an ## Sample factory pattern converter -The following code shows a custom converter that works with `Dictionary`. The code follows the factory pattern because the first generic type parameter is `Enum` and the second is open. The `CanConvert` method returns `true` only for a `Dictionary` with two generic parameters, the first of which is an `Enum` type. The inner converter gets an existing converter to handle whichever type is provided at run time for `TValue`. +The following code shows a custom converter that works with `Dictionary`. The code follows the factory pattern because the first generic type parameter is `Enum` and the second is open. The `CanConvert` method returns `true` only for a `Dictionary` with two generic parameters, the first of which is an `Enum` type. The inner converter gets an existing converter to handle whichever type is provided at runtime for `TValue`. :::code language="csharp" source="snippets/how-to/csharp/DictionaryTKeyEnumTValueConverter.cs"::: @@ -78,7 +78,7 @@ The following steps explain how to create a converter by following the factory p * Create a class that derives from . * Override the `CanConvert` method to return `true` when the type to convert is one that the converter can handle. For example, if the converter is for `List`, it might only handle `List`, `List`, and `List`. -* Override the `CreateConverter` method to return an instance of a converter class that will handle the type-to-convert that is provided at run time. +* Override the `CreateConverter` method to return an instance of a converter class that will handle the type-to-convert that is provided at runtime. * Create the converter class that the `CreateConverter` method instantiates. The factory pattern is required for open generics because the code to convert an object to and from a string isn't the same for all types. A converter for an open generic type (`List`, for example) has to create a converter for a closed generic type (`List`, for example) behind the scenes. Code must be written to handle each closed-generic type that the converter can handle. @@ -226,7 +226,7 @@ For scenarios that require type inference, the following code shows a custom con :::code language="csharp" source="snippets/how-to-contd/csharp/CustomConverterInferredTypesToObject.cs"::: -The example shows the converter code and a `WeatherForecast` class with `object` properties. The `Main` method deserializes a JSON string into a `WeatherForecast` instance, first without using the converter, and then using the converter. The console output shows that without the converter, the run-time type for the `Date` property is `JsonElement`; with the converter, the run-time type is `DateTime`. +The example shows the converter code and a `WeatherForecast` class with `object` properties. The `Main` method deserializes a JSON string into a `WeatherForecast` instance, first without using the converter, and then using the converter. The console output shows that without the converter, the runtime type for the `Date` property is `JsonElement`; with the converter, the runtime type is `DateTime`. The [unit tests folder](https://github.com/dotnet/runtime/tree/main/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/CustomConverterTests) in the `System.Text.Json.Serialization` namespace has more examples of custom converters that handle deserialization to `object` properties. @@ -234,7 +234,7 @@ The [unit tests folder](https://github.com/dotnet/runtime/tree/main/src/librarie .NET 7 provides support for both [polymorphic serialization and deserialization](polymorphism.md). However, in previous .NET versions, there was limited polymorphic serialization support and no support for deserialization. If you're using .NET 6 or an earlier version, deserialization requires a custom converter. -Suppose, for example, you have a `Person` abstract base class, with `Employee` and `Customer` derived classes. Polymorphic deserialization means that at design time you can specify `Person` as the deserialization target, and `Customer` and `Employee` objects in the JSON are correctly deserialized at run time. During deserialization, you have to find clues that identify the required type in the JSON. The kinds of clues available vary with each scenario. For example, a discriminator property might be available or you might have to rely on the presence or absence of a particular property. The current release of `System.Text.Json` doesn't provide attributes to specify how to handle polymorphic deserialization scenarios, so custom converters are required. +Suppose, for example, you have a `Person` abstract base class, with `Employee` and `Customer` derived classes. Polymorphic deserialization means that at design time you can specify `Person` as the deserialization target, and `Customer` and `Employee` objects in the JSON are correctly deserialized at runtime. During deserialization, you have to find clues that identify the required type in the JSON. The kinds of clues available vary with each scenario. For example, a discriminator property might be available or you might have to rely on the presence or absence of a particular property. The current release of `System.Text.Json` doesn't provide attributes to specify how to handle polymorphic deserialization scenarios, so custom converters are required. The following code shows a base class, two derived classes, and a custom converter for them. The converter uses a discriminator property to do polymorphic deserialization. The type discriminator isn't in the class definitions but is created during serialization and is read during deserialization. diff --git a/docs/standard/serialization/system-text-json/custom-contracts.md b/docs/standard/serialization/system-text-json/custom-contracts.md index 764c2d6da2042..8c2bec09ac923 100644 --- a/docs/standard/serialization/system-text-json/custom-contracts.md +++ b/docs/standard/serialization/system-text-json/custom-contracts.md @@ -5,7 +5,7 @@ ms.date: 06/15/2023 --- # Customize a JSON contract -The library constructs a JSON *contract* for each .NET type, which defines how the type should be serialized and deserialized. The contract is derived from the type's shape, which includes characteristics such as its properties and fields and whether it implements the or interface. Types are mapped to contracts either at run time using reflection or at compile time using the source generator. +The library constructs a JSON *contract* for each .NET type, which defines how the type should be serialized and deserialized. The contract is derived from the type's shape, which includes characteristics such as its properties and fields and whether it implements the or interface. Types are mapped to contracts either at runtime using reflection or at compile time using the source generator. Starting in .NET 7, you can customize these JSON contracts to provide more control over how types are converted into JSON and vice versa. The following list shows just some examples of the types of customizations you can make to serialization and deserialization: diff --git a/docs/standard/serialization/system-text-json/migrate-from-newtonsoft.md b/docs/standard/serialization/system-text-json/migrate-from-newtonsoft.md index 88cfbfa949b82..0d818359eb9e1 100644 --- a/docs/standard/serialization/system-text-json/migrate-from-newtonsoft.md +++ b/docs/standard/serialization/system-text-json/migrate-from-newtonsoft.md @@ -130,7 +130,7 @@ The registration precedence for * collection * Attribute on type -The difference here is that a custom converter in the `Converters` collection overrides an attribute at the type level. The intention behind this order of precedence is to make run-time changes override design-time choices. There's no way to change the precedence. +The difference here is that a custom converter in the `Converters` collection overrides an attribute at the type level. The intention behind this order of precedence is to make runtime changes override design-time choices. There's no way to change the precedence. For more information about custom converter registration, see [Register a custom converter](converters-how-to.md#register-a-custom-converter). diff --git a/docs/standard/serialization/system-text-json/nullable-annotations.md b/docs/standard/serialization/system-text-json/nullable-annotations.md index 06193824a24c8..0183f53c5f483 100644 --- a/docs/standard/serialization/system-text-json/nullable-annotations.md +++ b/docs/standard/serialization/system-text-json/nullable-annotations.md @@ -28,7 +28,7 @@ Similarly, ` and `List` types are indistinguishable. diff --git a/docs/standard/serialization/system-text-json/overview.md b/docs/standard/serialization/system-text-json/overview.md index d722e860e415d..f43130ffa1e74 100644 --- a/docs/standard/serialization/system-text-json/overview.md +++ b/docs/standard/serialization/system-text-json/overview.md @@ -48,7 +48,7 @@ For framework versions earlier than .NET Core 3.0, install the [System.Text.Json ## Reflection vs. source generation -By default, `System.Text.Json` gathers the metadata it needs to access properties of objects for serialization and deserialization *at run time* using [reflection](../../../csharp/advanced-topics/reflection-and-attributes/index.md). As an alternative, `System.Text.Json` can use the C# [source generation](../../../csharp/roslyn-sdk/index.md#source-generators) feature to improve performance, reduce private memory usage, and facilitate [assembly trimming](../../../core/deploying/trimming/trim-self-contained.md), which reduces app size. +By default, `System.Text.Json` gathers the metadata it needs to access properties of objects for serialization and deserialization *at runtime* using [reflection](../../../csharp/advanced-topics/reflection-and-attributes/index.md). As an alternative, `System.Text.Json` can use the C# [source generation](../../../csharp/roslyn-sdk/index.md#source-generators) feature to improve performance, reduce private memory usage, and facilitate [assembly trimming](../../../core/deploying/trimming/trim-self-contained.md), which reduces app size. For more information, see [Reflection versus source generation](reflection-vs-source-generation.md). diff --git a/docs/standard/serialization/system-text-json/polymorphism.md b/docs/standard/serialization/system-text-json/polymorphism.md index a0b2cf0b257b7..bbec94bd7bb44 100644 --- a/docs/standard/serialization/system-text-json/polymorphism.md +++ b/docs/standard/serialization/system-text-json/polymorphism.md @@ -51,7 +51,7 @@ In this scenario, the `City` property is serialized because the `weatherForecast } ``` -While round-tripping of the payload as `WeatherForecastBase` is supported, it won't materialize as a run-time type of `WeatherForecastWithCity`. Instead, it will materialize as a run-time type of `WeatherForecastBase`: +While round-tripping of the payload as `WeatherForecastBase` is supported, it won't materialize as a runtime type of `WeatherForecastWithCity`. Instead, it will materialize as a runtime type of `WeatherForecastBase`: ```csharp WeatherForecastBase value = JsonSerializer.Deserialize(""" @@ -416,7 +416,7 @@ Public NotInheritable Class FourDimensionalPoint End Class ``` -Since the configuration does not explicitly opt-in support for `FourDimensionalPoint`, attempting to serialize instances of `FourDimensionalPoint` as `BasePoint` will result in a run-time exception: +Since the configuration does not explicitly opt-in support for `FourDimensionalPoint`, attempting to serialize instances of `FourDimensionalPoint` as `BasePoint` will result in a runtime exception: ```csharp JsonSerializer.Serialize(new FourDimensionalPoint()); // throws NotSupportedException @@ -623,7 +623,7 @@ End Class ### Additional polymorphic serialization details -* Polymorphic serialization supports derived types that have been explicitly opted in via the . Undeclared types will result in a run-time exception. The behavior can be changed by configuring the property. +* Polymorphic serialization supports derived types that have been explicitly opted in via the . Undeclared types will result in a runtime exception. The behavior can be changed by configuring the property. * Polymorphic configuration specified in derived types is not inherited by polymorphic configuration in base types. The base type must be configured independently. * Polymorphic hierarchies are supported for both `interface` and `class` types. * Polymorphism using type discriminators is only supported for type hierarchies that use the default converters for objects, collections, and dictionary types. diff --git a/docs/standard/serialization/system-text-json/populate-properties.md b/docs/standard/serialization/system-text-json/populate-properties.md index 6944378dbf2ed..9d182a59852d2 100644 --- a/docs/standard/serialization/system-text-json/populate-properties.md +++ b/docs/standard/serialization/system-text-json/populate-properties.md @@ -40,7 +40,7 @@ Starting in .NET 8, you can change the deserialization behavior to modify (*popu - For a property that's an object with properties, its mutable properties are updated to the JSON values but the object reference itself doesn't change. - For a struct type property, the effective behavior is that for its mutable properties, any existing values are kept and new values from the JSON are added. However, unlike a reference property, the object itself isn't reused since it's a value type. Instead, a copy of the struct is modified and then reassigned to the property. For an example, see [Struct property example](#struct-property-example). - A struct property must have a setter; otherwise, an is thrown at run time. + A struct property must have a setter; otherwise, an is thrown at runtime. > [!NOTE] > The populate behavior currently doesn't work for types that have a parameterized constructor. For more information, see [dotnet/runtime issue 92877](https://github.com/dotnet/runtime/issues/92877). diff --git a/docs/standard/serialization/system-text-json/reflection-vs-source-generation.md b/docs/standard/serialization/system-text-json/reflection-vs-source-generation.md index a2906811adcac..db4212f2d0b1e 100644 --- a/docs/standard/serialization/system-text-json/reflection-vs-source-generation.md +++ b/docs/standard/serialization/system-text-json/reflection-vs-source-generation.md @@ -16,13 +16,13 @@ To serialize or deserialize a type, needs * How to access property getters and fields for serialization. * How to access a constructor, property setters, and fields for deserialization. * Information about which attributes have been used to customize serialization or deserialization. -* Run-time configuration from . +* Runtime configuration from . This information is referred to as *metadata*. ## Reflection -By default, collects metadata at run time by using [reflection](../../../csharp/advanced-topics/reflection-and-attributes/index.md). Whenever `JsonSerializer` has to serialize or deserialize a type for the first time, it collects and caches this metadata. The metadata collection process takes time and uses memory. +By default, collects metadata at runtime by using [reflection](../../../csharp/advanced-topics/reflection-and-attributes/index.md). Whenever `JsonSerializer` has to serialize or deserialize a type for the first time, it collects and caches this metadata. The metadata collection process takes time and uses memory. ## Source generation @@ -54,7 +54,7 @@ Choose reflection or source-generation modes based on the following benefits tha | Supports all available serialization customizations. | ✔️ | ❌ | ❌ | | Reduces start-up time. | ❌ | ✔️ | ✔️ | | Reduces private memory usage. | ❌ | ✔️ | ✔️ | -| Eliminates run-time reflection. | ❌ | ✔️ | ✔️ | +| Eliminates runtime reflection. | ❌ | ✔️ | ✔️ | | Facilitates trim-safe app size reduction. | ❌ | ✔️ | ✔️ | | Increases serialization throughput. | ❌ | ❌ | ✔️ | diff --git a/docs/standard/serialization/system-text-json/source-generation-modes.md b/docs/standard/serialization/system-text-json/source-generation-modes.md index 913b3780389a6..13e4fb5cc4c86 100644 --- a/docs/standard/serialization/system-text-json/source-generation-modes.md +++ b/docs/standard/serialization/system-text-json/source-generation-modes.md @@ -18,13 +18,13 @@ For information about how to use source generation modes, see [How to use source ## Metadata-based mode -You can use source generation to move the metadata collection process from run time to compile time. During compilation, the metadata is collected and source code files are generated. The generated source code files are automatically compiled as an integral part of the application. This technique eliminates run-time metadata collection, which improves performance of both serialization and deserialization. +You can use source generation to move the metadata collection process from runtime to compile time. During compilation, the metadata is collected and source code files are generated. The generated source code files are automatically compiled as an integral part of the application. This technique eliminates runtime metadata collection, which improves performance of both serialization and deserialization. The performance improvements provided by source generation can be substantial. For example, [test results](https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-source-generator/#how-source-generation-provides-benefits) have shown up to 40% or more startup time reduction, private memory reduction, throughput speed increase (in serialization optimization mode), and app size reduction. ### Known issues -Only `public` properties and fields are supported by default in either serialization mode (reflection or source-generation). However, reflection mode supports the use of `private` members, while source-generation mode doesn't. For example, if you apply the [JsonInclude attribute](xref:System.Text.Json.Serialization.JsonIncludeAttribute) to a `private` property or a property that has a `private` setter or getter, it will be serialized in reflection mode. Source-generation mode supports only `public` or `internal` members and `public` or `internal` accessors of `public` properties. If you set `[JsonInclude]` on `private` members or accessors and choose source-generation mode, a `NotSupportedException` will be thrown at run time. +Only `public` properties and fields are supported by default in either serialization mode (reflection or source-generation). However, reflection mode supports the use of `private` members, while source-generation mode doesn't. For example, if you apply the [JsonInclude attribute](xref:System.Text.Json.Serialization.JsonIncludeAttribute) to a `private` property or a property that has a `private` setter or getter, it will be serialized in reflection mode. Source-generation mode supports only `public` or `internal` members and `public` or `internal` accessors of `public` properties. If you set `[JsonInclude]` on `private` members or accessors and choose source-generation mode, a `NotSupportedException` will be thrown at runtime. For information about other known issues with source generation, see the [GitHub issues that are labeled "source-generator"](https://github.com/dotnet/runtime/issues?q=is%3Aopen+is%3Aissue+label%3Aarea-System.Text.Json+label%3Asource-generator) in the *dotnet/runtime* repository. diff --git a/docs/standard/serialization/system-text-json/source-generation.md b/docs/standard/serialization/system-text-json/source-generation.md index dc16d62c62dad..5110451dcffd7 100644 --- a/docs/standard/serialization/system-text-json/source-generation.md +++ b/docs/standard/serialization/system-text-json/source-generation.md @@ -45,7 +45,7 @@ The types of `WeatherForecast` members don't need to be explicitly specified wit :::code language="csharp" source="snippets/source-generation/csharp/ObjectProperties.cs" id="WF"::: -And you know that at run time it might have `boolean` and `int` objects: +And you know that at runtime it might have `boolean` and `int` objects: :::code language="csharp" source="snippets/source-generation/csharp/ObjectProperties.cs" id="WFInit"::: @@ -165,7 +165,7 @@ services.AddControllers().AddJsonOptions( ## Disable reflection defaults -Because System.Text.Json uses reflection by default, calling a basic serialization method can break Native AOT apps, which doesn't support all required reflection APIs. These breaks can be challenging to diagnose since they can be unpredictable, and apps are often debugged using the CoreCLR runtime, where reflection works. Instead, if you explicitly disable reflection-based serialization, breaks are easier to diagnose. Code that uses reflection-based serialization will cause an with a descriptive message to be thrown at run time. +Because System.Text.Json uses reflection by default, calling a basic serialization method can break Native AOT apps, which doesn't support all required reflection APIs. These breaks can be challenging to diagnose since they can be unpredictable, and apps are often debugged using the CoreCLR runtime, where reflection works. Instead, if you explicitly disable reflection-based serialization, breaks are easier to diagnose. Code that uses reflection-based serialization will cause an with a descriptive message to be thrown at runtime. To disable default reflection in your app, set the `JsonSerializerIsReflectionEnabledByDefault` MSBuild property to `false` in your project file: diff --git a/docs/standard/threading/managed-threading-best-practices.md b/docs/standard/threading/managed-threading-best-practices.md index 605e8f9927cbd..2484d2158f6b6 100644 --- a/docs/standard/threading/managed-threading-best-practices.md +++ b/docs/standard/threading/managed-threading-best-practices.md @@ -2,10 +2,10 @@ title: "Managed Threading Best Practices" description: Learn managed threading best practices in .NET. Work with difficult situations such as coordinating many threads or handling blocking threads. ms.date: "10/15/2018" -dev_langs: +dev_langs: - "csharp" - "vb" -helpviewer_keywords: +helpviewer_keywords: - "threading [.NET], design guidelines" - "threading [.NET], best practices" - "managed threading" @@ -13,166 +13,166 @@ ms.assetid: e51988e7-7f4b-4646-a06d-1416cee8d557 --- # Managed threading best practices -Multithreading requires careful programming. For most tasks, you can reduce complexity by queuing requests for execution by thread pool threads. This topic addresses more difficult situations, such as coordinating the work of multiple threads, or handling threads that block. - +Multithreading requires careful programming. For most tasks, you can reduce complexity by queuing requests for execution by thread pool threads. This topic addresses more difficult situations, such as coordinating the work of multiple threads, or handling threads that block. + > [!NOTE] -> Starting with .NET Framework 4, the Task Parallel Library and PLINQ provide APIs that reduce some of the complexity and risks of multi-threaded programming. For more information, see [Parallel Programming in .NET](../parallel-programming/index.md). - -## Deadlocks and race conditions - - Multithreading solves problems with throughput and responsiveness, but in doing so it introduces new problems: deadlocks and race conditions. - -### Deadlocks - - A deadlock occurs when each of two threads tries to lock a resource the other has already locked. Neither thread can make any further progress. - - Many methods of the managed threading classes provide time-outs to help you detect deadlocks. For example, the following code attempts to acquire a lock on an object named `lockObject`. If the lock is not obtained in 300 milliseconds, returns `false`. - -```vb -If Monitor.TryEnter(lockObject, 300) Then - Try - ' Place code protected by the Monitor here. - Finally - Monitor.Exit(lockObject) - End Try -Else - ' Code to execute if the attempt times out. -End If -``` - -```csharp -if (Monitor.TryEnter(lockObject, 300)) { - try { - // Place code protected by the Monitor here. - } - finally { - Monitor.Exit(lockObject); - } -} -else { - // Code to execute if the attempt times out. -} -``` - -### Race conditions - - A race condition is a bug that occurs when the outcome of a program depends on which of two or more threads reaches a particular block of code first. Running the program many times produces different results, and the result of any given run cannot be predicted. - - A simple example of a race condition is incrementing a field. Suppose a class has a private **static** field (**Shared** in Visual Basic) that is incremented every time an instance of the class is created, using code such as `objCt++;` (C#) or `objCt += 1` (Visual Basic). This operation requires loading the value from `objCt` into a register, incrementing the value, and storing it in `objCt`. - - In a multithreaded application, a thread that has loaded and incremented the value might be preempted by another thread which performs all three steps; when the first thread resumes execution and stores its value, it overwrites `objCt` without taking into account the fact that the value has changed in the interim. - - This particular race condition is easily avoided by using methods of the class, such as . To read about other techniques for synchronizing data among multiple threads, see [Synchronizing Data for Multithreading](synchronizing-data-for-multithreading.md). - - Race conditions can also occur when you synchronize the activities of multiple threads. Whenever you write a line of code, you must consider what might happen if a thread were preempted before executing the line (or before any of the individual machine instructions that make up the line), and another thread overtook it. - -## Static members and static constructors - - A class is not initialized until its class constructor (`static` constructor in C#, `Shared Sub New` in Visual Basic) has finished running. To prevent the execution of code on a type that is not initialized, the common language runtime blocks all calls from other threads to `static` members of the class (`Shared` members in Visual Basic) until the class constructor has finished running. - - For example, if a class constructor starts a new thread, and the thread procedure calls a `static` member of the class, the new thread blocks until the class constructor completes. - - This applies to any type that can have a `static` constructor. +> Starting with .NET Framework 4, the Task Parallel Library and PLINQ provide APIs that reduce some of the complexity and risks of multi-threaded programming. For more information, see [Parallel Programming in .NET](../parallel-programming/index.md). + +## Deadlocks and race conditions + + Multithreading solves problems with throughput and responsiveness, but in doing so it introduces new problems: deadlocks and race conditions. + +### Deadlocks + + A deadlock occurs when each of two threads tries to lock a resource the other has already locked. Neither thread can make any further progress. + + Many methods of the managed threading classes provide time-outs to help you detect deadlocks. For example, the following code attempts to acquire a lock on an object named `lockObject`. If the lock is not obtained in 300 milliseconds, returns `false`. + +```vb +If Monitor.TryEnter(lockObject, 300) Then + Try + ' Place code protected by the Monitor here. + Finally + Monitor.Exit(lockObject) + End Try +Else + ' Code to execute if the attempt times out. +End If +``` + +```csharp +if (Monitor.TryEnter(lockObject, 300)) { + try { + // Place code protected by the Monitor here. + } + finally { + Monitor.Exit(lockObject); + } +} +else { + // Code to execute if the attempt times out. +} +``` + +### Race conditions + + A race condition is a bug that occurs when the outcome of a program depends on which of two or more threads reaches a particular block of code first. Running the program many times produces different results, and the result of any given run cannot be predicted. + + A simple example of a race condition is incrementing a field. Suppose a class has a private **static** field (**Shared** in Visual Basic) that is incremented every time an instance of the class is created, using code such as `objCt++;` (C#) or `objCt += 1` (Visual Basic). This operation requires loading the value from `objCt` into a register, incrementing the value, and storing it in `objCt`. + + In a multithreaded application, a thread that has loaded and incremented the value might be preempted by another thread which performs all three steps; when the first thread resumes execution and stores its value, it overwrites `objCt` without taking into account the fact that the value has changed in the interim. + + This particular race condition is easily avoided by using methods of the class, such as . To read about other techniques for synchronizing data among multiple threads, see [Synchronizing Data for Multithreading](synchronizing-data-for-multithreading.md). + + Race conditions can also occur when you synchronize the activities of multiple threads. Whenever you write a line of code, you must consider what might happen if a thread were preempted before executing the line (or before any of the individual machine instructions that make up the line), and another thread overtook it. + +## Static members and static constructors + + A class is not initialized until its class constructor (`static` constructor in C#, `Shared Sub New` in Visual Basic) has finished running. To prevent the execution of code on a type that is not initialized, the common language runtime blocks all calls from other threads to `static` members of the class (`Shared` members in Visual Basic) until the class constructor has finished running. + + For example, if a class constructor starts a new thread, and the thread procedure calls a `static` member of the class, the new thread blocks until the class constructor completes. + + This applies to any type that can have a `static` constructor. ## Number of processors Whether there are multiple processors or only one processor available on a system can influence multithreaded architecture. For more information, see [Number of Processors](/previous-versions/dotnet/netframework-1.1/1c9txz50(v=vs.71)#number-of-processors). -Use the property to determine the number of processors available at run time. - -## General recommendations - -Consider the following guidelines when using multiple threads: - -- Don't use to terminate other threads. Calling `Abort` on another thread is akin to throwing an exception on that thread, without knowing what point that thread has reached in its processing. - -- Don't use and to synchronize the activities of multiple threads. Do use , , , and . - -- Don't control the execution of worker threads from your main program (using events, for example). Instead, design your program so that worker threads are responsible for waiting until work is available, executing it, and notifying other parts of your program when finished. If your worker threads do not block, consider using thread pool threads. is useful in situations where worker threads block. - -- Don't use types as lock objects. That is, avoid code such as `lock(typeof(X))` in C# or `SyncLock(GetType(X))` in Visual Basic, or the use of with objects. For a given type, there is only one instance of per application domain. If the type you take a lock on is public, code other than your own can take locks on it, leading to deadlocks. For additional issues, see [Reliability Best Practices](../../framework/performance/reliability-best-practices.md). - -- Use caution when locking on instances, for example `lock(this)` in C# or `SyncLock(Me)` in Visual Basic. If other code in your application, external to the type, takes a lock on the object, deadlocks could occur. - -- Do ensure that a thread that has entered a monitor always leaves that monitor, even if an exception occurs while the thread is in the monitor. The C# [lock](../../csharp/language-reference/statements/lock.md) statement and the Visual Basic [SyncLock](../../visual-basic/language-reference/statements/synclock-statement.md) statement provide this behavior automatically, employing a **finally** block to ensure that is called. If you cannot ensure that **Exit** will be called, consider changing your design to use **Mutex**. A mutex is automatically released when the thread that currently owns it terminates. - -- Do use multiple threads for tasks that require different resources, and avoid assigning multiple threads to a single resource. For example, any task involving I/O benefits from having its own thread, because that thread will block during I/O operations and thus allow other threads to execute. User input is another resource that benefits from a dedicated thread. On a single-processor computer, a task that involves intensive computation coexists with user input and with tasks that involve I/O, but multiple computation-intensive tasks contend with each other. - -- Consider using methods of the class for simple state changes, instead of using the `lock` statement (`SyncLock` in Visual Basic). The `lock` statement is a good general-purpose tool, but the class provides better performance for updates that must be atomic. Internally, it executes a single lock prefix if there is no contention. In code reviews, watch for code like that shown in the following examples. In the first example, a state variable is incremented: - - ```vb - SyncLock lockObject - myField += 1 - End SyncLock - ``` - - ```csharp +Use the property to determine the number of processors available at runtime. + +## General recommendations + +Consider the following guidelines when using multiple threads: + +- Don't use to terminate other threads. Calling `Abort` on another thread is akin to throwing an exception on that thread, without knowing what point that thread has reached in its processing. + +- Don't use and to synchronize the activities of multiple threads. Do use , , , and . + +- Don't control the execution of worker threads from your main program (using events, for example). Instead, design your program so that worker threads are responsible for waiting until work is available, executing it, and notifying other parts of your program when finished. If your worker threads do not block, consider using thread pool threads. is useful in situations where worker threads block. + +- Don't use types as lock objects. That is, avoid code such as `lock(typeof(X))` in C# or `SyncLock(GetType(X))` in Visual Basic, or the use of with objects. For a given type, there is only one instance of per application domain. If the type you take a lock on is public, code other than your own can take locks on it, leading to deadlocks. For additional issues, see [Reliability Best Practices](../../framework/performance/reliability-best-practices.md). + +- Use caution when locking on instances, for example `lock(this)` in C# or `SyncLock(Me)` in Visual Basic. If other code in your application, external to the type, takes a lock on the object, deadlocks could occur. + +- Do ensure that a thread that has entered a monitor always leaves that monitor, even if an exception occurs while the thread is in the monitor. The C# [lock](../../csharp/language-reference/statements/lock.md) statement and the Visual Basic [SyncLock](../../visual-basic/language-reference/statements/synclock-statement.md) statement provide this behavior automatically, employing a **finally** block to ensure that is called. If you cannot ensure that **Exit** will be called, consider changing your design to use **Mutex**. A mutex is automatically released when the thread that currently owns it terminates. + +- Do use multiple threads for tasks that require different resources, and avoid assigning multiple threads to a single resource. For example, any task involving I/O benefits from having its own thread, because that thread will block during I/O operations and thus allow other threads to execute. User input is another resource that benefits from a dedicated thread. On a single-processor computer, a task that involves intensive computation coexists with user input and with tasks that involve I/O, but multiple computation-intensive tasks contend with each other. + +- Consider using methods of the class for simple state changes, instead of using the `lock` statement (`SyncLock` in Visual Basic). The `lock` statement is a good general-purpose tool, but the class provides better performance for updates that must be atomic. Internally, it executes a single lock prefix if there is no contention. In code reviews, watch for code like that shown in the following examples. In the first example, a state variable is incremented: + + ```vb + SyncLock lockObject + myField += 1 + End SyncLock + ``` + + ```csharp lock(lockObject) - { - myField++; - } - ``` - - You can improve performance by using the method instead of the `lock` statement, as follows: - - ```vb - System.Threading.Interlocked.Increment(myField) - ``` - - ```csharp - System.Threading.Interlocked.Increment(myField); - ``` - + { + myField++; + } + ``` + + You can improve performance by using the method instead of the `lock` statement, as follows: + + ```vb + System.Threading.Interlocked.Increment(myField) + ``` + + ```csharp + System.Threading.Interlocked.Increment(myField); + ``` + > [!NOTE] - > Use the method for atomic increments larger than 1. - - In the second example, a reference type variable is updated only if it is a null reference (`Nothing` in Visual Basic). - - ```vb - If x Is Nothing Then - SyncLock lockObject - If x Is Nothing Then - x = y - End If - End SyncLock - End If - ``` - - ```csharp - if (x == null) - { - lock (lockObject) - { + > Use the method for atomic increments larger than 1. + + In the second example, a reference type variable is updated only if it is a null reference (`Nothing` in Visual Basic). + + ```vb + If x Is Nothing Then + SyncLock lockObject + If x Is Nothing Then + x = y + End If + End SyncLock + End If + ``` + + ```csharp + if (x == null) + { + lock (lockObject) + { x ??= y; - } - } - ``` - - Performance can be improved by using the method instead, as follows: - - ```vb - System.Threading.Interlocked.CompareExchange(x, y, Nothing) - ``` - - ```csharp - System.Threading.Interlocked.CompareExchange(ref x, y, null); - ``` - + } + } + ``` + + Performance can be improved by using the method instead, as follows: + + ```vb + System.Threading.Interlocked.CompareExchange(x, y, Nothing) + ``` + + ```csharp + System.Threading.Interlocked.CompareExchange(ref x, y, null); + ``` + > [!NOTE] > The method overload provides a type-safe alternative for reference types. - -## Recommendations for class libraries - -Consider the following guidelines when designing class libraries for multithreading: - -- Avoid the need for synchronization, if possible. This is especially true for heavily used code. For example, an algorithm might be adjusted to tolerate a race condition rather than eliminate it. Unnecessary synchronization decreases performance and creates the possibility of deadlocks and race conditions. - -- Make static data (`Shared` in Visual Basic) thread safe by default. - -- Do not make instance data thread safe by default. Adding locks to create thread-safe code decreases performance, increases lock contention, and creates the possibility for deadlocks to occur. In common application models, only one thread at a time executes user code, which minimizes the need for thread safety. For this reason, the .NET class libraries are not thread safe by default. - -- Avoid providing static methods that alter static state. In common server scenarios, static state is shared across requests, which means multiple threads can execute that code at the same time. This opens up the possibility of threading bugs. Consider using a design pattern that encapsulates data into instances that are not shared across requests. Furthermore, if static data are synchronized, calls between static methods that alter state can result in deadlocks or redundant synchronization, adversely affecting performance. - + +## Recommendations for class libraries + +Consider the following guidelines when designing class libraries for multithreading: + +- Avoid the need for synchronization, if possible. This is especially true for heavily used code. For example, an algorithm might be adjusted to tolerate a race condition rather than eliminate it. Unnecessary synchronization decreases performance and creates the possibility of deadlocks and race conditions. + +- Make static data (`Shared` in Visual Basic) thread safe by default. + +- Do not make instance data thread safe by default. Adding locks to create thread-safe code decreases performance, increases lock contention, and creates the possibility for deadlocks to occur. In common application models, only one thread at a time executes user code, which minimizes the need for thread safety. For this reason, the .NET class libraries are not thread safe by default. + +- Avoid providing static methods that alter static state. In common server scenarios, static state is shared across requests, which means multiple threads can execute that code at the same time. This opens up the possibility of threading bugs. Consider using a design pattern that encapsulates data into instances that are not shared across requests. Furthermore, if static data are synchronized, calls between static methods that alter state can result in deadlocks or redundant synchronization, adversely affecting performance. + ## See also - [Threading](managed-threading-basics.md) diff --git a/docs/standard/threading/thread-local-storage-thread-relative-static-fields-and-data-slots.md b/docs/standard/threading/thread-local-storage-thread-relative-static-fields-and-data-slots.md index 93a6859a30a47..a15307000f636 100644 --- a/docs/standard/threading/thread-local-storage-thread-relative-static-fields-and-data-slots.md +++ b/docs/standard/threading/thread-local-storage-thread-relative-static-fields-and-data-slots.md @@ -2,7 +2,7 @@ description: "Learn more about: Thread Local Storage: Thread-Relative Static Fields and Data Slots" title: "Thread Local Storage: Thread-Relative Static Fields and Data Slots" ms.date: "03/30/2017" -helpviewer_keywords: +helpviewer_keywords: - "threading [.NET], local storage" - "threading [.NET], thread-relative static fields" - "local thread storage" @@ -11,48 +11,48 @@ ms.assetid: c633a4dc-a790-4ed1-96b5-f72bd968b284 --- # Thread Local Storage: Thread-Relative Static Fields and Data Slots -You can use managed thread local storage (TLS) to store data that's unique to a thread and application domain. .NET provides two ways to use managed TLS: thread-relative static fields and data slots. - -- Use thread-relative static fields (thread-relative `Shared` fields in Visual Basic) if you can anticipate your exact needs at compile time. Thread-relative static fields provide the best performance. They also give you the benefits of compile-time type checking. - -- Use data slots when your actual requirements might be discovered only at run time. Data slots are slower and more awkward to use than thread-relative static fields, and data is stored as type , so you must cast it to the correct type before you use it. - - In unmanaged C++, you use `TlsAlloc` to allocate slots dynamically and `__declspec(thread)` to declare that a variable should be allocated in thread-relative storage. Thread-relative static fields and data slots provide the managed version of this behavior. - -You can use the class to create thread-local objects that are initialized lazily when the object is first consumed. For more information, see [Lazy Initialization](../../framework/performance/lazy-initialization.md). - -## Uniqueness of Data in Managed TLS - - Whether you use thread-relative static fields or data slots, data in managed TLS is unique to the combination of thread and application domain. - -- Within an application domain, one thread cannot modify data from another thread, even when both threads use the same field or slot. - -- When a thread accesses the same field or slot from multiple application domains, a separate value is maintained in each application domain. - - For example, if a thread sets the value of a thread-relative static field, enters another application domain, and then retrieves the value of the field, the value retrieved in the second application domain differs from the value in the first application domain. Setting a new value for the field in the second application domain does not affect the field's value in the first application domain. - - Similarly, when a thread gets the same named data slot in two different application domains, the data in the first application domain remains independent of the data in the second application domain. - -## Thread-Relative Static Fields - - If you know that a piece of data is always unique to a thread and application-domain combination, apply the attribute to the static field. Use the field as you would use any other static field. The data in the field is unique to each thread that uses it. - - Thread-relative static fields provide better performance than data slots and have the benefit of compile-time type checking. - - Be aware that any class constructor code will run on the first thread in the first context that accesses the field. In all other threads or contexts in the same application domain, the fields will be initialized to `null` (`Nothing` in Visual Basic) if they are reference types, or to their default values if they are value types. Therefore, you should not rely on class constructors to initialize thread-relative static fields. Instead, avoid initializing thread-relative static fields and assume that they are initialized to `null` (`Nothing`) or to their default values. - -## Data Slots - -.NET provides dynamic data slots that are unique to a combination of thread and application domain. There are two types of data slots: named slots and unnamed slots. Both are implemented by using the structure. - -- To create a named data slot, use the or method. To get a reference to an existing named slot, pass its name to the method. - -- To create an unnamed data slot, use the method. - - For both named and unnamed slots, use the and methods to set and retrieve the information in the slot. These are static methods that always act on the data for the thread that is currently executing them. - - Named slots can be convenient, because you can retrieve the slot when you need it by passing its name to the method, instead of maintaining a reference to an unnamed slot. However, if another component uses the same name for its thread-relative storage and a thread executes code from both your component and the other component, the two components might corrupt each other's data. (This scenario assumes that both components are running in the same application domain, and that they are not designed to share the same data.) - +You can use managed thread local storage (TLS) to store data that's unique to a thread and application domain. .NET provides two ways to use managed TLS: thread-relative static fields and data slots. + +- Use thread-relative static fields (thread-relative `Shared` fields in Visual Basic) if you can anticipate your exact needs at compile time. Thread-relative static fields provide the best performance. They also give you the benefits of compile-time type checking. + +- Use data slots when your actual requirements might be discovered only at runtime. Data slots are slower and more awkward to use than thread-relative static fields, and data is stored as type , so you must cast it to the correct type before you use it. + + In unmanaged C++, you use `TlsAlloc` to allocate slots dynamically and `__declspec(thread)` to declare that a variable should be allocated in thread-relative storage. Thread-relative static fields and data slots provide the managed version of this behavior. + +You can use the class to create thread-local objects that are initialized lazily when the object is first consumed. For more information, see [Lazy Initialization](../../framework/performance/lazy-initialization.md). + +## Uniqueness of Data in Managed TLS + + Whether you use thread-relative static fields or data slots, data in managed TLS is unique to the combination of thread and application domain. + +- Within an application domain, one thread cannot modify data from another thread, even when both threads use the same field or slot. + +- When a thread accesses the same field or slot from multiple application domains, a separate value is maintained in each application domain. + + For example, if a thread sets the value of a thread-relative static field, enters another application domain, and then retrieves the value of the field, the value retrieved in the second application domain differs from the value in the first application domain. Setting a new value for the field in the second application domain does not affect the field's value in the first application domain. + + Similarly, when a thread gets the same named data slot in two different application domains, the data in the first application domain remains independent of the data in the second application domain. + +## Thread-Relative Static Fields + + If you know that a piece of data is always unique to a thread and application-domain combination, apply the attribute to the static field. Use the field as you would use any other static field. The data in the field is unique to each thread that uses it. + + Thread-relative static fields provide better performance than data slots and have the benefit of compile-time type checking. + + Be aware that any class constructor code will run on the first thread in the first context that accesses the field. In all other threads or contexts in the same application domain, the fields will be initialized to `null` (`Nothing` in Visual Basic) if they are reference types, or to their default values if they are value types. Therefore, you should not rely on class constructors to initialize thread-relative static fields. Instead, avoid initializing thread-relative static fields and assume that they are initialized to `null` (`Nothing`) or to their default values. + +## Data Slots + +.NET provides dynamic data slots that are unique to a combination of thread and application domain. There are two types of data slots: named slots and unnamed slots. Both are implemented by using the structure. + +- To create a named data slot, use the or method. To get a reference to an existing named slot, pass its name to the method. + +- To create an unnamed data slot, use the method. + + For both named and unnamed slots, use the and methods to set and retrieve the information in the slot. These are static methods that always act on the data for the thread that is currently executing them. + + Named slots can be convenient, because you can retrieve the slot when you need it by passing its name to the method, instead of maintaining a reference to an unnamed slot. However, if another component uses the same name for its thread-relative storage and a thread executes code from both your component and the other component, the two components might corrupt each other's data. (This scenario assumes that both components are running in the same application domain, and that they are not designed to share the same data.) + ## See also - From 391d34f79465218bf8ce419c161c8302aaf2c6d4 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:37:52 +0000 Subject: [PATCH 22/24] Document breaking change: ToolCommandName no longer set for non-tool packages (#50274) --- docs/core/compatibility/10.0.md | 1 + .../sdk/10.0/toolcommandname-not-set.md | 54 +++++++++++++++++++ docs/core/compatibility/toc.yml | 2 + 3 files changed, 57 insertions(+) create mode 100644 docs/core/compatibility/sdk/10.0/toolcommandname-not-set.md diff --git a/docs/core/compatibility/10.0.md b/docs/core/compatibility/10.0.md index 1b3c5e71df340..2f61c764e29f2 100644 --- a/docs/core/compatibility/10.0.md +++ b/docs/core/compatibility/10.0.md @@ -144,6 +144,7 @@ If you're migrating an app to .NET 10, the breaking changes listed here might af | [HTTP warnings promoted to errors in `dotnet package list` and `dotnet package search`](sdk/10.0/http-warnings-to-errors.md) | Behavioral/source incompatible change | | [NUGET_ENABLE_ENHANCED_HTTP_RETRY environment variable removed](sdk/10.0/nuget-enhanced-http-retry-removed.md) | Behavioral change | | [NuGet logs an error for invalid package IDs](sdk/10.0/nuget-packageid-validation.md) | Behavioral change | +| [`ToolCommandName` not set for non-tool packages](sdk/10.0/toolcommandname-not-set.md) | Source incompatible | ## Serialization diff --git a/docs/core/compatibility/sdk/10.0/toolcommandname-not-set.md b/docs/core/compatibility/sdk/10.0/toolcommandname-not-set.md new file mode 100644 index 0000000000000..419aa14d446bc --- /dev/null +++ b/docs/core/compatibility/sdk/10.0/toolcommandname-not-set.md @@ -0,0 +1,54 @@ +--- +title: "Breaking change - ToolCommandName is not set for non tool packages" +description: "Learn about the breaking change in .NET 10 where ToolCommandName is only set for projects with PackAsTool set to true." +ms.date: 12/02/2025 +ai-usage: ai-assisted +--- + +# `ToolCommandName` not set for non-tool packages + +The `ToolCommandName` property is no longer set automatically for all projects during build or package operations. It's now only set when `PackAsTool` is set to `true`, indicating that the project is a .NET tool package. + +## Version introduced + +.NET 10 + +## Previous behavior + +Previously, the `ToolCommandName` property was always set during build or pack operations, regardless of whether the project was configured as a tool package. + +## New behavior + +Starting in .NET 10, the `ToolCommandName` property is only set when `PackAsTool` is set to `true`, indicating that the project is a .NET tool. + +## Type of breaking change + +This change can affect [source compatibility](../../categories.md#source-compatibility). + +## Reason for change + +The `ToolCommandName` property doesn't make sense for non-tool projects. Setting it for all projects was unnecessary and could cause confusion about the project's purpose. + +## Recommended action + +If your project relies on the `ToolCommandName` property being set, you have two options: + +- Set the property explicitly in your project file: + + ```xml + + your-command-name + + ``` + +- Convert your project to a .NET tool by setting `PackAsTool` to `true`: + + ```xml + + true + + ``` + +## Affected APIs + +None. diff --git a/docs/core/compatibility/toc.yml b/docs/core/compatibility/toc.yml index 98e7aa1f57fe9..c83d1fb7215ff 100644 --- a/docs/core/compatibility/toc.yml +++ b/docs/core/compatibility/toc.yml @@ -176,6 +176,8 @@ items: href: sdk/10.0/nu1015-packagereference-version.md - name: PrunePackageReference privatizes direct prunable references href: sdk/10.0/prune-packagereference-privateassets.md + - name: "'ToolCommandName' not set for non-tool packages" + href: sdk/10.0/toolcommandname-not-set.md - name: Serialization items: - name: System.Text.Json checks for property name conflicts From 154d3bec1f11ce3a4c5130d981494572e1e6d620 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:42:13 -0800 Subject: [PATCH 23/24] remove outdated article (#50337) --- .openpublishing.redirection.core.json | 4 + .../core/testing/unit-testing-with-copilot.md | 84 ------------------- .../code-analysis/style-rules/ide3000.md | 1 - docs/navigate/devops-testing/toc.yml | 2 - 4 files changed, 4 insertions(+), 87 deletions(-) delete mode 100644 docs/core/testing/unit-testing-with-copilot.md diff --git a/.openpublishing.redirection.core.json b/.openpublishing.redirection.core.json index d72d8c27a8c73..bfaf313158f1a 100644 --- a/.openpublishing.redirection.core.json +++ b/.openpublishing.redirection.core.json @@ -1227,6 +1227,10 @@ "redirect_url": "/dotnet/core/testing/unit-testing-platform-extensions-vstest-bridge#runsettings-support", "redirect_document_id": true }, + { + "source_path_from_root": "/docs/core/testing/unit-testing-with-copilot.md", + "redirect_url": "/visualstudio/ide/copilot-chat-context#slash-commands" + }, { "source_path_from_root": "/docs/core/tools/cli-msbuild-architecture.md", "redirect_url": "/dotnet/core/tools/dotnet-migrate" diff --git a/docs/core/testing/unit-testing-with-copilot.md b/docs/core/testing/unit-testing-with-copilot.md deleted file mode 100644 index f6c100c90ff54..0000000000000 --- a/docs/core/testing/unit-testing-with-copilot.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Generate Unit Tests with Copilot -author: sigmade -description: How to generate unit tests and test projects in C# using the xUnit framework with the help of Visual Studio commands and GitHub Copilot -ms.date: 01/12/2025 -ms.update-cycle: 180-days -ms.collection: ce-skilling-ai-copilot ---- - -# Generate unit tests with GitHub Copilot - -In this article, you explore how to generate unit tests and test projects in C# using the xUnit framework with the help of Visual Studio commands and GitHub Copilot. Using Visual Studio in combination with GitHub Copilot significantly simplifies the process of generating and writing unit tests. - -## Create a test project - -Imagine that there's a `ProductService` class with a `GetProductById` method that depends on the `IProductDataStorage` and `ICacheClient` interfaces. - -```csharp -public class ProductService( - IProductDataStorage productDataStorage, - ICacheClient cacheClient) -{ - public async Task GetProductById(int productId) - { - var product = await cacheClient.GetProduct(productId); - - if (product is not null) - { - return product; - } - - product = await productDataStorage.GetProduct(productId); - - if (product is not null) - { - await _cacheClient.SetProduct(product); - } - - return product; - } -} -``` - -To generate a test project and a stub method, follow these steps: - -- Select the method. -- Right-click and select **Create Unit Tests**. - -:::image type="content" source="media/create-unit-test.png" lightbox="media/create-unit-test.png" alt-text="Command Create Unit Tests"::: - -In the **Create Unit Tests** dialog, select **xUnit** from the **Test Framework** dropdown menu. - -> [!NOTE] -> The **Create Unit Tests** command defaults to the MSTest framework. However, since this example uses xUnit, you need to install the Visual Studio extension [xUnit.net.TestGenerator2022](https://marketplace.visualstudio.com/items?itemName=YowkoTsai.xunitnettestgenerator2022). - -:::image type="content" source="media/create-unit-test-window.png" lightbox="media/create-unit-test-window.png" alt-text="Create Unit Tests window"::: - -- If you don't have a test project yet, choose **New Test Project** or select an existing one. -- If necessary, specify a template for the namespace, class, and method name, then click **OK**. - -After a few seconds, Visual Studio will pull in the necessary packages, and you'll get a generated xUnit project with the required packages and structure, a reference to the project being tested, and the `ProductServiceTests` class and a stub method. - -:::image type="content" source="media/test-mehod-stub.png" lightbox="media/test-mehod-stub.png" alt-text="Generated stub method"::: - -## Generate the tests themselves - -- Select the method being tested again. -- Right-click and select **Ask Copilot**. -- Enter a simple prompt, such as: - - "Generate unit tests using xunit, nsubstitute and insert the result into #ProductServiceTests file." - - You need to select your test class when you type the `#` character. - -> [!TIP] -> For quick search, it's desirable that `ProductServiceTests` is open in a separate tab. - -:::image type="content" source="media/test-copilot-prompt.png" lightbox="media/test-copilot-prompt.png" alt-text="Prompt for generate tests"::: - -Execute the prompt, click **Accept**, and Copilot generates the test code. After that, it remains to install the necessary packages. - -When the packages are installed, the tests can be run. This example worked on the first try: Copilot knows how to work with NSubstitute, and all dependencies were defined through interfaces. - -:::image type="content" source="media/test-copilot-result.png" lightbox="media/test-copilot-result.png" alt-text="Generated tests"::: diff --git a/docs/fundamentals/code-analysis/style-rules/ide3000.md b/docs/fundamentals/code-analysis/style-rules/ide3000.md index 4b7ff0fb3e377..ef046c4ffa518 100644 --- a/docs/fundamentals/code-analysis/style-rules/ide3000.md +++ b/docs/fundamentals/code-analysis/style-rules/ide3000.md @@ -75,5 +75,4 @@ For more information, see [How to suppress code analysis warnings](../suppress-w ## See also -- [Generate unit tests with GitHub Copilot](../../../core/testing/unit-testing-with-copilot.md) - [Code style rules reference](index.md) diff --git a/docs/navigate/devops-testing/toc.yml b/docs/navigate/devops-testing/toc.yml index 60e8585352339..c32bcee014f3e 100644 --- a/docs/navigate/devops-testing/toc.yml +++ b/docs/navigate/devops-testing/toc.yml @@ -53,8 +53,6 @@ items: - name: Organize a project and test with xUnit href: ../../core/tutorials/testing-with-cli.md displayName: tutorials, cli - - name: Generate unit tests with GitHub Copilot - href: ../../core/testing/unit-testing-with-copilot.md - name: NUnit items: - name: C# unit testing From 82fa4f3614f701fa577739ac975a3071ff80820a Mon Sep 17 00:00:00 2001 From: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:44:40 -0800 Subject: [PATCH 24/24] Update package index with latest published versions (#50336) --- docs/azure/includes/dotnet-all.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index 4af77a486805f..db66f88482541 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -544,7 +544,7 @@ | Functions extension for Application Insights | NuGet [1.0.0-preview4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ApplicationInsights/1.0.0-preview4) | | | | Functions extension for Azure Mobile Apps | NuGet [3.0.0-beta8](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.MobileApps/3.0.0-beta8) | | GitHub [3.0.0-beta8](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0-beta8/src/WebJobs.Extensions.MobileApps) | | Functions extension for Azure SQL and SQL Server | NuGet [3.1.527](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Sql/3.1.527) | | | -| Functions extension for Cosmos DB | NuGet [4.11.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.11.0)
NuGet [4.12.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.12.0-preview.1) | | GitHub [4.11.0](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/cosmos-v3.0.7/src/WebJobs.Extensions.CosmosDB) | +| Functions extension for Cosmos DB | NuGet [4.11.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.11.0)
NuGet [4.13.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.13.0-preview.1) | | GitHub [4.11.0](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/cosmos-v3.0.7/src/WebJobs.Extensions.CosmosDB) | | Functions extension for DocumentDB | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DocumentDB/1.3.0) | | GitHub [1.3.0](https://github.com/Azure/azure-webjobs-sdk-extensions) | | Functions extension for Durable Task Framework | NuGet [3.8.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask/3.8.0) | [docs](/dotnet/api/overview/azure/functions) | GitHub [3.8.0](https://github.com/Azure/azure-functions-durable-extension/tree/v2.2.2/src/WebJobs.Extensions.DurableTask) | | Functions extension for Durable Task Framework - isolated worker | NuGet [1.10.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.DurableTask/1.10.0) | | |