diff --git a/.github/ISSUE_TEMPLATE/04-csharp-new-fundamentals-reference.yml b/.github/ISSUE_TEMPLATE/04-csharp-new-fundamentals-reference.yml
index 6114867558c22..88169066f89aa 100644
--- a/.github/ISSUE_TEMPLATE/04-csharp-new-fundamentals-reference.yml
+++ b/.github/ISSUE_TEMPLATE/04-csharp-new-fundamentals-reference.yml
@@ -1,8 +1,8 @@
-name: "C# 14 - New feature - Fundamentals and reference"
-description: Create the issue for adding reference docs and optional fundamentals updates for a new feature in C# 14
-title: "[C# 14-Fundamentals and reference]: New Feature - "
+name: "C# 15 - New feature - Fundamentals and reference"
+description: Create the issue for adding reference docs and optional fundamentals updates for a new feature in C# 15
+title: "[C# 15-Fundamentals and reference]: New Feature - "
labels:
- - ":checkered_flag: Release: .NET 10"
+ - ":checkered_flag: Release: .NET 11"
- dotnet-csharp/svc
- whats-new/subsvc
assignees:
@@ -11,18 +11,16 @@ body:
- type: dropdown
id: version
attributes:
- label: Visual Studio release
- description: What Visual Studio (preview) contains this feature?
+ label: .NET 11 Preview
+ description: Which .NET 11 Preview version contains this feature?
options:
- - "17.13.p3"
- - "17.13"
- - "17.14.p1"
- - "17.14.p2"
- - "17.14.p3"
- - "17.14.p4"
- - "17.14.p5"
- - "17.14.p6"
- - "17.14"
+ - ".NET 11 Preview 1"
+ - ".NET 11 Preview 2"
+ - ".NET 11 Preview 3"
+ - ".NET 11 Preview 4"
+ - ".NET 11 Preview 5"
+ - ".NET 11 Preview 6"
+ - ".NET 11 Preview 7"
- "other - specify below"
- type: input
id: Speclet
diff --git a/.github/ISSUE_TEMPLATE/05-csharp-new-errors-warnings.yml b/.github/ISSUE_TEMPLATE/05-csharp-new-errors-warnings.yml
index 94f42d700d9fc..0c5d4ea4dc233 100644
--- a/.github/ISSUE_TEMPLATE/05-csharp-new-errors-warnings.yml
+++ b/.github/ISSUE_TEMPLATE/05-csharp-new-errors-warnings.yml
@@ -1,8 +1,8 @@
-name: "C# 14 - New feature - Errors and warnings"
-description: Create the issue for adding reference docs for new compiler warnings and errors added in a new feature in C# 14
-title: "[C# 14-Errors and warnings]: New Feature - "
+name: "C# 15 - New feature - Errors and warnings"
+description: Create the issue for adding reference docs for new compiler warnings and errors added in a new feature in C# 15
+title: "[C# 15-Errors and warnings]: New Feature - "
labels:
- - ":checkered_flag: Release: .NET 10"
+ - ":checkered_flag: Release: .NET 11"
- okr-curation
- dotnet-csharp/svc
- whats-new/subsvc
@@ -12,18 +12,16 @@ body:
- type: dropdown
id: version
attributes:
- label: Visual Studio release
- description: What Visual Studio (preview) contains this feature?
+ label: .NET 11 Preview
+ description: Which .NET 11 Preview version contains this feature?
options:
- - "17.13.p3"
- - "17.13"
- - "17.14.p1"
- - "17.14.p2"
- - "17.14.p3"
- - "17.14.p4"
- - "17.14.p5"
- - "17.14.p6"
- - "17.14"
+ - ".NET 11 Preview 1"
+ - ".NET 11 Preview 2"
+ - ".NET 11 Preview 3"
+ - ".NET 11 Preview 4"
+ - ".NET 11 Preview 5"
+ - ".NET 11 Preview 6"
+ - ".NET 11 Preview 7"
- "other - specify below"
- type: input
id: Speclet
diff --git a/.github/ISSUE_TEMPLATE/06-csharp-new-tutorials.yml b/.github/ISSUE_TEMPLATE/06-csharp-new-tutorials.yml
index 0760c0d76eef5..2ff75e6c867da 100644
--- a/.github/ISSUE_TEMPLATE/06-csharp-new-tutorials.yml
+++ b/.github/ISSUE_TEMPLATE/06-csharp-new-tutorials.yml
@@ -1,8 +1,8 @@
-name: "C# 14 - New feature - Additional tutorials"
-description: Create the issue for adding new tutorials for a new feature in C# 14
-title: "[C# 14-Tutorials]: New Feature - "
+name: "C# 15 - New feature - Additional tutorials"
+description: Create the issue for adding new tutorials for a new feature in C# 15
+title: "[C# 15-Tutorials]: New Feature - "
labels:
- - ":checkered_flag: Release: .NET 10"
+ - ":checkered_flag: Release: .NET 11"
- dotnet-csharp/svc
- whats-new/subsvc
assignees:
@@ -11,18 +11,16 @@ body:
- type: dropdown
id: version
attributes:
- label: Visual Studio release
- description: What Visual Studio (preview) contains this feature?
+ label: .NET 11 Preview
+ description: Which .NET 11 Preview contains this feature?
options:
- - "17.13.p3"
- - "17.13"
- - "17.14.p1"
- - "17.14.p2"
- - "17.14.p3"
- - "17.14.p4"
- - "17.14.p5"
- - "17.14.p6"
- - "17.14"
+ - ".NET 11 Preview 1"
+ - ".NET 11 Preview 2"
+ - ".NET 11 Preview 3"
+ - ".NET 11 Preview 4"
+ - ".NET 11 Preview 5"
+ - ".NET 11 Preview 6"
+ - ".NET 11 Preview 7"
- "other - specify below"
- type: input
id: Speclet
diff --git a/.github/workflows/check-for-build-warnings.yml b/.github/workflows/check-for-build-warnings.yml
index 606fd61fcc9a4..8de6e8d71e647 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/cleanrepo-orphaned-articles.yml b/.github/workflows/cleanrepo-orphaned-articles.yml
index 25b7c4e9f4c1e..8c348f340ef5f 100644
--- a/.github/workflows/cleanrepo-orphaned-articles.yml
+++ b/.github/workflows/cleanrepo-orphaned-articles.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-orphaned-articles
title: "Monthly chores: Delete orphaned articles"
diff --git a/.github/workflows/cleanrepo-orphaned-images.yml b/.github/workflows/cleanrepo-orphaned-images.yml
index 23089f6ae223c..c183cd5da8e84 100644
--- a/.github/workflows/cleanrepo-orphaned-images.yml
+++ b/.github/workflows/cleanrepo-orphaned-images.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-orphaned-images
title: "Monthly chores: Delete orphaned images"
diff --git a/.github/workflows/cleanrepo-orphaned-includes.yml b/.github/workflows/cleanrepo-orphaned-includes.yml
index 159fc51b28523..f7aaf0de88347 100644
--- a/.github/workflows/cleanrepo-orphaned-includes.yml
+++ b/.github/workflows/cleanrepo-orphaned-includes.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-orphaned-includes
title: "Monthly chores: Delete orphaned include files"
diff --git a/.github/workflows/cleanrepo-orphaned-snippets.yml b/.github/workflows/cleanrepo-orphaned-snippets.yml
index cce1799bc815d..037c9ed693ce7 100644
--- a/.github/workflows/cleanrepo-orphaned-snippets.yml
+++ b/.github/workflows/cleanrepo-orphaned-snippets.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-orphaned-snippets
title: "Monthly chores: Delete orphaned snippets"
diff --git a/.github/workflows/cleanrepo-redirect-hops.yml b/.github/workflows/cleanrepo-redirect-hops.yml
index 761cab9629bc8..7b5d456d19725 100644
--- a/.github/workflows/cleanrepo-redirect-hops.yml
+++ b/.github/workflows/cleanrepo-redirect-hops.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-remove-hops
title: "Monthly chores: Remove redirect hops"
diff --git a/.github/workflows/cleanrepo-relative-links.yml b/.github/workflows/cleanrepo-relative-links.yml
index b097c6d3c84f4..8a5c30dc821be 100644
--- a/.github/workflows/cleanrepo-relative-links.yml
+++ b/.github/workflows/cleanrepo-relative-links.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-relative-links
title: "Monthly chores: Use relative links"
diff --git a/.github/workflows/cleanrepo-replace-redirects.yml b/.github/workflows/cleanrepo-replace-redirects.yml
index 23f8aedb2970f..34cef4a14d119 100644
--- a/.github/workflows/cleanrepo-replace-redirects.yml
+++ b/.github/workflows/cleanrepo-replace-redirects.yml
@@ -17,11 +17,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Call clean repo
- name: Clean repo
@@ -35,7 +35,7 @@ jobs:
# Create the PR for the work done by the "clean repo" tool
- name: create-pull-request
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: cleanrepo-replace-redirects
title: "Monthly chores: Replace redirect targets"
diff --git a/.github/workflows/dependabot-bot.yml b/.github/workflows/dependabot-bot.yml
index 299837973ecc8..bbe2989d27f21 100644
--- a/.github/workflows/dependabot-bot.yml
+++ b/.github/workflows/dependabot-bot.yml
@@ -26,11 +26,11 @@ jobs:
# Checkout the repo into the workspace within the VM
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# - name: Setup .NET
# uses: actions/setup-dotnet@4d4a70f4a5b2a5a5329f13be4ac933f2c9206ac0
# with:
@@ -54,7 +54,7 @@ jobs:
dependabot-yml-path: ".github/dependabot.yml"
- name: Create pull request
if: github.event_name == 'workflow_dispatch' || github.repository_owner == 'dotnet'
- uses: peter-evans/create-pull-request@98357b18bf14b5342f975ff684046ec3b2a07725 #v8.0.0
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
branch: create-dependabotconfig-pull-request/patch
title: "Update dependabot.yml - automatically."
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index 93101e7964ad9..222623af3d2a5 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -17,11 +17,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- name: 'Checkout Repository'
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: 'Dependency Review'
uses: actions/dependency-review-action@3c4e3dcb1aa7874d2c16be7d79418e9b7efd6261 # v4.8.2
diff --git a/.github/workflows/do-not-merge-label-check.yml b/.github/workflows/do-not-merge-label-check.yml
index e4685b13e99e8..8c55958a9e78b 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/docs-verifier.yml b/.github/workflows/docs-verifier.yml
index 4c344b7f593f3..b326b60ebe051 100644
--- a/.github/workflows/docs-verifier.yml
+++ b/.github/workflows/docs-verifier.yml
@@ -14,12 +14,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- name: Checkout the repository
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Validate
uses: dotnet/docs-actions/actions/docs-verifier@5e8bcc78465d45a7544bba56509a1a69922b6a5a # main
diff --git a/.github/workflows/live-protection.yml b/.github/workflows/live-protection.yml
index 2015c7365371f..9eb0c0fbb9c97 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml
index 89e3036a5e1c0..da0ca5d1b61fd 100644
--- a/.github/workflows/markdownlint.yml
+++ b/.github/workflows/markdownlint.yml
@@ -22,11 +22,11 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: DavidAnson/markdownlint-cli2-action@07035fd053f7be764496c0f8d8f9f41f98305101 # v22.0.0
with:
config: ".markdownlint-cli2.jsonc"
diff --git a/.github/workflows/profanity-filter.yml b/.github/workflows/profanity-filter.yml
index 5dbe430c6de79..4bb8eddabab2e 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/quest-bulk.yml b/.github/workflows/quest-bulk.yml
index c75923272f1a9..fc5b09fcc21be 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/quest.yml b/.github/workflows/quest.yml
index d6a458abd935b..842316eae22cb 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml
index d45656b0b4c0f..77aa21bc2709a 100644
--- a/.github/workflows/scorecards.yml
+++ b/.github/workflows/scorecards.yml
@@ -31,12 +31,12 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- name: "Checkout code"
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
@@ -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@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v3.29.5
+ uses: github/codeql-action/upload-sarif@b20883b0cd1f46c72ae0ba6d1090936928f9fa30 # v3.29.5
with:
sarif_file: results.sarif
diff --git a/.github/workflows/snippets5000.yml b/.github/workflows/snippets5000.yml
index ecc882920fb30..79f7a32212678 100644
--- a/.github/workflows/snippets5000.yml
+++ b/.github/workflows/snippets5000.yml
@@ -31,12 +31,12 @@ jobs:
steps:
# Checkout the repository for the PR
- name: Harden Runner
- uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
- name: Checkout repository
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #@v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #@v6.0.2
# Get the latest preview SDK (or sdk not installed by the runner)
- name: Setup .NET
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index c4095208f441f..ae280d83e4aa9 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/.github/workflows/version-sweep.yml b/.github/workflows/version-sweep.yml
index d3fc8d292580b..2b18017fb3c78 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@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
+ uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
with:
egress-policy: audit
diff --git a/docs/ai/overview.md b/docs/ai/overview.md
index 1a47c46923936..ef3362204bde4 100644
--- a/docs/ai/overview.md
+++ b/docs/ai/overview.md
@@ -19,6 +19,22 @@ Millions of developers use .NET to create applications that run on the web, on m
* Runs on top of the most popular web servers and cloud platforms.
* Provides powerful tooling to edit, debug, test, and deploy.
+## Supported AI providers
+
+.NET libraries support a wide range of AI service providers, enabling you to build applications with the AI platform that best fits your needs. The following table lists the major AI providers that integrate with `Microsoft.Extensions.AI`:
+
+| Provider | Description |
+|----------|------------------------|---------------------------|-----------------|-------------|
+| OpenAI | Direct integration with OpenAI's models including GPT-4, GPT-3.5, and DALL-E |
+| Azure OpenAI | Enterprise-grade OpenAI models hosted on Azure with enhanced security and compliance |
+| Azure AI Foundry | Microsoft's managed platform for building and deploying AI agents at scale |
+| GitHub Models | Access to models available through GitHub's AI model marketplace |
+| Ollama | Run open-source models locally, for example, Llama, Mistral, and Phi-3 |
+| Google Gemini | Google's multimodal AI models |
+| Amazon Bedrock | AWS's managed service for foundation models |
+
+Any AI provider that's usable with `Microsoft.Extensions.AI` is also usable with Agent Framework and Semantic Kernel.
+
## What can you build with AI and .NET?
The opportunities with AI are near endless. Here are a few examples of solutions you can build using AI in your .NET applications:
diff --git a/docs/ai/quickstarts/snippets/function-calling/azure-openai/FunctionCallingAI.csproj b/docs/ai/quickstarts/snippets/function-calling/azure-openai/FunctionCallingAI.csproj
index 6ea519dc420e0..2fbd7a39e5015 100644
--- a/docs/ai/quickstarts/snippets/function-calling/azure-openai/FunctionCallingAI.csproj
+++ b/docs/ai/quickstarts/snippets/function-calling/azure-openai/FunctionCallingAI.csproj
@@ -11,10 +11,10 @@
-
+
-
-
+
+
diff --git a/docs/ai/quickstarts/snippets/text-to-image/azure-openai/TextToImageAzureOpenAI.csproj b/docs/ai/quickstarts/snippets/text-to-image/azure-openai/TextToImageAzureOpenAI.csproj
index 3202a211d8d6c..48498978dabc0 100644
--- a/docs/ai/quickstarts/snippets/text-to-image/azure-openai/TextToImageAzureOpenAI.csproj
+++ b/docs/ai/quickstarts/snippets/text-to-image/azure-openai/TextToImageAzureOpenAI.csproj
@@ -10,8 +10,8 @@
-
-
+
+
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 b809b3c9a1c63..93f62599ee76d 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 @@
-
-
+
+
diff --git a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.ConsumeClientMiddleware/ConsoleAI.ConsumeClientMiddleware.csproj b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.ConsumeClientMiddleware/ConsoleAI.ConsumeClientMiddleware.csproj
index 974cf8df3e909..ca1a1c5a2bd59 100644
--- a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.ConsumeClientMiddleware/ConsoleAI.ConsumeClientMiddleware.csproj
+++ b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI.ConsumeClientMiddleware/ConsoleAI.ConsumeClientMiddleware.csproj
@@ -8,8 +8,8 @@
-
-
+
+
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 374e9810827e9..4777b9a083749 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 @@
-
-
+
+
diff --git a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI/ConsoleAI.csproj b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI/ConsoleAI.csproj
index 500a556ab17e1..8a75762d26fa5 100644
--- a/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI/ConsoleAI.csproj
+++ b/docs/ai/snippets/microsoft-extensions-ai/ConsoleAI/ConsoleAI.csproj
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md
index 57033f8b986f6..c5997a3188bb7 100644
--- a/docs/azure/includes/dotnet-all.md
+++ b/docs/azure/includes/dotnet-all.md
@@ -85,7 +85,7 @@
| Personalizer | NuGet [2.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Personalizer/2.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Personalizer-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Personalizer_2.0.0-beta.2/sdk/personalizer/Azure.AI.Personalizer/) |
| Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright/) |
| Playwright NUnit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |
-| Provisioning | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Provisioning/1.4.0) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.4.0/sdk/provisioning/Azure.Provisioning/) |
+| Provisioning | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Provisioning/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.4.0/sdk/provisioning/Azure.Provisioning/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.5.0-beta.1/sdk/provisioning/Azure.Provisioning/) |
| Provisioning - Resources | NuGet [0.2.0](https://www.nuget.org/packages/Azure.Provisioning.Resources/0.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.Resources-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Resources_0.2.0/sdk/provisioning/Azure.Provisioning.Resources/) |
| Purview Account | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Account/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Account-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Account_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Account/) |
| Purview Administration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Administration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Administration-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Administration_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Administration/) |
@@ -110,7 +110,7 @@
| Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) |
| Synapse - Spark | NuGet [1.0.0-preview.8](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.8) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-preview.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.8/sdk/synapse/Azure.Analytics.Synapse.Spark/) |
| System Events | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |
-| System.ClientModel | NuGet [1.8.1](https://www.nuget.org/packages/System.ClientModel/1.8.1) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.8.1](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.8.1/sdk/core/System.ClientModel/) |
+| System.ClientModel | NuGet [1.9.0](https://www.nuget.org/packages/System.ClientModel/1.9.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.9.0/sdk/core/System.ClientModel/) |
| Tables | NuGet [12.11.0](https://www.nuget.org/packages/Azure.Data.Tables/12.11.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.11.0/sdk/tables/Azure.Data.Tables/) |
| Text Analytics | NuGet [5.3.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.3.0) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.3.0/sdk/textanalytics/Azure.AI.TextAnalytics/) |
| Text Authoring | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Language.Text.Authoring/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Language.Text.Authoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text.Authoring_1.0.0-beta.2/sdk/cognitivelanguage/Azure.AI.Language.Text.Authoring/) |
@@ -320,7 +320,7 @@
| Resource Management - Neon Postgres | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.NeonPostgres/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NeonPostgres-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NeonPostgres_1.0.0/sdk/neonpostgres/Azure.ResourceManager.NeonPostgres/) |
| Resource Management - NetApp Files | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.14.0)
NuGet [1.15.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.15.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetApp-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.14.0/sdk/netapp/Azure.ResourceManager.NetApp/)
GitHub [1.15.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.15.0-beta.1/sdk/netapp/Azure.ResourceManager.NetApp/) |
| Resource Management - Network | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.Network/1.14.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Network-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Network_1.14.0/sdk/network/Azure.ResourceManager.Network/) |
-| Resource Management - Network Cloud | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.2.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0-beta.1/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |
+| Resource Management - Network Cloud | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |
| Resource Management - Network Function | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.NetworkFunction/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkFunction-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkFunction_1.0.0-beta.5/sdk/networkfunction/Azure.ResourceManager.NetworkFunction/) |
| Resource Management - New Relic Observability | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.1.1)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NewRelicObservability-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.1.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.2.0-beta.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/) |
| Resource Management - Nginx | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.0.0)
NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Nginx-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.0.0/sdk/nginx/Azure.ResourceManager.Nginx/)
GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.1.0-beta.4/sdk/nginx/Azure.ResourceManager.Nginx/) |
@@ -427,13 +427,13 @@
| System Net Client Model | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/System.Net.ClientModel/1.0.0-beta.1) | | |
| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Iot.Operations.Connector/1.0.0)
NuGet [1.1.0-rc](https://www.nuget.org/packages/Azure.Iot.Operations.Connector/1.1.0-rc) | | |
| Unknown Display Name | NuGet [0.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Templates/0.1.0) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-x64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.linux-x64/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-x64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.osx-x64/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-arm64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.win-arm64/2.0.0-beta.13) | | |
-| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-x64/1.0.0)
NuGet [2.0.0-beta.13](https://www.nuget.org/packages/Azure.Mcp.win-x64/2.0.0-beta.13) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-x64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.linux-x64/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-x64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.osx-x64/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-arm64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.win-arm64/2.0.0-beta.14) | | |
+| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-x64/1.0.0)
NuGet [2.0.0-beta.14](https://www.nuget.org/packages/Azure.Mcp.win-x64/2.0.0-beta.14) | | |
| Unknown Display Name | NuGet [0.1.4-preview.2](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Aot/0.1.4-preview.2) | | |
| Unknown Display Name | NuGet [1.0.0-preview.2](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp.Sdk/1.0.0-preview.2) | | |
| Unknown Display Name | NuGet [0.2.804](https://www.nuget.org/packages/Microsoft.Azure.Mcp.AzTypes.Internal.Compact/0.2.804) | | |
@@ -552,8 +552,8 @@
| 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.14.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.14.0) | | GitHub [4.14.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.9.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask/3.9.1) | [docs](/dotnet/api/overview/azure/functions) | GitHub [3.9.1](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.13.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.DurableTask/1.13.1) | | |
+| Functions extension for Durable Task Framework | NuGet [3.10.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask/3.10.0) | [docs](/dotnet/api/overview/azure/functions) | GitHub [3.10.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.14.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.DurableTask/1.14.0) | | |
| Functions extension for HTTP | NuGet [3.3.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Http/3.3.0) | | GitHub [3.3.0](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.2/src/WebJobs.Extensions.Http) |
| Functions extension for IoT Edge | NuGet [1.0.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EdgeHub/1.0.7) | | GitHub [1.0.7](https://github.com/Azure/iotedge/tree/1.0.7/edge-hub) |
| Functions extension for Kafka | NuGet [4.2.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Kafka/4.2.0) | | GitHub [4.2.0](https://github.com/Azure/azure-functions-kafka-extension/tree/3.0.0/src/Microsoft.Azure.WebJobs.Extensions.Kafka) |
diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md
index ecdeeea97a962..10184ab3f6c6c 100644
--- a/docs/azure/includes/dotnet-new.md
+++ b/docs/azure/includes/dotnet-new.md
@@ -92,7 +92,7 @@
| Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright/) |
| Playwright NUnit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |
| Programmable Connectivity | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Communication.ProgrammableConnectivity/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.ProgrammableConnectivity_1.0.0-beta.1/sdk/communication/Azure.Communication.ProgrammableConnectivity/) |
-| Provisioning | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Provisioning/1.4.0) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.4.0/sdk/provisioning/Azure.Provisioning/) |
+| Provisioning | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Provisioning/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.4.0/sdk/provisioning/Azure.Provisioning/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.5.0-beta.1/sdk/provisioning/Azure.Provisioning/) |
| Provisioning - Resources | NuGet [0.2.0](https://www.nuget.org/packages/Azure.Provisioning.Resources/0.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.Resources-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Resources_0.2.0/sdk/provisioning/Azure.Provisioning.Resources/) |
| Purview Account | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Account/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Account-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Account_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Account/) |
| Purview Administration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Administration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Administration-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Administration_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Administration/) |
@@ -119,7 +119,7 @@
| Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) |
| Synapse - Spark | NuGet [1.0.0-preview.8](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.8) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-preview.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.8/sdk/synapse/Azure.Analytics.Synapse.Spark/) |
| System Events | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |
-| System.ClientModel | NuGet [1.8.1](https://www.nuget.org/packages/System.ClientModel/1.8.1) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.8.1](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.8.1/sdk/core/System.ClientModel/) |
+| System.ClientModel | NuGet [1.9.0](https://www.nuget.org/packages/System.ClientModel/1.9.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.9.0/sdk/core/System.ClientModel/) |
| Tables | NuGet [12.11.0](https://www.nuget.org/packages/Azure.Data.Tables/12.11.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.11.0/sdk/tables/Azure.Data.Tables/) |
| Text Analytics | NuGet [5.3.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.3.0) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.3.0/sdk/textanalytics/Azure.AI.TextAnalytics/) |
| Text Authoring | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Language.Text.Authoring/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Language.Text.Authoring-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text.Authoring_1.0.0-beta.2/sdk/cognitivelanguage/Azure.AI.Language.Text.Authoring/) |
@@ -337,7 +337,7 @@
| Resource Management - NetApp Files | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.14.0)
NuGet [1.15.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.15.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetApp-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.14.0/sdk/netapp/Azure.ResourceManager.NetApp/)
GitHub [1.15.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.15.0-beta.1/sdk/netapp/Azure.ResourceManager.NetApp/) |
| Resource Management - Network | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.Network/1.14.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Network-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Network_1.14.0/sdk/network/Azure.ResourceManager.Network/) |
| Resource Management - Network Analytics | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.NetworkAnalytics/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkAnalytics-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkAnalytics_1.0.1/sdk/networkanalytics/Azure.ResourceManager.NetworkAnalytics/) |
-| Resource Management - Network Cloud | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.2.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0-beta.1/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |
+| Resource Management - Network Cloud | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |
| Resource Management - Network Function | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.NetworkFunction/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkFunction-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkFunction_1.0.0-beta.5/sdk/networkfunction/Azure.ResourceManager.NetworkFunction/) |
| Resource Management - New Relic Observability | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.1.1)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NewRelicObservability-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.1.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.2.0-beta.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/) |
| Resource Management - Nginx | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.0.0)
NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Nginx-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.0.0/sdk/nginx/Azure.ResourceManager.Nginx/)
GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.1.0-beta.4/sdk/nginx/Azure.ResourceManager.Nginx/) |
diff --git a/docs/core/compatibility/10.md b/docs/core/compatibility/10.md
index b9ea1e493395f..14769a515d2d7 100644
--- a/docs/core/compatibility/10.md
+++ b/docs/core/compatibility/10.md
@@ -39,6 +39,7 @@ If you're migrating an app to .NET 10, the breaking changes listed here might af
| Title | Type of change |
|-------|-------------------|
+| [API obsoletions](core-libraries/10.0/obsolete-apis.md) | Source incompatible |
| [ActivitySource.CreateActivity and ActivitySource.StartActivity behavior change](core-libraries/10.0/activity-sampling.md) | Behavioral change |
| [Arm64 SVE nonfaulting loads require mask](core-libraries/10.0/sve-nonfaulting-loads-mask-parameter.md) | Binary/source incompatible |
| [BufferedStream.WriteByte no longer performs implicit flush](core-libraries/10.0/bufferedstream-writebyte-flush.md) | Behavioral change |
diff --git a/docs/core/compatibility/api-removal.md b/docs/core/compatibility/api-removal.md
index 7992a5107a029..15bfdd52765fc 100644
--- a/docs/core/compatibility/api-removal.md
+++ b/docs/core/compatibility/api-removal.md
@@ -3,7 +3,7 @@ title: API removal in .NET
titleSuffix: ""
description: Learn about .NET's policy for obsoleting and removing APIs.
ms.date: 04/27/2023
-ms.topic: article
+ms.topic: concept-article
---
# API removal in .NET
diff --git a/docs/core/compatibility/breaking-changes.md b/docs/core/compatibility/breaking-changes.md
index 31c4602fb00ec..0a0c66d443aa5 100644
--- a/docs/core/compatibility/breaking-changes.md
+++ b/docs/core/compatibility/breaking-changes.md
@@ -2,7 +2,7 @@
title: .NET breaking changes reference
description: Learn how to navigate the .NET breaking changes reference.
ms.date: 06/24/2025
-ms.topic: article
+ms.topic: concept-article
---
# Breaking changes in .NET
diff --git a/docs/core/compatibility/categories.md b/docs/core/compatibility/categories.md
index fb26b3e4c2c69..b664805af4324 100644
--- a/docs/core/compatibility/categories.md
+++ b/docs/core/compatibility/categories.md
@@ -2,7 +2,7 @@
title: Compatibility
description: Learn about the ways in which code changes can affect compatibility in .NET.
ms.date: 06/10/2019
-ms.topic: article
+ms.topic: concept-article
---
# How code changes can affect compatibility
diff --git a/docs/core/compatibility/extensions/10.0/getkeyedservice-anykey.md b/docs/core/compatibility/extensions/10.0/getkeyedservice-anykey.md
index 16abacdc9d379..e4d63b6ad402d 100644
--- a/docs/core/compatibility/extensions/10.0/getkeyedservice-anykey.md
+++ b/docs/core/compatibility/extensions/10.0/getkeyedservice-anykey.md
@@ -1,13 +1,16 @@
---
title: "Breaking change: Fix issues in GetKeyedService() and GetKeyedServices() with AnyKey"
description: "Learn about the breaking change in .NET 10 where GetKeyedService() and GetKeyedServices() behavior changed when using KeyedService.AnyKey as the lookup key."
-ms.date: 11/19/2025
+ms.date: 01/26/2026
ai-usage: ai-assisted
---
# Fix issues in GetKeyedService() and GetKeyedServices() with AnyKey
-The behavior of the and methods in the `Microsoft.Extensions.DependencyInjection` library was updated to address inconsistencies in handling the registration. Specifically, `GetKeyedService()` now throws an exception when you attempt to resolve a single service using `KeyedService.AnyKey` as the lookup key, and `GetKeyedServices()` (plural) no longer returns `AnyKey` registrations when queried with `KeyedService.AnyKey`.
+The behavior of the and methods in the `Microsoft.Extensions.DependencyInjection` library was updated to address inconsistencies in handling the registration. Specifically:
+
+- `GetKeyedService()` now throws an exception when you attempt to resolve a single service using `KeyedService.AnyKey` as the lookup key.
+- `GetKeyedServices()` (plural) no longer returns `AnyKey` registrations when queried with `KeyedService.AnyKey`.
## Version introduced
@@ -32,7 +35,7 @@ Additionally, calling `GetKeyedServices()` with `KeyedService.AnyKey` no longer
```csharp
var services = serviceProvider.GetKeyedServices(typeof(IMyService), KeyedService.AnyKey);
-// Returns an empty collection.
+// Returns only services that were registered with a specific key.
```
## Type of breaking change
@@ -41,14 +44,19 @@ This change is a [behavioral change](../../categories.md#behavioral-change).
## Reason for change
-The previous behavior of `GetKeyedService()` and `GetKeyedServices()` with `KeyedService.AnyKey` was inconsistent with the intended semantics of `AnyKey`. The changes were introduced to ensure that `AnyKey` is treated as a special case and can't be used to resolve a single service, and to prevent `GetKeyedServices()` from returning `AnyKey` registrations when queried with `AnyKey`. These updates improve the predictability and correctness of the `Microsoft.Extensions.DependencyInjection` library's behavior when working with keyed services. For more details, see the [pull request](https://github.com/dotnet/runtime/pull/113137) and the associated [merge commit](https://github.com/dotnet/runtime/commit/deee462fc8421a7e18b8916eb5a5eacb9d09169d).
+The previous behavior of `GetKeyedService()` and `GetKeyedServices()` with `KeyedService.AnyKey` was inconsistent with the intended semantics of `AnyKey`. The changes were introduced to:
+
+- Ensure that `AnyKey` is treated as a special case and can't be used to resolve a single service.
+- Prevent `GetKeyedServices()` from returning `AnyKey` registrations when queried with `AnyKey`.
+
+These updates improve the predictability and correctness of the `Microsoft.Extensions.DependencyInjection` library's behavior when working with keyed services. For more details, see the [pull request](https://github.com/dotnet/runtime/pull/113137) and the associated [merge commit](https://github.com/dotnet/runtime/commit/deee462fc8421a7e18b8916eb5a5eacb9d09169d).
## Recommended action
If you use `GetKeyedService()` or `GetKeyedServices()` with `KeyedService.AnyKey`, review your code and update it to use specific keys instead of `AnyKey`:
-- Replace `GetKeyedService(KeyedService.AnyKey)` calls with specific keys or alternative logic to handle service resolution.
-- Replace `GetKeyedServices(KeyedService.AnyKey)` calls with specific keys, or update your logic to enumerate only the services you intend to retrieve.
+- Update `GetKeyedService(KeyedService.AnyKey)` calls to pass specific keys, or use alternative logic to handle service resolution.
+- Update `GetKeyedServices(KeyedService.AnyKey)` calls to pass specific keys, or use alternative logic to enumerate only the services you intend to retrieve.
## Affected APIs
diff --git a/docs/core/compatibility/library-change-rules.md b/docs/core/compatibility/library-change-rules.md
index a386daa4202fa..5817df06b0cde 100644
--- a/docs/core/compatibility/library-change-rules.md
+++ b/docs/core/compatibility/library-change-rules.md
@@ -2,7 +2,7 @@
title: .NET API changes that affect compatibility
description: Learn how .NET attempts to maintain compatibility for developers across .NET versions, and what kind of change is considered a breaking change.
ms.date: 09/30/2025
-ms.topic: article
+ms.topic: concept-article
---
# Change rules for compatibility
diff --git a/docs/core/diagnostics/observability-otlp-example.md b/docs/core/diagnostics/observability-otlp-example.md
index 0ea62c3428bf8..5fbb819632f2c 100644
--- a/docs/core/diagnostics/observability-otlp-example.md
+++ b/docs/core/diagnostics/observability-otlp-example.md
@@ -2,7 +2,7 @@
title: "Example: Use OpenTelemetry with OTLP and the standalone Aspire Dashboard"
description: An introduction to observing .NET apps with OTLP and the standalone Aspire Dashboard
ms.date: 6/14/2023
-ms.topic: article
+ms.topic: how-to
ms.custom: sfi-image-nochange
---
diff --git a/docs/core/diagnostics/observability-prgrja-example.md b/docs/core/diagnostics/observability-prgrja-example.md
index b06091c5f4fec..c68c30c8e940a 100644
--- a/docs/core/diagnostics/observability-prgrja-example.md
+++ b/docs/core/diagnostics/observability-prgrja-example.md
@@ -2,7 +2,7 @@
title: "Example: Use OpenTelemetry with Prometheus, Grafana, and Jaeger"
description: A walkthrough of how to use OpenTelemetry in .NET to export telemetry to Prometheus, Grafana, and Jaeger
ms.date: 6/14/2023
-ms.topic: article
+ms.topic: how-to
---
# Example: Use OpenTelemetry with Prometheus, Grafana, and Jaeger
diff --git a/docs/core/diagnostics/observability-with-otel.md b/docs/core/diagnostics/observability-with-otel.md
index 4ed3820b584b2..d80794a9d6c67 100644
--- a/docs/core/diagnostics/observability-with-otel.md
+++ b/docs/core/diagnostics/observability-with-otel.md
@@ -2,7 +2,7 @@
title: .NET Observability with OpenTelemetry
description: An introduction to observing .NET apps with OpenTelemetry
ms.date: 6/14/2023
-ms.topic: article
+ms.topic: concept-article
ms.custom:
- sfi-image-nochange
- sfi-ropc-nochange
diff --git a/docs/core/extensions/dependency-injection/overview.md b/docs/core/extensions/dependency-injection/overview.md
index 3c4ce204e1d47..a42bb1ae0dd65 100644
--- a/docs/core/extensions/dependency-injection/overview.md
+++ b/docs/core/extensions/dependency-injection/overview.md
@@ -1,7 +1,7 @@
---
title: Dependency injection
description: Learn how to use dependency injection within your .NET apps. Discover how to define service lifetimes and express dependencies in C#.
-ms.date: 10/21/2025
+ms.date: 01/26/2026
ms.topic: overview
ai-usage: ai-assisted
---
@@ -216,7 +216,11 @@ public class ExampleService
### KeyedService.AnyKey property
-The property provides a special key for working with keyed services. You can register a service using `KeyedService.AnyKey` as a fallback that matches any key. This is useful when you want to provide a default implementation for any key that doesn't have an explicit registration.
+The property provides a special key for working with keyed services.
+
+#### Service registration
+
+You can register a service using `KeyedService.AnyKey` as a fallback that matches any key. This is useful when you want to provide a default implementation for any key that doesn't have an explicit registration.
:::code language="csharp" source="snippets/anykey/Program.cs" id="FallbackRegistration":::
@@ -225,8 +229,16 @@ In the preceding example:
- Requesting `ICache` with key `"premium"` returns the `PremiumCache` instance.
- Requesting `ICache` with any other key (like `"basic"` or `"standard"`) creates a new `DefaultCache` using the `AnyKey` fallback.
+#### Query for services
+
+You can query for all services that were registered *using a specific key* (that is, not with `KeyedService.AnyKey`), by passing `KeyedService.AnyKey` to .
+
+:::code language="csharp" source="snippets/anykey/Program.cs" id="AnyKeyQuery":::
+
+In the preceding example, calling `GetKeyedServices(KeyedService.AnyKey)` returns only the `PremiumCache` instance since it's the only cache that was registered using a specific key in the [service registration](#service-registration) code example.
+
> [!IMPORTANT]
-> Starting in .NET 10, calling `GetKeyedService()` with `KeyedService.AnyKey` throws an because `AnyKey` is intended as a registration fallback, not as a query key. For more information, see [Fix issues in GetKeyedService() and GetKeyedServices() with AnyKey](../../compatibility/extensions/10.0/getkeyedservice-anykey.md).
+> Starting in .NET 10, calling `GetKeyedService()` (singular) with `KeyedService.AnyKey` throws an because `AnyKey` shouldn't be used to resolve a single service. For more information, see [Fix issues in GetKeyedService() and GetKeyedServices() with AnyKey](../../compatibility/extensions/10.0/getkeyedservice-anykey.md).
## See also
diff --git a/docs/core/extensions/dependency-injection/snippets/anykey/Program.cs b/docs/core/extensions/dependency-injection/snippets/anykey/Program.cs
index c29141f0ccdf6..2fbc7103d4008 100644
--- a/docs/core/extensions/dependency-injection/snippets/anykey/Program.cs
+++ b/docs/core/extensions/dependency-injection/snippets/anykey/Program.cs
@@ -17,17 +17,37 @@ static void FallbackExample()
// Register a specific cache for the "premium" key.
services.AddKeyedSingleton("premium", new PremiumCache());
- var provider = services.BuildServiceProvider();
+ ServiceProvider provider = services.BuildServiceProvider();
// Requesting with "premium" key returns PremiumCache.
- var premiumCache = provider.GetKeyedService("premium");
+ ICache? premiumCache = provider.GetKeyedService("premium");
Console.WriteLine($"Premium key: {premiumCache}");
// Requesting with any other key uses the AnyKey fallback.
- var basicCache = provider.GetKeyedService("basic");
+ ICache? basicCache = provider.GetKeyedService("basic");
Console.WriteLine($"Basic key: {basicCache}");
- var standardCache = provider.GetKeyedService("standard");
+ ICache? standardCache = provider.GetKeyedService("standard");
Console.WriteLine($"Standard key: {standardCache}");
+
+ /* This example outputs:
+ *
+ * Premium key: Premium cache
+ * Basic key: basic cache
+ * Standard key: standard cache
+ */
//
+
+ //
+ IEnumerable? keyedCaches = provider.GetKeyedServices(KeyedService.AnyKey);
+ foreach (ICache cache in keyedCaches)
+ {
+ Console.WriteLine($"AnyKey registered cache: {cache}");
+ }
+
+ /* This example outputs:
+ *
+ * AnyKey registered cache: Premium cache
+ */
+ //
}
diff --git a/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj b/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj
index e329b1140655d..9c11f63d6f44e 100644
--- a/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj
+++ b/docs/core/extensions/snippets/logging/getting-started-open-telemetry/getting-started-open-telemetry.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/core/extensions/snippets/ratelimit/http/http.csproj b/docs/core/extensions/snippets/ratelimit/http/http.csproj
index 631cf98d133fc..657eb55230ced 100644
--- a/docs/core/extensions/snippets/ratelimit/http/http.csproj
+++ b/docs/core/extensions/snippets/ratelimit/http/http.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/docs/core/resources/manifest-file-names.md b/docs/core/resources/manifest-file-names.md
index c50593b8dd47c..fb53ab7ae05a6 100644
--- a/docs/core/resources/manifest-file-names.md
+++ b/docs/core/resources/manifest-file-names.md
@@ -2,7 +2,7 @@
title: How MSBuild generates manifest file names
description: Describes the factors that influence the name of a resource manifest file name that's generated by MSBuild at compile time.
ms.date: 05/08/2020
-ms.topic: article
+ms.topic: concept-article
---
# How resource manifest files are named
diff --git a/docs/core/runtime-config/index.md b/docs/core/runtime-config/index.md
index 6b75b687421cb..cf517c2118efe 100644
--- a/docs/core/runtime-config/index.md
+++ b/docs/core/runtime-config/index.md
@@ -1,7 +1,7 @@
---
title: .NET Runtime config options
description: Learn how to configure the .NET runtime using configuration settings.
-ms.topic: article
+ms.topic: concept-article
ms.date: 01/12/2026
---
# .NET runtime configuration settings
diff --git a/docs/csharp/language-reference/compiler-messages/feature-version-errors.md b/docs/csharp/language-reference/compiler-messages/feature-version-errors.md
index d3eaae9a09ee4..8e24424487f6a 100644
--- a/docs/csharp/language-reference/compiler-messages/feature-version-errors.md
+++ b/docs/csharp/language-reference/compiler-messages/feature-version-errors.md
@@ -39,6 +39,7 @@ f1_keywords:
- "CS8929"
- "CS8957" # ERR_NoImplicitConvTargetTypedConditional Conditional expression is not valid in language version {0} because a common type was not found between '{1}' and '{2}'
- "CS8912" # ERR_InheritingFromRecordWithSealedToString Inheriting from a record with a sealed 'Object.ToString' is not supported
+ - "CS9041" # ERR_UnsupportedCompilerFeature '{0}' requires compiler feature '{1}', which is not supported by this version of the C# compiler.
- "CS9014" # ERR_UseDefViolationPropertyUnsupportedVersion Use of possibly unassigned property
- "CS9015" # ERR_UseDefViolationFieldUnsupportedVersion Use of possibly unassigned field
- "CS9016" # WRN_UseDefViolationPropertyUnsupportedVersion Use of possibly unassigned property
@@ -98,6 +99,7 @@ helpviewer_keywords:
- "CS8912"
- "CS8919"
- "CS8929"
+ - "CS9041"
- "CS9014"
- "CS9015"
- "CS9016"
@@ -150,6 +152,7 @@ That's be design. The text closely matches the text of the compiler error / warn
- **CS8929**: *Method cannot implement interface member in type because the target runtime doesn't support static abstract members in interfaces.*
- **CS8957**: *Conditional expression is not valid in language version because a common type was not found between types.*
- **CS8967**: *Newlines inside a non-verbatim interpolated string are not supported in C#*
+- **CS9041**: *Requires compiler feature, which is not supported by this version of the C# compiler.*
- **CS9014**: *Error: Use of possibly unassigned property. Upgrade to auto-default the property.*
- **CS9015**: *Error: Use of possibly unassigned field. Upgrade to auto-default the field.*
- **CS9016**: *Warning: Use of possibly unassigned property. Upgrade to auto-default the property.*
diff --git a/docs/csharp/language-reference/compiler-messages/overloaded-operator-errors.md b/docs/csharp/language-reference/compiler-messages/overloaded-operator-errors.md
index 555ec6ab4b978..3815b8d86829f 100644
--- a/docs/csharp/language-reference/compiler-messages/overloaded-operator-errors.md
+++ b/docs/csharp/language-reference/compiler-messages/overloaded-operator-errors.md
@@ -71,6 +71,7 @@ helpviewer_keywords:
- "CS9023"
- "CS9024"
- "CS9025"
+ - "CS9027"
- "CS9308"
- "CS9310"
- "CS9311"
@@ -119,6 +120,7 @@ That's by design. The text closely matches the text of the compiler error / warn
- [**CS9023**](#checked-operators): *Operator cannot be made checked.*
- [**CS9024**](#checked-operators): *Operator cannot be made unchecked.*
- [**CS9025**](#checked-operators): *Operator requires a matching non-checked version to also be declared.*
+- [**CS9027**](#checked-operators): *Unexpected keyword 'unchecked'.*
- [**CS9308**](#operator-declaration-requirements): *User-defined operator must be declared public.*
- [**CS9310**](#operator-signature-requirements): *The return type for this operator must be void.*
- [**CS9311**](#interface-and-inheritance-requirements): *Type does not implement interface member. The type cannot implement member because one of them is not an operator.*
@@ -386,11 +388,13 @@ public class C4
- **CS9023**: *Operator can't be made checked*
- **CS9024**: *Operator can't be made unchecked*
- **CS9025**: *Checked operator requires a matching non-checked version to also be declared*
+- **CS9027**: *Unexpected keyword 'unchecked'*
To use checked operators correctly, follow these requirements. For more information, see [Arithmetic operators](../operators/arithmetic-operators.md#user-defined-checked-operators) and [User-defined checked operators](~/_csharplang/proposals/csharp-11.0/checked-user-defined-operators.md).
- Apply `checked` or `unchecked` keywords only to supported arithmetic operators: `+`, `-`, `*`, `/`, `++`, `--`, and explicit conversions (**CS9023**, **CS9024**).
- Provide both checked and unchecked versions when declaring a checked operator (**CS9025**). The compiler needs both to handle different contexts.
+- Use the `unchecked` keyword only in valid operator declaration contexts (**CS9027**). Don't place it in locations where it's syntactically unexpected.
## Interface and inheritance requirements
diff --git a/docs/csharp/language-reference/compiler-messages/source-generator-errors.md b/docs/csharp/language-reference/compiler-messages/source-generator-errors.md
index 0acfb3b8e39ef..465aa81bef996 100644
--- a/docs/csharp/language-reference/compiler-messages/source-generator-errors.md
+++ b/docs/csharp/language-reference/compiler-messages/source-generator-errors.md
@@ -37,6 +37,8 @@ f1_keywords:
- "CS9234"
- "CS9235"
- "CS9270"
+ - "CS9057"
+ - "CS9067"
helpviewer_keywords:
- "CS9137"
- "CS9138"
@@ -73,7 +75,9 @@ helpviewer_keywords:
- "CS9234"
- "CS9235"
- "CS9270"
-ms.date: 05/23/2025
+ - "CS9057"
+ - "CS9067"
+ms.date: 01/27/2026
---
# Errors and warnings associated with source generators and interceptors
@@ -115,6 +119,8 @@ The following warnings are generated when source generators or interceptors are
- [**CS8784**](#incorrect-interceptor-declaration): *Generator '`YourSourceGeneratorName`' failed to initialize. It will not contribute to the output and compilation errors may occur as a result.*
- [**CS8785**](#incorrect-interceptor-declaration): *Generator '`YourSourceGeneratorName`' failed to generate source. It will not contribute to the output and compilation errors may occur as a result.*
+- [**CS9057**](#analyzer-compatibility): *Analyzer assembly cannot be used because it references a newer version of the compiler than the currently running version.*
+- [**CS9067**](#analyzer-compatibility): *Analyzer reference specified multiple times.*
- [**CS9154**](#signature-mismatch): *Intercepting a call to `M` with interceptor `V`, but the signatures do not match.*
- [**CS9158**](#signature-mismatch): *Nullability of reference types in return type doesn't match interceptable method.*
- [**CS9159**](#signature-mismatch): *Nullability of reference types in type of parameter doesn't match interceptable method.*
@@ -124,17 +130,13 @@ These errors and warnings follow these themes:
## Interceptors are experimental
-This error indicates you must enable the experimental feature.
-
- **CS9137**: *The 'interceptors' experimental feature is not enabled. Add `InterceptorsPreview` to your project.*
-In C# 12, interceptors are experimental. Interceptors are subject to breaking changes or removal in a future release. Therefore, it is not recommended for production or released applications.
-
-In order to use interceptors, you must set the `InterceptorsPreview` element in your project file. Without this flag, interceptors are disabled, even when other C# 12 features are enabled.
+To use interceptors, add the `InterceptorsPreview` element to your project file within a `` section (**CS9137**), because interceptors are an experimental feature that isn't enabled by default. This explicit opt-in is required because interceptors are subject to breaking changes or removal in future releases, and the compiler needs confirmation that you understand the risks before allowing their use. For more information about interceptors and their capabilities, see [Interceptors](../../whats-new/csharp-12.md#interceptors) in the C# 12 features documentation.
## Signature mismatch
-The following errors indicate a mismatch between the interceptor method and the interceptable method, or a violation of the rules regarding interceptor method declarations:
+The following errors and warnings indicate a mismatch between the interceptor method and the interceptable method.
- **CS9144**: *Cannot intercept method `M` with interceptor `V` because the signatures do not match.*
- **CS9148**: *Interceptor must have a `this` parameter matching parameter.*
@@ -151,13 +153,15 @@ In addition, the following warnings indicate a mismatch in the signatures of the
- **CS9159**: *Nullability of reference types in type of parameter doesn't match interceptable method.*
- **CS9270**: *'`InterceptsLocationAttribute(string, int, int)`' is not supported. Move to 'InterceptableLocation'-based generation of these attributes instead. [(https://github.com/dotnet/roslyn/issues/72133)](https://github.com/dotnet/roslyn/issues/72133)*
-The interceptor method must be compatible with the interceptable method. You must follow these rules:
+To correct these issues, ensure your interceptor method matches the interceptable method's signature and access requirements:
-- Instance methods can intercept instance methods, not static methods. Similarly, static methods can only intercept static methods, not instance methods.
-- The method signatures for the interceptor and the interceptable method must match: They must have the same parameters with the same modifiers in the same order. The return types must also match.
-- The ref safe contexts must match. In other words, corresponding `ref` parameters must be either `scoped` or not `scoped`.
-- They methods must both be non-generic, or both must have the same number of type parameters.
-- An updated `InterceptorLocationAttribute` constructor signature is preferred.
+- Ensure the interceptor method signature exactly matches the interceptable method (**CS9144**, **CS9154**). The parameter types, modifiers, order, and return type must be identical. Review both method declarations and align their signatures.
+- Add a `this` parameter to your interceptor when the interceptable method is an instance method (**CS9148**), or remove the `this` parameter when the interceptable method is static (**CS9149**). Instance interceptors require a `this` parameter of the declaring type, while static interceptors must not have one.
+- Declare your interceptor in a location where the interceptable method is accessible (**CS9155**). If the interceptable method is `internal`, the interceptor must be in the same assembly. If it's `private`, the interceptor must be in the same type or a nested type.
+- Match the `scoped` modifiers and `[UnscopedRef]` attributes on corresponding `ref` parameters (**CS9156**). Each `ref` parameter in the interceptor must have the same lifetime annotations as the corresponding parameter in the interceptable method to ensure memory safety.
+- Ensure both methods have matching generic arity (**CS9177**, **CS9178**). If the interceptable method is non-generic, the interceptor must also be non-generic. If the interceptable method has type parameters, the interceptor must have the same number of type parameters with compatible constraints.
+- Match the nullability annotations in the return type (**CS9158**) and parameter types (**CS9159**). Enable nullable reference types in your project and ensure the interceptor's nullability annotations match the interceptable method exactly to maintain type safety.
+- Use the updated `InterceptableLocation`-based generation for `InterceptsLocationAttribute` instead of the deprecated `(string, int, int)` constructor (**CS9270**). The newer format provides better tooling support and compile-time validation. See the [GitHub issue](https://github.com/dotnet/roslyn/issues/72133) for migration guidance.
## Incorrect mapping
@@ -173,15 +177,19 @@ Interceptors require a source mapping that maps the interceptable method and the
- **CS9150**: *Interceptor cannot have a `null` file path.*
- **CS9157**: *Line and character numbers provided to `InterceptsLocationAttribute` must be positive.*
+To correct mapping errors, ensure your `InterceptsLocationAttribute` contains valid file paths and accurate position information:
+
+- Verify the file path matches a file in your compilation exactly (**CS9139**, **CS9140**). Use the exact path as it appears in your project, including correct casing and directory separators. If the compiler suggests an alternative path, update your attribute to use that path.
+- Use mapped file paths when working with source generators that transform file paths (**CS9145**). Source generators often remap paths for generated files, and you must use the mapped path that the compiler recognizes, not the original source path.
+- Ensure the file path isn't `null` in your `InterceptsLocationAttribute` (**CS9150**). Every interception must specify a valid, non-null file path that identifies the source file containing the call to intercept.
+- Provide positive, 1-based line and character numbers (**CS9157**). Line numbers and character positions must start at 1, not 0. Verify your source generator uses 1-based indexing when calculating positions.
+- Point to the exact start of the method name token (**CS9141**, **CS9147**). The line and character numbers must identify the first character of the method name in the invocation, not whitespace, operators, or other tokens. If the compiler suggests alternative coordinates, use those to target the correct token start.
+- Stay within the file's bounds (**CS9142**, **CS9143**). Verify the line number doesn't exceed the total line count and the character number doesn't exceed the line length. Recalculate positions if the source file has changed since the attribute was generated.
+
## Incorrect interceptor declaration
The following errors indicate issues with interceptor declarations, including problems with the `InterceptsLocationAttribute` format or violations of interceptor rules:
-- **CS9231**: *The data argument to InterceptsLocationAttribute is not in the correct format.*
-- **CS9232**: *Version 'version' of the interceptors format is not supported. The latest supported version is '1'.*
-- **CS9233**: *Cannot intercept a call in file 'file' because it is duplicated elsewhere in the compilation.*
-- **CS9234**: *Cannot intercept a call in file 'file' because a matching file was not found in the compilation.*
-- **CS9235**: *The data argument to InterceptsLocationAttribute refers to an invalid position in file 'file'.*
- **CS9138**: *Method cannot be used as an interceptor because it or its containing type has type parameters.*
- **CS9146**: *An interceptor method must be an ordinary member method.*
- **CS9151**: *Possible method name `M` cannot be intercepted because it is not being invoked.*
@@ -191,20 +199,35 @@ The following errors indicate issues with interceptor declarations, including pr
- **CS9161**: *An interceptor cannot be marked with `UnmanagedCallersOnlyAttribute`.*
- **CS9206**: *An interceptor cannot be declared in the global namespace.*
- **CS9207**: *Cannot intercept because method is not an invocation of an ordinary member method.*
+- **CS9231**: *The data argument to InterceptsLocationAttribute is not in the correct format.*
+- **CS9232**: *Version 'version' of the interceptors format is not supported. The latest supported version is '1'.*
+- **CS9233**: *Cannot intercept a call in file 'file' because it is duplicated elsewhere in the compilation.*
+- **CS9234**: *Cannot intercept a call in file 'file' because a matching file was not found in the compilation.*
+- **CS9235**: *The data argument to InterceptsLocationAttribute refers to an invalid position in file 'file'.*
+
+To correct interceptor declaration errors, follow these rules for valid interceptor declarations and `InterceptsLocationAttribute` usage:
+
+- Format the `InterceptsLocationAttribute` data argument correctly (**CS9231**). The attribute requires specifically structured data that encodes file path and position information. Ensure your source generator produces data in the expected format matching the current interceptors specification.
+- Use version '1' in your `InterceptsLocationAttribute` (**CS9232**), because it's the latest supported version. Update your source generator to output version 1 format attributes rather than unsupported version numbers.
+- Ensure unique file paths in your compilation (**CS9233**, **CS9234**). When the compilation contains duplicate file paths, rename or reorganize files to make each path unique. Verify that the file path in the attribute matches a file actually included in the compilation.
+- Validate position data points to valid code locations (**CS9235**). The line and character numbers must reference a valid interception point within the specified file. Regenerate the attribute if the source file has changed or if the position falls outside the file's bounds.
+- Declare non-generic interceptor methods in non-generic types (**CS9138**). Interceptors can't have type parameters on the method itself or on their containing type. If you need to intercept a generic method, create a non-generic interceptor that works with the specific constructed type.
+- Make interceptors ordinary member methods (**CS9146**). Interceptors can't be operators, constructors, finalizers, properties, or indexers. Declare your interceptor as a regular static or instance method.
+- Intercept actual method invocations, not expressions (**CS9151**, **CS9207**). You can only intercept calls to ordinary member methods that are being invoked. You can't intercept method groups, delegates, or methods referenced without being called. Ensure the interceptable location identifies an actual method call.
+- Remove duplicate interception attempts (**CS9153**). Each method call can only be intercepted once. If multiple `InterceptsLocationAttribute` instances target the same call, remove all but one to resolve the ambiguity.
+- Don't intercept `nameof` operators (**CS9160**). The `nameof` operator doesn't invoke methods at runtime, so it can't be intercepted. Only intercept actual method calls that execute at runtime.
+- Remove `UnmanagedCallersOnlyAttribute` from interceptors (**CS9161**). Interceptors must be callable from managed code and can't be marked with `UnmanagedCallersOnlyAttribute`. Remove the attribute from your interceptor method declaration.
+- Declare interceptors within a namespace (**CS9206**). Interceptors can't be declared in the global namespace and must be contained within at least one namespace declaration. Wrap your interceptor class in a namespace.
+- Resolve duplicate file paths at the compilation level (**CS9152**). When multiple files share the same path in the compilation, the compiler can't determine which file to intercept in. Ensure build configuration produces unique file paths or use a different organization strategy for your source files.
+
+## Analyzer compatibility
+
+The following warnings indicate issues with analyzer or source generator assemblies:
+
+- **CS9057**: *Analyzer assembly cannot be used because it references a newer version of the compiler than the currently running version.*
+- **CS9067**: *Analyzer reference specified multiple times.*
+
+These warnings occur when there are compatibility issues with analyzer assemblies:
-These errors occur when interceptor declarations violate the rules for interceptors or when the `InterceptsLocationAttribute` contains invalid data:
-
-- **CS9231** is generated when the data format doesn't match the expected structure. The attribute requires specifically formatted data that encodes the file path and position information.
-- **CS9232** indicates you're using a version number that isn't supported. The interceptors feature uses version '1' format. Update your source generator to use the supported version.
-- **CS9233** happens when the compilation contains multiple files with the same path, making it ambiguous which file to intercept in. Ensure each file in your compilation has a unique path.
-- **CS9234** is emitted when the file path specified in the attribute doesn't match any file in the current compilation. Verify the file path is correct and the file is included in the compilation.
-- **CS9235** occurs when the position data (line and character numbers) points to an invalid location in the specified file. This can happen if the position is outside the file's bounds or doesn't correspond to a valid interception point.
-- **CS9138** prevents generic methods or members of generic classes from being interceptors.
-- **CS9146** requires interceptors to be ordinary members (not operators, constructors, or finalizers).
-- **CS9151** prevents intercepting methods that are never invoked.
-- **CS9152** detects duplicate file paths in the compilation.
-- **CS9153** prevents multiple interceptions of the same call.
-- **CS9160** prevents intercepting `nameof` operators.
-- **CS9161** prevents interceptors from being marked with `UnmanagedCallersOnlyAttribute`.
-- **CS9206** requires interceptors to be contained in a namespace (not global).
-- **CS9207** requires interceptable methods to be ordinary member invocations.
+- **CS9057** is generated when an analyzer assembly references a version of the Roslyn compiler that is newer than the one currently running. This prevents the analyzer from loading because it may depend on APIs or behaviors not available in the current compiler version. To resolve this, either upgrade your compiler/SDK to match the analyzer's requirements or use a version of the analyzer compatible with your current compiler version.
+- **CS9067** warns when the same analyzer assembly is referenced multiple times in your project. This typically happens when an analyzer is included through multiple paths or package references. While not an error, duplicate references can impact build performance and may cause unexpected behavior. Remove the duplicate references to resolve this warning.
diff --git a/docs/csharp/language-reference/compiler-messages/unsafe-code-errors.md b/docs/csharp/language-reference/compiler-messages/unsafe-code-errors.md
index 0e010be079538..de67f07aa65dc 100644
--- a/docs/csharp/language-reference/compiler-messages/unsafe-code-errors.md
+++ b/docs/csharp/language-reference/compiler-messages/unsafe-code-errors.md
@@ -29,6 +29,7 @@ f1_keywords:
- "CS1716"
- "CS1919"
- "CS8812"
+ - "CS9049"
- "CS9123"
helpviewer_keywords:
- "CS0193"
@@ -58,8 +59,9 @@ helpviewer_keywords:
- "CS4004"
- "CS1919"
- "CS8812"
+ - "CS9049"
- "CS9123"
-ms.date: 10/21/2025
+ms.date: 01/27/2026
ai-usage: ai-assisted
---
# Resolve errors and warnings in unsafe code constructs
@@ -96,6 +98,7 @@ That's by design. The text closely matches the text of the compiler error / warn
- [**CS1919**](#unsafe-context-restrictions): *Unsafe type 'type name' cannot be used in object creation.*
- [**CS4004**](#unsafe-context-restrictions): *Cannot `await` in an unsafe context*
- [**CS8812**](#function-pointers): *Cannot convert `&Method` group to non-function pointer type.*
+- [**CS9049**](#fixed-size-buffers): *A fixed field must not be a ref field.*
- [**CS9123**](#unsafe-context-restrictions): *The '`&`' operator should not be used on parameters or local variables in async methods.*
## Pointer operations and dereferencing
@@ -106,7 +109,7 @@ That's by design. The text closely matches the text of the compiler error / warn
To use pointer operations correctly, follow the rules for dereferencing, indexing, and arithmetic operations. For more information, see [Pointer types](../unsafe-code.md#pointer-types) and [Function pointers](../unsafe-code.md#function-pointers).
-- Apply the `*` or `->` operator only to data pointers (**CS0193**). Don't use these operators with nonpointer types or function pointers. Function pointers can't be dereferenced in C#, unlike in C/C++.
+- Apply the `*` or `->` operator only to data pointers (**CS0193**). Don't use these operators with nonpointer types or function pointers. Unlike in C/C++, you can't dereference function pointers in C#.
- Index pointers with only one value (**CS0196**). Multidimensional indexing isn't supported on pointers.
- Avoid operations that are undefined on void pointers (**CS0242**). For example, don't increment a void pointer because the compiler doesn't know the size of the data being pointed to.
@@ -159,12 +162,12 @@ These errors occur when you use unsafe code constructs without proper unsafe con
To use unsafe code correctly:
-- Mark methods, types, or code blocks that use pointers or fixed-size buffers with the `unsafe` keyword (**CS0214**).
+- Mark methods, types, or code blocks that use pointers or fixed-size buffers by using the `unsafe` keyword (**CS0214**).
- Enable the [**AllowUnsafeBlocks**](../compiler-options/language.md#allowunsafeblocks) compiler option in your project settings when using the `unsafe` keyword (**CS0227**).
- Don't use the [`is`](../operators/type-testing-and-cast.md#the-is-operator) or [`as`](../operators/type-testing-and-cast.md#the-as-operator) operators with pointer types (**CS0244**). These type-testing operators aren't valid for pointers.
- Don't use the `new` operator to create pointer type instances (**CS1919**). To create objects in unmanaged memory, use interop to call native methods that return pointers.
- Keep unsafe code separate from async code (**CS4004**). Create separate methods for unsafe operations and call them from async methods.
-- Don't use the address-of operator (`&`) on parameters or local variables in async methods (**CS9123**). The variable may not exist when the async operation completes.
+- Don't use the address-of operator (`&`) on parameters or local variables in async methods (**CS9123**). The variable might not exist when the async operation completes.
## Fixed-size buffers
@@ -175,6 +178,7 @@ To use unsafe code correctly:
- **CS1666**: *You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement*
- **CS1708**: *Fixed size buffers can only be accessed through locals or fields*
- **CS1716**: *Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute. Use the 'fixed' field modifier instead*
+- **CS9049**: *A fixed field must not be a ref field*
These errors occur when you work with fixed-size buffers. Fixed-size buffers are arrays embedded directly in structs and are primarily used for interop scenarios. For more information, see [Fixed-size buffers](../unsafe-code.md#fixed-size-buffers).
@@ -186,9 +190,10 @@ To declare and use fixed-size buffers correctly:
- Use a `fixed` statement to pin the containing struct before accessing the buffer (**CS1666**).
- Access fixed-size buffers only through locals or fields, not through intermediate expressions (**CS1708**).
- Use the `fixed` field modifier instead of the `System.Runtime.CompilerServices.FixedBuffer` attribute (**CS1716**).
+- Don't declare fixed-size buffers as `ref` fields (**CS9049**). Fixed-size buffers must be value fields.
## Function pointers
- **CS8812**: *Cannot convert `&Method` group to non-function pointer type*
-To obtain a function pointer, use the address-of operator with an explicit function pointer type cast. Don't use the [address-of operator `&`](../operators/pointer-related-operators.md#address-of-operator-) to assign method groups to `void*` or other non-function pointer types. For more information, see [Function pointers](../unsafe-code.md#function-pointers).
+To get a function pointer, use the address-of operator with an explicit function pointer type cast. Don't use the [address-of operator `&`](../operators/pointer-related-operators.md#address-of-operator-) to assign method groups to `void*` or other non-function pointer types. For more information, see [Function pointers](../unsafe-code.md#function-pointers).
diff --git a/docs/csharp/language-reference/toc.yml b/docs/csharp/language-reference/toc.yml
index 82aff46850dba..7db7bac4fec10 100644
--- a/docs/csharp/language-reference/toc.yml
+++ b/docs/csharp/language-reference/toc.yml
@@ -479,8 +479,8 @@ items:
CS8058, CS8059, CS8107, CS8192, CS8302, CS8303, CS8304, CS8305, CS8306, CS8314,
CS8320, CS8370, CS8371, CS8400, CS8401, CS8511, CS8627, CS8630, CS8652, CS8703,
CS8704, CS8706, CS8773, CS8912, CS8919, CS8929, CS8936, CS8957, CS8967, CS9014,
- CS9015, CS9016, CS9017, CS9058, CS9064, CS9103, CS9171, CS9194, CS9202, CS9204,
- CS9240, CS9260, CS9268, CS9269, CS9271, CS9327, CS9328
+ CS9015, CS9016, CS9017, CS9041, CS9058, CS9064, CS9103, CS9171, CS9194, CS9202,
+ CS9204, CS9240, CS9260, CS9268, CS9269, CS9271, CS9327, CS9328
- name: Assembly references
href: ./compiler-messages/assembly-references.md
displayName: >
@@ -510,7 +510,7 @@ items:
CS0056, CS0057, CS0215, CS0216, CS0217, CS0218, CS0448, CS0552, CS0553, CS0554,
CS0555, CS0556, CS0557, CS0558, CS0559, CS0562, CS0563, CS0564, CS0567, CS0590,
CS0660, CS0661, CS0715, CS1037, CS1553, CS1554, CS8930, CS8931, CS9023, CS9024,
- CS9025, CS9308, CS9310, CS9311, CS9312, CS9313, CS9340, CS9341, CS9342
+ CS9025, CS9027, CS9308, CS9310, CS9311, CS9312, CS9313, CS9340, CS9341, CS9342
- name: Parameter / argument mismatch
href: ./compiler-messages/parameter-argument-mismatch.md
displayName: >
@@ -653,10 +653,10 @@ items:
- name: Source generators
href: ./compiler-messages/source-generator-errors.md
displayName: >
- CS9137, CS9138, CS9139, CS9140, CS9141, CS9142, CS9143, CS9144, CS9145, CS9146,
- CS9147, CS9148, CS9149, CS9150, CS9151, CS9152, CS9153, CS9154, CS9155, CS9156,
- CS9157, CS9158, CS9159, CS9160, CS9161, CS9177, CS9178, CS9206, CS9207, CS9231,
- CS9232, CS9233, CS9234, CS9235, CS9270
+ CS9057, CS9067, CS9137, CS9138, CS9139, CS9140, CS9141, CS9142, CS9143, CS9144,
+ CS9145, CS9146, CS9147, CS9148, CS9149, CS9150, CS9151, CS9152, CS9153, CS9154,
+ CS9155, CS9156, CS9157, CS9158, CS9159, CS9160, CS9161, CS9177, CS9178, CS9206,
+ CS9207, CS9231, CS9232, CS9233, CS9234, CS9235, CS9270
- name: File local types
href: ./compiler-messages/file-local-types.md
displayName: >
@@ -680,7 +680,7 @@ items:
displayName: >
CS0193, CS0196, CS0208, CS0209, CS0210, CS0211, CS0212, CS0213, CS0214, CS0227,
CS0233, CS0242, CS0244, CS0254, CS0459, CS0821, CS1641, CS1642, CS1656, CS1663,
- CS1665, CS1666, CS1708, CS1716, CS1919, CS4004, CS8812, CS9123
+ CS1665, CS1666, CS1708, CS1716, CS1919, CS4004, CS8812, CS9049, CS9123
- name: Warning waves
href: ./compiler-messages/warning-waves.md
displayName: >
diff --git a/docs/csharp/misc/sorry-we-don-t-have-specifics-on-this-csharp-error.md b/docs/csharp/misc/sorry-we-don-t-have-specifics-on-this-csharp-error.md
index 9b760c8339497..418261182c03b 100644
--- a/docs/csharp/misc/sorry-we-don-t-have-specifics-on-this-csharp-error.md
+++ b/docs/csharp/misc/sorry-we-don-t-have-specifics-on-this-csharp-error.md
@@ -451,13 +451,27 @@ f1_keywords:
- "CS9020"
- "CS9021"
- "CS9022"
- - "CS9027"
- - "CS9041"
- "CS9044"
- "CS9046"
- - "CS9049"
- "CS9064"
- - "CS9067"
+# Coming in C# 15
+ - "CS9343"
+ - "CS9344"
+ - "CS9345"
+ - "CS9346"
+ - "CS9347"
+ - "CS9348"
+ - "CS9349"
+ - "CS9350"
+ - "CS9351"
+ - "CS9352"
+ - "CS9353"
+ - "CS9354"
+ - "CS9355"
+ - "CS9356"
+ - "CS9357"
+ - "CS9358"
+ - "CS9359"
helpviewer_keywords:
- "errors [C#], additional information"
---
diff --git a/docs/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method.md b/docs/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method.md
index a4e274ea04933..835f9c07eef54 100644
--- a/docs/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method.md
+++ b/docs/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method.md
@@ -10,7 +10,28 @@ ms.topic: how-to
This article shows how to implement your own extension methods for any .NET type. Client code can use your extension methods. Client projects must reference the assembly that contains them. Client projects must add a [using](../../language-reference/keywords/using-directive.md) directive that specifies the namespace in which the extension methods are defined.
-To define and call the extension method:
+Beginning with C# 14, there are two syntaxes you can use to define extension methods. C# 14 adds [extension](../../language-reference/keywords/extension.md) blocks, where you define extension members for a type. Before C# 14, you add the [this](../../language-reference/keywords/this.md) modifier to the first parameter of a static method to indicate that the method appears as a member of an instance of the parameter type.
+
+## Extension blocks (C# 14 and later)
+
+Beginning with C# 14, you can declare extension methods using *extension blocks*. An extension block is a block in a non-nested, non-generic, static class that contains extension members for a type or an instance of that type.
+
+To define and call an extension method using extension blocks:
+
+1. Define a static [class](./static-classes-and-static-class-members.md) to contain the extension method. The class can't be nested inside another type and must be visible to client code. For more information about accessibility rules, see [Access Modifiers](./access-modifiers.md).
+1. Use an [extension](../../language-reference/keywords/extension.md) block to declare extension members for a type.
+1. In the calling code, add a `using` directive to specify the [namespace](../../language-reference/keywords/namespace.md) that contains the extension method class.
+1. Call the methods as instance methods on the type.
+
+The following example implements an extension method named `WordCount` using the C# 14 extension block syntax. The method operates on the class. The `CustomExtensions` namespace is imported into the application namespace, and the method is called as if it were an instance method on the string.
+
+:::code language="csharp" source="./snippets/how-to-implement-and-call-a-custom-extension-method/Program.cs" :::
+
+## Extension methods (earlier versions)
+
+Before C# 14, you declare an extension method by adding the [this](../../language-reference/keywords/this.md) modifier to the first parameter of a static method.
+
+To define and call an extension method using the classic syntax:
1. Define a static [class](./static-classes-and-static-class-members.md) to contain the extension method. The class can't be nested inside another type and must be visible to client code. For more information about accessibility rules, see [Access Modifiers](./access-modifiers.md).
1. Implement the extension method as a static method with at least the same visibility as the containing class.
@@ -18,15 +39,16 @@ To define and call the extension method:
1. In the calling code, add a `using` directive to specify the [namespace](../../language-reference/keywords/namespace.md) that contains the extension method class.
1. Call the methods as instance methods on the type.
-> [!NOTE]
->
-> The first parameter is not specified by calling code because it represents the type on which the operator is being applied, and the compiler already knows the type of your object. You only have to provide arguments for parameters 2 through `n`.
+The following example implements an extension method named `WordCount` using the classic syntax. The method operates on the class, which is specified as the first method parameter with the `this` modifier. The `CustomExtensions` namespace is imported into the application namespace, and the method is called as if it were an instance method on the string.
-The following example implements an extension method named `WordCount` in the `CustomExtensions.StringExtension` class. The method operates on the class, which is specified as the first method parameter. The `CustomExtensions` namespace is imported into the application namespace, and the method is called inside the `Main` method.
+:::code language="csharp" source="./snippets/how-to-implement-and-call-a-custom-extension-method-classic/Program.cs" :::
-:::code language="csharp" source="./snippets/how-to-implement-and-call-a-custom-extension-method/Program.cs" :::
+> [!NOTE]
+> The first parameter is not specified by calling code because it represents the type on which the method is being applied, and the compiler already knows the type of your object. You only have to provide arguments for parameters 2 through `n`.
+
+## General information
-Overload resolution prefers instance or static method defined by the type itself to extension methods. Extension methods can't access any private data in the extended class.
+Overload resolution prefers instance or static methods defined by the type itself to extension methods. Extension methods can't access any private data in the extended class.
## See also
diff --git a/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/Program.cs b/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/Program.cs
new file mode 100644
index 0000000000000..095d7b37f9376
--- /dev/null
+++ b/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/Program.cs
@@ -0,0 +1,24 @@
+using CustomExtensions;
+
+string s = "The quick brown fox jumped over the lazy dog.";
+// Call the method as if it were an
+// instance method on the type. Note that the first
+// parameter is not specified by the calling code.
+int i = s.WordCount();
+System.Console.WriteLine($"Word count of s is {i}");
+
+
+namespace CustomExtensions
+{
+ // Extension methods must be defined in a static class.
+ public static class StringExtension
+ {
+ // This is the extension method.
+ // The first parameter takes the "this" modifier
+ // and specifies the type to be extended.
+ public static int WordCount(this string str)
+ {
+ return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
+ }
+ }
+}
diff --git a/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/how-to-implement-and-call-a-custom-extension-method-classic.csproj b/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/how-to-implement-and-call-a-custom-extension-method-classic.csproj
new file mode 100644
index 0000000000000..dfb40caafcf9a
--- /dev/null
+++ b/docs/csharp/programming-guide/classes-and-structs/snippets/how-to-implement-and-call-a-custom-extension-method-classic/how-to-implement-and-call-a-custom-extension-method-classic.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net10.0
+ enable
+ enable
+
+
+
diff --git a/docs/machine-learning/resources/ml-net-cli-telemetry.md b/docs/machine-learning/resources/ml-net-cli-telemetry.md
index a49ddf1cbc7e2..7d15eb96c6ad2 100644
--- a/docs/machine-learning/resources/ml-net-cli-telemetry.md
+++ b/docs/machine-learning/resources/ml-net-cli-telemetry.md
@@ -1,7 +1,7 @@
---
title: Telemetry collection by ML.NET CLI
description: Learn about ML.NET CLI telemetry features that collect usage information for analysis, which data is collected, and how to disable it. Also, find links to the .NET license agreement and information about Microsoft GDPR compliance.
-ms.topic: article
+ms.topic: concept-article
ms.date: 06/03/2020
ms.custom: mlnet-tooling
---
diff --git a/docs/orleans/Directory.Build.props b/docs/orleans/Directory.Build.props
index 748c852029cca..a571f013795fd 100644
--- a/docs/orleans/Directory.Build.props
+++ b/docs/orleans/Directory.Build.props
@@ -17,7 +17,7 @@
-
-
+
+
diff --git a/docs/orleans/dashboard/index.md b/docs/orleans/dashboard/index.md
index d3914a04c24d0..9ed5319bd3877 100644
--- a/docs/orleans/dashboard/index.md
+++ b/docs/orleans/dashboard/index.md
@@ -2,7 +2,7 @@
title: Orleans Dashboard
description: Learn how to use the Orleans Dashboard for real-time monitoring of your Orleans cluster, silos, and grains.
ms.date: 01/20/2026
-ms.topic: conceptual
+ms.topic: concept-article
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/deployment/handling-failures.md b/docs/orleans/deployment/handling-failures.md
index a89bcb6f848da..045ac0de8cfa9 100644
--- a/docs/orleans/deployment/handling-failures.md
+++ b/docs/orleans/deployment/handling-failures.md
@@ -2,7 +2,7 @@
title: Failure handling
description: Learn how to handle failures in Orleans apps.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Failure handling
diff --git a/docs/orleans/grains/code-generation.md b/docs/orleans/grains/code-generation.md
index 6ce6748b22269..a082678569079 100644
--- a/docs/orleans/grains/code-generation.md
+++ b/docs/orleans/grains/code-generation.md
@@ -2,7 +2,7 @@
title: Code generation
description: Learn how to use code generation in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/grains/event-sourcing/event-sourcing-configuration.md b/docs/orleans/grains/event-sourcing/event-sourcing-configuration.md
index 235e400772936..6c9a26d9e1d1e 100644
--- a/docs/orleans/grains/event-sourcing/event-sourcing-configuration.md
+++ b/docs/orleans/grains/event-sourcing/event-sourcing-configuration.md
@@ -2,7 +2,7 @@
title: Event sourcing configuration
description: Learn about event sourcing configuration in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: how-to
---
# Event sourcing configuration
diff --git a/docs/orleans/grains/event-sourcing/immediate-vs-delayed-confirmation.md b/docs/orleans/grains/event-sourcing/immediate-vs-delayed-confirmation.md
index d432adbad15a4..e2c72fbc9539a 100644
--- a/docs/orleans/grains/event-sourcing/immediate-vs-delayed-confirmation.md
+++ b/docs/orleans/grains/event-sourcing/immediate-vs-delayed-confirmation.md
@@ -2,7 +2,7 @@
title: Immediate and delayed confirmation
description: Learn the differences between immediate and delayed confirmation in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Immediate and delayed confirmations
diff --git a/docs/orleans/grains/event-sourcing/journaledgrain-basics.md b/docs/orleans/grains/event-sourcing/journaledgrain-basics.md
index dbb6cfb304c25..587d6efd12a60 100644
--- a/docs/orleans/grains/event-sourcing/journaledgrain-basics.md
+++ b/docs/orleans/grains/event-sourcing/journaledgrain-basics.md
@@ -2,7 +2,7 @@
title: The JournaledGrain API
description: Learn the concepts of the JournaledGrain API in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# JournaledGrain basics
diff --git a/docs/orleans/grains/event-sourcing/journaledgrain-diagnostics.md b/docs/orleans/grains/event-sourcing/journaledgrain-diagnostics.md
index 7e0f7e1e187a3..bfa4d18779860 100644
--- a/docs/orleans/grains/event-sourcing/journaledgrain-diagnostics.md
+++ b/docs/orleans/grains/event-sourcing/journaledgrain-diagnostics.md
@@ -2,7 +2,7 @@
title: JournaledGrain diagnostics
description: Learn how to use JournaledGrain diagnostics in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# JournaledGrain diagnostics
diff --git a/docs/orleans/grains/event-sourcing/log-consistency-providers.md b/docs/orleans/grains/event-sourcing/log-consistency-providers.md
index 350af23925928..ff3cfa7218eb4 100644
--- a/docs/orleans/grains/event-sourcing/log-consistency-providers.md
+++ b/docs/orleans/grains/event-sourcing/log-consistency-providers.md
@@ -2,7 +2,7 @@
title: Log-consistency providers
description: Learn about log-consistency providers in .NET Orleans.
ms.date: 03/29/2025
-ms.topic: article
+ms.topic: concept-article
---
# Log-consistency providers
diff --git a/docs/orleans/grains/event-sourcing/notifications.md b/docs/orleans/grains/event-sourcing/notifications.md
index e746e316ae14f..ce1f19a9a7a8e 100644
--- a/docs/orleans/grains/event-sourcing/notifications.md
+++ b/docs/orleans/grains/event-sourcing/notifications.md
@@ -2,7 +2,7 @@
title: Notifications
description: Learn the concepts of notifications in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Notifications
diff --git a/docs/orleans/grains/event-sourcing/replicated-instances.md b/docs/orleans/grains/event-sourcing/replicated-instances.md
index 0c736356bf50d..f9ed731fd0f44 100644
--- a/docs/orleans/grains/event-sourcing/replicated-instances.md
+++ b/docs/orleans/grains/event-sourcing/replicated-instances.md
@@ -2,7 +2,7 @@
title: Replicated grains
description: Learn the concepts of replicated grains in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Replicated grains
diff --git a/docs/orleans/grains/external-tasks-and-grains.md b/docs/orleans/grains/external-tasks-and-grains.md
index b04379901564c..dfac2683db520 100644
--- a/docs/orleans/grains/external-tasks-and-grains.md
+++ b/docs/orleans/grains/external-tasks-and-grains.md
@@ -2,7 +2,7 @@
title: External tasks and grains
description: Learn about external tasks and grains in .NET Orleans.
ms.date: 03/31/2025
-ms.topic: article
+ms.topic: concept-article
---
# External tasks and grains
diff --git a/docs/orleans/grains/grain-extensions.md b/docs/orleans/grains/grain-extensions.md
index 12607932bb07d..9cdd4a95382b0 100644
--- a/docs/orleans/grains/grain-extensions.md
+++ b/docs/orleans/grains/grain-extensions.md
@@ -2,7 +2,7 @@
title: Grain extensions
description: Learn how to extend an Orleans Grain.
ms.date: 03/31/2025
-ms.topic: article
+ms.topic: concept-article
---
# Grain extensions
diff --git a/docs/orleans/grains/grain-identity.md b/docs/orleans/grains/grain-identity.md
index 2c4332941271b..1ab54007bcfc4 100644
--- a/docs/orleans/grains/grain-identity.md
+++ b/docs/orleans/grains/grain-identity.md
@@ -2,7 +2,7 @@
title: Grain identity
description: Learn about grain identities in .NET Orleans.
ms.date: 03/31/2025
-ms.topic: article
+ms.topic: concept-article
---
# Grain identity
diff --git a/docs/orleans/grains/grain-lifecycle.md b/docs/orleans/grains/grain-lifecycle.md
index 4f4ef2b2be6aa..d28857d4176c5 100644
--- a/docs/orleans/grains/grain-lifecycle.md
+++ b/docs/orleans/grains/grain-lifecycle.md
@@ -2,7 +2,7 @@
title: Grain lifecycle overview
description: Learn about grain lifecycles in .NET Orleans.
ms.date: 01/21/2026
-ms.topic: article
+ms.topic: concept-article
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/grains/grain-placement.md b/docs/orleans/grains/grain-placement.md
index 7b688a3b5686b..3db3d66270f42 100644
--- a/docs/orleans/grains/grain-placement.md
+++ b/docs/orleans/grains/grain-placement.md
@@ -2,7 +2,7 @@
title: Grain placement
description: Learn about grain placement in .NET Orleans.
ms.date: 01/22/2026
-ms.topic: article
+ms.topic: concept-article
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/grains/grain-references.md b/docs/orleans/grains/grain-references.md
index a70904c4fad0e..38d807b926dd9 100644
--- a/docs/orleans/grains/grain-references.md
+++ b/docs/orleans/grains/grain-references.md
@@ -2,7 +2,7 @@
title: Grain references
description: Learn about grain references in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Grain references
diff --git a/docs/orleans/grains/grain-versioning/backward-compatibility-guidelines.md b/docs/orleans/grains/grain-versioning/backward-compatibility-guidelines.md
index c771be0b5978e..906324051eacf 100644
--- a/docs/orleans/grains/grain-versioning/backward-compatibility-guidelines.md
+++ b/docs/orleans/grains/grain-versioning/backward-compatibility-guidelines.md
@@ -2,7 +2,7 @@
title: Backward compatibility guidelines
description: Learn the backward compatibility guidelines in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Backward compatibility guidelines
diff --git a/docs/orleans/grains/grain-versioning/compatible-grains.md b/docs/orleans/grains/grain-versioning/compatible-grains.md
index 400a4670b83ee..417ac006598a5 100644
--- a/docs/orleans/grains/grain-versioning/compatible-grains.md
+++ b/docs/orleans/grains/grain-versioning/compatible-grains.md
@@ -2,7 +2,7 @@
title: Compatible grains
description: Learn about compatible grains in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Compatible grains
diff --git a/docs/orleans/grains/grain-versioning/grain-versioning.md b/docs/orleans/grains/grain-versioning/grain-versioning.md
index 736ad193e2452..fd8fbc6a83280 100644
--- a/docs/orleans/grains/grain-versioning/grain-versioning.md
+++ b/docs/orleans/grains/grain-versioning/grain-versioning.md
@@ -2,7 +2,7 @@
title: Grain interface versioning
description: Learn how to use grain interface versioning in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Grain interface versioning
diff --git a/docs/orleans/grains/grain-versioning/version-selector-strategy.md b/docs/orleans/grains/grain-versioning/version-selector-strategy.md
index 1d96475e62d0a..43aa82a626166 100644
--- a/docs/orleans/grains/grain-versioning/version-selector-strategy.md
+++ b/docs/orleans/grains/grain-versioning/version-selector-strategy.md
@@ -2,7 +2,7 @@
title: Version selector strategy
description: Learn how to use the version selector strategy in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Version selector strategy
diff --git a/docs/orleans/grains/grainservices.md b/docs/orleans/grains/grainservices.md
index a463c22531447..d9b494e98885f 100644
--- a/docs/orleans/grains/grainservices.md
+++ b/docs/orleans/grains/grainservices.md
@@ -2,7 +2,7 @@
title: Create a GrainService
description: Learn how to create a GrainService in .NET Orleans.
ms.date: 01/21/2026
-ms.topic: article
+ms.topic: how-to
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/grains/interceptors.md b/docs/orleans/grains/interceptors.md
index 6b0ffbc426719..4c16ded552c42 100644
--- a/docs/orleans/grains/interceptors.md
+++ b/docs/orleans/grains/interceptors.md
@@ -2,7 +2,7 @@
title: Grain call filters
description: Learn about grain call filters in .NET Orleans.
ms.date: 01/21/2026
-ms.topic: article
+ms.topic: concept-article
---
# Grain call filters
diff --git a/docs/orleans/grains/observers.md b/docs/orleans/grains/observers.md
index 7efbfb40bcda9..06006f066b586 100644
--- a/docs/orleans/grains/observers.md
+++ b/docs/orleans/grains/observers.md
@@ -2,7 +2,7 @@
title: Observers
description: Learn about observers in .NET Orleans.
ms.date: 01/21/2026
-ms.topic: article
+ms.topic: concept-article
zone_pivot_groups: orleans-version
---
diff --git a/docs/orleans/grains/oneway.md b/docs/orleans/grains/oneway.md
index 9dd54918a75c5..6ee85718c86da 100644
--- a/docs/orleans/grains/oneway.md
+++ b/docs/orleans/grains/oneway.md
@@ -2,7 +2,7 @@
title: One-way requests
description: Learn about one-way requests in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# One-way requests
diff --git a/docs/orleans/grains/request-context.md b/docs/orleans/grains/request-context.md
index 6dc381c1e9336..66abf04f124b7 100644
--- a/docs/orleans/grains/request-context.md
+++ b/docs/orleans/grains/request-context.md
@@ -2,7 +2,7 @@
title: Request context
description: Learn about request context in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Request context
diff --git a/docs/orleans/grains/request-scheduling.md b/docs/orleans/grains/request-scheduling.md
index 435f0605f38c5..76f87bfee0249 100644
--- a/docs/orleans/grains/request-scheduling.md
+++ b/docs/orleans/grains/request-scheduling.md
@@ -2,7 +2,7 @@
title: Request scheduling
description: Learn about request scheduling in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Request scheduling
diff --git a/docs/orleans/grains/stateless-worker-grains.md b/docs/orleans/grains/stateless-worker-grains.md
index 2817515c60b84..0bcd396e68deb 100644
--- a/docs/orleans/grains/stateless-worker-grains.md
+++ b/docs/orleans/grains/stateless-worker-grains.md
@@ -2,7 +2,7 @@
title: Stateless worker grains
description: Learn how to use stateless worker grains in .NET Orleans.
ms.date: 05/23/2025
-ms.topic: article
+ms.topic: concept-article
---
# Stateless worker grains
diff --git a/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj b/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
index 789d953d87e99..c5342f4f329c9 100644
--- a/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
+++ b/docs/orleans/streaming/snippets/broadcastchannel/BroadcastChannel.Silo/BroadcastChannel.Silo.csproj
@@ -5,7 +5,7 @@
-
+
diff --git a/docs/orleans/tutorials-and-samples/snippets/minimal/Client/Client.csproj b/docs/orleans/tutorials-and-samples/snippets/minimal/Client/Client.csproj
index 0ae3321e07528..f22beea3fe42c 100644
--- a/docs/orleans/tutorials-and-samples/snippets/minimal/Client/Client.csproj
+++ b/docs/orleans/tutorials-and-samples/snippets/minimal/Client/Client.csproj
@@ -6,7 +6,7 @@
-
+
diff --git a/docs/orleans/tutorials-and-samples/snippets/minimal/GrainInterfaces/GrainInterfaces.csproj b/docs/orleans/tutorials-and-samples/snippets/minimal/GrainInterfaces/GrainInterfaces.csproj
index 5f02f1ce9d740..584c5d821eeef 100644
--- a/docs/orleans/tutorials-and-samples/snippets/minimal/GrainInterfaces/GrainInterfaces.csproj
+++ b/docs/orleans/tutorials-and-samples/snippets/minimal/GrainInterfaces/GrainInterfaces.csproj
@@ -2,8 +2,8 @@
-
-
+
+
diff --git a/docs/orleans/tutorials-and-samples/snippets/minimal/Grains/Grains.csproj b/docs/orleans/tutorials-and-samples/snippets/minimal/Grains/Grains.csproj
index 817fcfa2007c1..97557c1611c9e 100644
--- a/docs/orleans/tutorials-and-samples/snippets/minimal/Grains/Grains.csproj
+++ b/docs/orleans/tutorials-and-samples/snippets/minimal/Grains/Grains.csproj
@@ -2,7 +2,7 @@
-
+
diff --git a/docs/orleans/tutorials-and-samples/snippets/minimal/Silo/Silo.csproj b/docs/orleans/tutorials-and-samples/snippets/minimal/Silo/Silo.csproj
index 50e051b16b2cc..804cb640894a3 100644
--- a/docs/orleans/tutorials-and-samples/snippets/minimal/Silo/Silo.csproj
+++ b/docs/orleans/tutorials-and-samples/snippets/minimal/Silo/Silo.csproj
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/docs/visual-basic/programming-guide/concepts/async/index.md b/docs/visual-basic/programming-guide/concepts/async/index.md
index fc124faaa2fb9..0cbbf699d8d8a 100644
--- a/docs/visual-basic/programming-guide/concepts/async/index.md
+++ b/docs/visual-basic/programming-guide/concepts/async/index.md
@@ -1,21 +1,21 @@
---
description: "Learn more about: Asynchronous programming with Async and Await (Visual Basic)"
title: "Asynchronous Programming with Async and Await"
-ms.date: 08/29/2025
+ms.date: 01/27/2026
ai-usage: ai-generated
---
# Asynchronous programming with Async and Await (Visual Basic)
-The [Task asynchronous programming (TAP) model](../../../../standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap.md) provides a layer of abstraction over typical asynchronous coding. In this model, you write code as a sequence of statements, the same as usual. The difference is you can read your task-based code as the compiler processes each statement and before it starts processing the next statement. To accomplish this model, the compiler performs many transformations to complete each task. Some statements can initiate work and return a object that represents the ongoing work and the compiler must resolve these transformations. The goal of task asynchronous programming is to enable code that reads like a sequence of statements, but executes in a more complicated order. Execution is based on external resource allocation and when tasks complete.
+The [Task asynchronous programming (TAP) model](../../../../standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap.md) provides a layer of abstraction over typical asynchronous coding. In this model, you write code as a sequence of statements, the same as usual. The difference is that you can read your task-based code as the compiler processes each statement and before it starts processing the next statement. To accomplish this model, the compiler performs many transformations to complete each task. Some statements can initiate work and return a object that represents the ongoing work. The compiler must resolve these transformations. The goal of task asynchronous programming is to enable code that reads like a sequence of statements but executes in a more complicated order. Execution is based on external resource allocation and when tasks complete.
The task asynchronous programming model is analogous to how people give instructions for processes that include asynchronous tasks. This article uses an example with instructions for making breakfast to show how the `Async` and `Await` keywords make it easier to reason about code that includes a series of asynchronous instructions. The instructions for making a breakfast might be provided as a list:
1. Pour a cup of coffee.
-2. Heat a pan, then fry two eggs.
-3. Cook three hash brown patties.
-4. Toast two pieces of bread.
-5. Spread butter and jam on the toast.
-6. Pour a glass of orange juice.
+1. Heat a pan, then fry two eggs.
+1. Cook three hash brown patties.
+1. Toast two pieces of bread.
+1. Spread butter and jam on the toast.
+1. Pour a glass of orange juice.
If you have experience with cooking, you might complete these instructions **asynchronously**. You start warming the pan for eggs, then start cooking the hash browns. You put the bread in the toaster, then start cooking the eggs. At each step of the process, you start a task, and then transition to other tasks that are ready for your attention.
@@ -29,6 +29,10 @@ Consider the same list of synchronous instructions written as Visual Basic code
:::code language="vb" source="snippets/breakfast/Program.vb" id="SynchronousBreakfast":::
+If you try the preceding code yourself, you need to define the following additional types:
+
+:::code language="vb" source="snippets/breakfast/Program.vb" id="HelperClasses":::
+
If you interpret these instructions as a computer would, breakfast takes about 30 minutes to prepare. The duration is the sum of the individual task times. The computer blocks for each statement until all work completes, and then it proceeds to the next task statement. This approach can take significant time. In the breakfast example, the computer method creates an unsatisfying breakfast. Later tasks in the synchronous list, like toasting the bread, don't start until earlier tasks complete. Some food gets cold before the breakfast is ready to serve.
If you want the computer to execute instructions asynchronously, you must write asynchronous code. When you write client programs, you want the UI to be responsive to user input. Your application shouldn't freeze all interaction while downloading data from the web. When you write server programs, you don't want to block threads that might be serving other requests. Using synchronous code when asynchronous alternatives exist hurts your ability to scale out less expensively. You pay for blocked threads.
@@ -37,7 +41,7 @@ Successful modern apps require asynchronous code. Without language support, writ
## Don't block, await instead
-The previous code highlights an unfortunate programming practice: Writing synchronous code to perform asynchronous operations. The code blocks the current thread from doing any other work. The code doesn't interrupt the thread while there are running tasks. The outcome of this model is similar to staring at the toaster after you put in the bread. You ignore any interruptions and don't start other tasks until the bread pops up. You don't take the butter and jam out of the fridge. You might miss seeing a fire starting on the stove. You want to both toast the bread and handle other concerns at the same time. The same is true with your code.
+The previous code highlights an unfortunate programming practice: writing synchronous code to perform asynchronous operations. The code blocks the current thread from doing any other work. The code doesn't interrupt the thread while there are running tasks. The outcome of this model is similar to staring at the toaster after you put in the bread. You ignore any interruptions and don't start other tasks until the bread pops up. You don't take the butter and jam out of the fridge. You might miss seeing a fire starting on the stove. You want to both toast the bread and handle other concerns at the same time. The same is true with your code.
You can start by updating the code so the thread doesn't block while tasks are running. The `Await` keyword provides a nonblocking way to start a task, then continue execution when the task completes. A simple asynchronous version of the breakfast code looks like the following snippet:
@@ -48,17 +52,17 @@ The code updates the original method bodies of `FryEggs`, `FryHashBrowns`, and `
> [!NOTE]
> The updated code doesn't yet take advantage of key features of asynchronous programming, which can result in shorter completion times. The code processes the tasks in roughly the same amount of time as the initial synchronous version. For the full method implementations, see the final version of the code later in this article.
-Let's apply the breakfast example to the updated code. The thread doesn't block while the eggs or hash browns are cooking, but the code also doesn't start other tasks until the current work completes. You still put the bread in the toaster and stare at the toaster until the bread pops up, but you can now respond to interruptions. In a restaurant where multiple orders are placed, the cook can start a new order while another is already cooking.
+Let's apply the breakfast example to the updated code. The thread isn't blocked while the eggs or hash browns are cooking, but the code also doesn't start other tasks until the current work completes. You still put the bread in the toaster and stare at the toaster until the bread pops up, but you can now respond to interruptions. In a restaurant where multiple orders are placed, the cook can start a new order while another is already cooking.
In the updated code, the thread working on the breakfast isn't blocked while waiting for any started task that's unfinished. For some applications, this change is all you need. You can enable your app to support user interaction while data downloads from the web. In other scenarios, you might want to start other tasks while waiting for the previous task to complete.
## Start tasks concurrently
-For most operations, you want to start several independent tasks immediately. As each task completes, you initiate other work that's ready to start. When you apply this methodology to the breakfast example, you can prepare breakfast more quickly. You also get everything ready close to the same time, so you can enjoy a hot breakfast.
+For most operations, you can start several independent tasks immediately. As each task completes, you can initiate other work that's ready to start. When you apply this methodology to the breakfast example, you can prepare breakfast more quickly. You also get everything ready close to the same time, so you can enjoy a hot breakfast.
-The class and related types are classes you can use to apply this style of reasoning to tasks that are in progress. This approach enables you to write code that more closely resembles the way you create breakfast in real life. You start cooking the eggs, hash browns, and toast at the same time. As each food item requires action, you turn your attention to that task, take care of the action, and then wait for something else that requires your attention.
+Use the class and related types to apply this style of reasoning to tasks that are in progress. This approach enables you to write code that more closely resembles the way you create breakfast in real life. You start cooking the eggs, hash browns, and toast at the same time. As each food item requires action, you turn your attention to that task, take care of the action, and then wait for something else that requires your attention.
-In your code, you start a task and hold on to the object that represents the work. You use the `Await` method on the task to delay acting on the work until the result is ready.
+In your code, start a task and hold on to the object that represents the work. Use the `Await` expression on the task to delay acting on the work until the result is ready.
Apply these changes to the breakfast code. The first step is to store the tasks for operations when they start, rather than using the `Await` expression:
@@ -223,7 +227,7 @@ Unhandled exception. System.InvalidOperationException: The toaster is on fire
Notice that quite a few tasks finish between the time when the toaster catches fire and the system observes the exception. When a task that runs asynchronously throws an exception, that task is **faulted**. The object holds the exception that was thrown in the property. Faulted tasks *throw* the exception when the `Await` expression is applied to the task.
-There are two important mechanisms to understand about this process:
+Two important mechanisms explain this process:
- How an exception is stored in a faulted task.
- How an exception is unpackaged and rethrown when code waits (`Await`) on a faulted task.
@@ -242,7 +246,7 @@ Before you continue to the next section, comment out the following two statement
' Throw New InvalidOperationException("The toaster is on fire")
```
-## Apply await expressions to tasks efficiently
+## Efficiently apply await expressions to tasks
You can improve the series of `Await` expressions at the end of the previous code by using methods of the class. One API is the method, which returns a object that completes when all the tasks in its argument list are complete. The following code demonstrates this method:
@@ -258,7 +262,7 @@ Another option is to use the metho
:::code language="vb" source="snippets/breakfast/ConcurrentBreakfast.vb" id="ConcurrentBreakfast":::
-Near the end of the code snippet, notice the `Await finishedTask` expression. This line is important because `Task.WhenAny` returns a `Task(Of Task)` - a wrapper task that contains the completed task. When you `Await Task.WhenAny`, you're waiting for the wrapper task to complete, and the result is the actual task that finished first. However, to retrieve that task's result or ensure any exceptions are properly thrown, you must `Await` the completed task itself (stored in `finishedTask`). Even though you know the task has finished, awaiting it again allows you to access its result or handle any exceptions that might have caused it to fault.
+Near the end of the code snippet, notice the `Await finishedTask` expression. This line is important because `Task.WhenAny` returns a `Task(Of Task)` - a wrapper task that contains the completed task. When you `Await Task.WhenAny`, you're waiting for the wrapper task to complete, and the result is the actual task that finished first. However, to retrieve that task's result or ensure any exceptions are properly thrown, you must `Await` the completed task itself (stored in `finishedTask`). Even though you know the task is finished, awaiting it again allows you to access its result or handle any exceptions that might have caused it to fault.
### Review final code
@@ -276,7 +280,7 @@ The final code is asynchronous. It more accurately reflects how a person might c
The `Async` and `Await` keywords provide syntactic simplification over using directly. While `Async`/`Await` and `ContinueWith` have similar semantics for handling asynchronous operations, the compiler doesn't necessarily translate `Await` expressions directly into `ContinueWith` method calls. Instead, the compiler generates optimized state machine code that provides the same logical behavior. This transformation provides significant readability and maintainability benefits, especially when chaining multiple asynchronous operations.
-Consider a scenario where you need to perform multiple sequential asynchronous operations. Here's how the same logic looks when implemented with `ContinueWith` compared to `Async`/`Await`:
+Consider a scenario where you need to perform multiple sequential asynchronous operations. Here's how the same logic looks when implemented by using `ContinueWith` compared to `Async`/`Await`:
### Using ContinueWith
@@ -351,7 +355,7 @@ The `Async`/`Await` approach offers several advantages:
- **Debugging**: The call stack and debugger experience is much better with `Async`/`Await`.
- **Performance**: The compiler optimizations for `Async`/`Await` are more sophisticated than manual `ContinueWith` chains.
-The benefit becomes even more apparent as the number of chained operations increases. While a single continuation might be manageable with `ContinueWith`, sequences of 3-4 or more asynchronous operations quickly become difficult to read and maintain. This pattern, known as "monadic do-notation" in functional programming, allows you to compose multiple asynchronous operations in a sequential, readable manner.
+The benefit becomes even more apparent as the number of chained operations increases. While a single continuation might be manageable by using `ContinueWith`, sequences of three or four or more asynchronous operations quickly become difficult to read and maintain. This pattern, known as "monadic do-notation" in functional programming, allows you to compose multiple asynchronous operations in a sequential, readable manner.
## See also
diff --git a/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/Program.vb b/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/Program.vb
index fd2ae23bb09af..ed289600e51da 100644
--- a/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/Program.vb
+++ b/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/Program.vb
@@ -1,8 +1,10 @@
-Imports System
+Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks
' These classes are intentionally empty for the purpose of this example. They are simply marker classes for the purpose of demonstration, contain no properties, and serve no other purpose.
+
+'
Friend Class HashBrown
End Class
@@ -17,6 +19,7 @@ End Class
Friend Class Toast
End Class
+'
Module Program
'
@@ -94,4 +97,4 @@ Module Program
Return New Coffee()
End Function
'
-End Module
\ No newline at end of file
+End Module
diff --git a/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/breakfast.vbproj b/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/breakfast.vbproj
index aee73149c0567..469d2086aa26f 100644
--- a/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/breakfast.vbproj
+++ b/docs/visual-basic/programming-guide/concepts/async/snippets/breakfast/breakfast.vbproj
@@ -2,7 +2,7 @@
Exe
- net9.0
+ net10.0
\ No newline at end of file