diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 6531acacdf811..b3e575189adb3 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -93,7 +93,7 @@
############### .NET Core ########################
# What's New
-/docs/core/whats-new/ @camsoper @gewarren @dotnet/docs
+/docs/core/whats-new/ @camsoper @dotnet/docs
# Deployment
/docs/core/deploying/ @adegeo @dotnet/docs
# Diagnostics
@@ -105,7 +105,7 @@
# Install
/docs/core/install/ @adegeo @dotnet/docs
# Breaking changes
-/docs/core/compatibility/ @camsoper @gewarren @dotnet/docs
+/docs/core/compatibility/ @camsoper @dotnet/docs
# Project SDKs
/docs/core/project-sdk/ @gewarren @dotnet/docs
# Config settings
@@ -174,7 +174,7 @@
# Data
/docs/standard/data/ @gewarren @dotnet/docs
# Data - SQLite
-/docs/standard/data/sqlite/ @ajcvickers @dotnet/docs
+/docs/standard/data/sqlite/ @dotnet/docs
# Datetime
/docs/standard/datetime/ @adegeo @dotnet/docs
# Design guidelines
diff --git a/.github/ISSUE_TEMPLATE/02-breaking-change.yml b/.github/ISSUE_TEMPLATE/02-breaking-change.yml
index 5ad7906b4e538..d7e5ef1edc7a3 100644
--- a/.github/ISSUE_TEMPLATE/02-breaking-change.yml
+++ b/.github/ISSUE_TEMPLATE/02-breaking-change.yml
@@ -1,5 +1,5 @@
name: ".NET breaking change"
-description: Report a change in .NET that breaks something that worked in a previous version. Intended mostly for product-team use.
+description: This template is for .NET product team members to report breaking changes to documentation content developers. Please report user-discovered issues in the appropriate product repo.
title: "[Breaking change]: "
labels:
- breaking-change
diff --git a/.openpublishing.redirection.csharp.json b/.openpublishing.redirection.csharp.json
index de3bf14f0c23c..2971bef370bbe 100644
--- a/.openpublishing.redirection.csharp.json
+++ b/.openpublishing.redirection.csharp.json
@@ -4156,6 +4156,22 @@
"source_path_from_root": "/docs/csharp/tour-of-csharp/types.md",
"redirect_url": "/dotnet/csharp/tour-of-csharp"
},
+ {
+ "source_path_from_root": "/docs/csharp/tour-of-csharp/tutorials/arrays-and-collections.md",
+ "redirect_url": "/dotnet/csharp/tour-of-csharp/tutorials/list-collection"
+ },
+ {
+ "source_path_from_root": "/docs/csharp/tour-of-csharp/tutorials/local-environment.md",
+ "redirect_url": "/dotnet/csharp/tour-of-csharp/tutorials"
+ },
+ {
+ "source_path_from_root": "/docs/csharp/tour-of-csharp/tutorials/branches-and-loops-local.md",
+ "redirect_url": "/dotnet/csharp/tour-of-csharp/tutorials/branches-and-loops"
+ },
+ {
+ "source_path_from_root": "/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp-local.md",
+ "redirect_url": "/dotnet/csharp/tour-of-csharp/tutorials/numbers-in-csharp"
+ },
{
"source_path_from_root": "/docs/csharp/tuples.md",
"redirect_url": "/dotnet/csharp/language-reference/builtin-types/value-tuples"
diff --git a/.openpublishing.redirection.framework.json b/.openpublishing.redirection.framework.json
index fc1ce33af060e..86c062d8841ec 100644
--- a/.openpublishing.redirection.framework.json
+++ b/.openpublishing.redirection.framework.json
@@ -3502,11 +3502,11 @@
},
{
"source_path_from_root": "/docs/framework/network-programming/accessing-the-internet-through-a-proxy.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-proxy"
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
},
{
"source_path_from_root": "/docs/framework/network-programming/automatic-proxy-detection.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-proxy"
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
},
{
"source_path_from_root": "/docs/framework/network-programming/how-to-override-a-global-proxy-selection.md",
@@ -3522,7 +3522,7 @@
},
{
"source_path_from_root": "/docs/framework/network-programming/proxy-configuration.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-proxy"
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
},
{
"source_path_from_root": "/docs/framework/network-programming/changes-to-the-system-uri-namespace-in-version-2-0.md",
@@ -3534,7 +3534,7 @@
},
{
"source_path_from_root": "/docs/framework/network-programming/how-to-enable-a-webrequest-to-use-a-proxy-to-communicate-with-the-internet.md",
- "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#http-proxy"
+ "redirect_url": "/dotnet/fundamentals/networking/http/httpclient#configure-an-http-proxy"
}
]
}
diff --git a/docs/ai/quickstarts/includes/ai-templates-azure-openai.md b/docs/ai/quickstarts/includes/ai-templates-azure-openai.md
index 65677b9b71ee9..2fa31afdd0187 100644
--- a/docs/ai/quickstarts/includes/ai-templates-azure-openai.md
+++ b/docs/ai/quickstarts/includes/ai-templates-azure-openai.md
@@ -53,7 +53,7 @@ After you install the AI app templates, you can use them to create starter apps
1. Create a new app with the `dotnet new` command and the following parameters:
```dotnetcli
- dotnet new aichatweb --framework "net9.0" --AIServiceProvider "azureopenai" --VectorStore "local"
+ dotnet new aichatweb --framework "net9.0" --AiServiceProvider "azureopenai" --VectorStore "local"
```
The .NET CLI creates a new .NET 9.0 app with the configurations you specified.
diff --git a/docs/ai/quickstarts/includes/ai-templates-ollama.md b/docs/ai/quickstarts/includes/ai-templates-ollama.md
index 15db3c7f0272e..a067e999c8bdc 100644
--- a/docs/ai/quickstarts/includes/ai-templates-ollama.md
+++ b/docs/ai/quickstarts/includes/ai-templates-ollama.md
@@ -53,7 +53,7 @@ After you install the AI app templates, you can use them to create starter apps
1. Create a new app with the `dotnet new` command and the following parameters:
```dotnetcli
- dotnet new aichatweb --framework "net9.0" --AIServiceProvider "ollama" --VectorStore "local"
+ dotnet new aichatweb --framework "net9.0" --AiServiceProvider "ollama" --VectorStore "local"
```
The .NET CLI creates a new .NET 9.0 app with the configurations you specified.
diff --git a/docs/ai/quickstarts/includes/ai-templates-openai.md b/docs/ai/quickstarts/includes/ai-templates-openai.md
index 4fd0f8ce350c1..c8ba8957502ad 100644
--- a/docs/ai/quickstarts/includes/ai-templates-openai.md
+++ b/docs/ai/quickstarts/includes/ai-templates-openai.md
@@ -53,7 +53,7 @@ After you install the AI app templates, you can use them to create starter apps
1. Create a new app with the `dotnet new` command and the following parameters:
```dotnetcli
- dotnet new aichatweb --framework "net9.0" --AIServiceProvider "openai" --VectorStore "local"
+ dotnet new aichatweb --framework "net9.0" --AiServiceProvider "openai" --VectorStore "local"
```
The .NET CLI creates a new .NET 9.0 app with the configurations you specified.
diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md
index 18cae893d186b..d1064c7c46bed 100644
--- a/docs/azure/includes/dotnet-all.md
+++ b/docs/azure/includes/dotnet-all.md
@@ -108,7 +108,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-beta.2](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0-beta.2/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |
-| System.ClientModel | NuGet [1.3.0](https://www.nuget.org/packages/System.ClientModel/1.3.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.3.0/sdk/core/System.ClientModel/) |
+| System.ClientModel | NuGet [1.3.0](https://www.nuget.org/packages/System.ClientModel/1.3.0)
NuGet [1.4.0-beta.1](https://www.nuget.org/packages/System.ClientModel/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.3.0/sdk/core/System.ClientModel/)
GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.4.0-beta.1/sdk/core/System.ClientModel/) |
| Tables | NuGet [12.10.0](https://www.nuget.org/packages/Azure.Data.Tables/12.10.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.10.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.10.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 Translation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Text/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Translation.Text-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_1.0.0/sdk/translation/Azure.AI.Translation.Text/) |
@@ -167,43 +167,43 @@
| Resource Management - Alerts Management | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.AlertsManagement/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AlertsManagement-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AlertsManagement_1.1.0/sdk/alertsmanagement/Azure.ResourceManager.AlertsManagement/) |
| Resource Management - Analysis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Analysis/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Analysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Analysis_1.1.0/sdk/analysisservices/Azure.ResourceManager.Analysis/) |
| Resource Management - API Center | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiCenter-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.0.0-beta.2/sdk/apicenter/Azure.ResourceManager.ApiCenter/) |
-| Resource Management - API Management | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.2.0/sdk/apimanagement/Azure.ResourceManager.ApiManagement/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.0-beta.1/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |
-| Resource Management - App Compliance Automation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.0/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |
+| Resource Management - API Management | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.2.0)
NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.2.0/sdk/apimanagement/Azure.ResourceManager.ApiManagement/)
GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.0-beta.2/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |
+| Resource Management - App Compliance Automation | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.1/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |
| Resource Management - App Configuration | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.4.0/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) |
-| Resource Management - App Platform | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.AppPlatform/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppPlatform-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppPlatform_1.1.1/sdk/appplatform/Azure.ResourceManager.AppPlatform/) |
+| Resource Management - App Platform | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.AppPlatform/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AppPlatform-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppPlatform_1.1.2/sdk/appplatform/Azure.ResourceManager.AppPlatform/) |
| Resource Management - App Service | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.AppService/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppService-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppService_1.3.0/sdk/websites/Azure.ResourceManager.AppService/) |
-| Resource Management - Application Insights | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.0/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |
-| Resource Management - Astro | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.1/sdk/astronomer/Azure.ResourceManager.Astro/) |
+| Resource Management - Application Insights | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |
+| Resource Management - Astro | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.2/sdk/astronomer/Azure.ResourceManager.Astro/) |
| Resource Management - Attestation | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Attestation/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Attestation-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Attestation_1.0.0-beta.4/sdk/attestation/Azure.ResourceManager.Attestation/) |
| Resource Management - Authorization | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Authorization/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Authorization-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Authorization_1.1.3/sdk/authorization/Azure.ResourceManager.Authorization/) |
| Resource Management - Automanage | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Automanage/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Automanage-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automanage_1.1.0/sdk/automanage/Azure.ResourceManager.Automanage/) |
| Resource Management - Automation | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Automation/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Automation-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automation_1.1.0/sdk/automation/Azure.ResourceManager.Automation/) |
| Resource Management - Azure AI Search | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.2.3)
NuGet [1.3.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.3.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Search-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.2.3/sdk/search/Azure.ResourceManager.Search/)
GitHub [1.3.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.3.0-beta.4/sdk/search/Azure.ResourceManager.Search/) |
-| Resource Management - Azure Stack HCI | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.0/sdk/azurestackhci/Azure.ResourceManager.Hci/) |
+| Resource Management - Azure Stack HCI | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.1/sdk/azurestackhci/Azure.ResourceManager.Hci/) |
| Resource Management - Azure VMware Solution | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Avs/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Avs-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Avs_1.4.0/sdk/avs/Azure.ResourceManager.Avs/) |
| Resource Management - Batch | NuGet [1.5.0](https://www.nuget.org/packages/Azure.ResourceManager.Batch/1.5.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Batch-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Batch_1.5.0/sdk/batch/Azure.ResourceManager.Batch/) |
-| Resource Management - Billing | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.0/sdk/billing/Azure.ResourceManager.Billing/) |
+| Resource Management - Billing | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.1/sdk/billing/Azure.ResourceManager.Billing/) |
| Resource Management - Billing Benefits | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.BillingBenefits/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.BillingBenefits-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BillingBenefits_1.0.0-beta.3/sdk/billingbenefits/Azure.ResourceManager.BillingBenefits/) |
| Resource Management - Blueprint | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Blueprint/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Blueprint-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Blueprint_1.0.0-beta.4/sdk/blueprint/Azure.ResourceManager.Blueprint/) |
| Resource Management - Bot Service | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.BotService-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.1.0/sdk/botservice/Azure.ResourceManager.BotService/) |
| Resource Management - Change Analysis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ChangeAnalysis/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ChangeAnalysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ChangeAnalysis_1.1.0/sdk/changeanalysis/Azure.ResourceManager.ChangeAnalysis/) |
-| Resource Management - Chaos | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.0.0/sdk/chaos/Azure.ResourceManager.Chaos/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.0-beta.1/sdk/chaos/Azure.ResourceManager.Chaos/) |
+| Resource Management - Chaos | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.0.0)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.0.0/sdk/chaos/Azure.ResourceManager.Chaos/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.0-beta.2/sdk/chaos/Azure.ResourceManager.Chaos/) |
| Resource Management - Cognitive Services | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CognitiveServices-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.4.0/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/) |
-| Resource Management - Communication | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.2.0/sdk/communication/Azure.ResourceManager.Communication/) |
+| Resource Management - Communication | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.2.1/sdk/communication/Azure.ResourceManager.Communication/) |
| Resource Management - Compute | NuGet [1.8.0](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.8.0)
NuGet [1.9.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.9.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute-readme) | GitHub [1.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.8.0/sdk/compute/Azure.ResourceManager.Compute/)
GitHub [1.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.9.0-beta.1/sdk/compute/Azure.ResourceManager.Compute/) |
| Resource Management - Computefleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.0.0/sdk/computefleet/Azure.ResourceManager.ComputeFleet/) |
| Resource Management - Computeschedule | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeSchedule-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.0.0/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/) |
-| Resource Management - Confidential Ledger | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.0.1)
NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.0.1/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/)
GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0-beta.4/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |
-| Resource Management - Confluent | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.0/sdk/confluent/Azure.ResourceManager.Confluent/) |
-| Resource Management - Connected VMware vSphere | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.0/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |
-| Resource Management - Consumption | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.0.1)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.0.1/sdk/consumption/Azure.ResourceManager.Consumption/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0-beta.2/sdk/consumption/Azure.ResourceManager.Consumption/) |
+| Resource Management - Confidential Ledger | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.0.1)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.0.1/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0-beta.5/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |
+| Resource Management - Confluent | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.1/sdk/confluent/Azure.ResourceManager.Confluent/) |
+| Resource Management - Connected VMware vSphere | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.1/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |
+| Resource Management - Consumption | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.0.1)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.0.1/sdk/consumption/Azure.ResourceManager.Consumption/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0-beta.3/sdk/consumption/Azure.ResourceManager.Consumption/) |
| Resource Management - Container Apps | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.AppContainers/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppContainers-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppContainers_1.3.0/sdk/containerapps/Azure.ResourceManager.AppContainers/) |
| Resource Management - Container Instances | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.2.1)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.2.1/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0-beta.1/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) |
| Resource Management - Container Registry | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.2.1)
NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.2.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)
GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.3.0-beta.2/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) |
| Resource Management - Container Service | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.2.3/sdk/containerservice/Azure.ResourceManager.ContainerService/) |
| Resource Management - Container Service Fleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.0.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0-beta.1/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) |
| Resource Management - Containerorchestratorruntime | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.1/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) |
-| Resource Management - Content Delivery Network | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.3.0/sdk/cdn/Azure.ResourceManager.Cdn/) |
+| Resource Management - Content Delivery Network | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.3.1/sdk/cdn/Azure.ResourceManager.Cdn/) |
| Resource Management - Cosmos DB | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.3.2)
NuGet [1.4.0-beta.12](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0-beta.12) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.3.2/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/)
GitHub [1.4.0-beta.12](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0-beta.12/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) |
| Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.1/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) |
| Resource Management - Costmanagement | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.CostManagement/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CostManagement-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CostManagement_1.0.1/sdk/costmanagement/Azure.ResourceManager.CostManagement/) |
@@ -220,10 +220,10 @@
| Resource Management - Datadog | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Datadog/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Datadog-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Datadog_1.0.0-beta.4/sdk/datadog/Azure.ResourceManager.Datadog/) |
| Resource Management - Defender EASM | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DefenderEasm/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DefenderEasm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DefenderEasm_1.0.0-beta.2/sdk/defendereasm/Azure.ResourceManager.DefenderEasm/) |
| Resource Management - Deployment Manager | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeploymentManager/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeploymentManager-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeploymentManager_1.0.0-beta.3/sdk/deploymentmanager/Azure.ResourceManager.DeploymentManager/) |
-| Resource Management - Desktop Virtualization | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.0/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |
+| Resource Management - Desktop Virtualization | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.1/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |
| Resource Management - Dev Center | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevCenter-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.0.1/sdk/devcenter/Azure.ResourceManager.DevCenter/) |
| Resource Management - Dev Spaces | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.DevSpaces/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.DevSpaces-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevSpaces_1.0.0-beta.4/sdk/devspaces/Azure.ResourceManager.DevSpaces/) |
-| Resource Management - Device Provisioning Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.0/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |
+| Resource Management - Device Provisioning Services | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |
| Resource Management - Device Registry | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceRegistry-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.0.0/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/) |
| Resource Management - Device Update | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceUpdate/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceUpdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceUpdate_1.0.0/sdk/deviceupdate/Azure.ResourceManager.DeviceUpdate/) |
| Resource Management - DevOps Infrastructure | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DevOpsInfrastructure/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevOpsInfrastructure-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevOpsInfrastructure_1.0.0-beta.1/sdk/devopsinfrastructure/Azure.ResourceManager.DevOpsInfrastructure/) |
@@ -237,12 +237,12 @@
| Resource Management - Elastic | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Elastic/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Elastic-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Elastic_1.0.0/sdk/elastic/Azure.ResourceManager.Elastic/) |
| Resource Management - ElasticSan | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ElasticSan-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.1.0/sdk/elasticsan/Azure.ResourceManager.ElasticSan/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.2.0-beta.1/sdk/elasticsan/Azure.ResourceManager.ElasticSan/) |
| Resource Management - Energy Services | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EnergyServices/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EnergyServices-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EnergyServices_1.0.0-beta.2/sdk/openenergyplatform/Azure.ResourceManager.EnergyServices/) |
-| Resource Management - Event Grid | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.0.1)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.0.1/sdk/eventgrid/Azure.ResourceManager.EventGrid/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0-beta.5/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |
+| Resource Management - Event Grid | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.0.1)
NuGet [1.1.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.0.1/sdk/eventgrid/Azure.ResourceManager.EventGrid/)
GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0-beta.6/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |
| Resource Management - Event Hubs | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EventHubs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.1.0/sdk/eventhub/Azure.ResourceManager.EventHubs/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.2.0-beta.1/sdk/eventhub/Azure.ResourceManager.EventHubs/) |
| Resource Management - Extended Location | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ExtendedLocations/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ExtendedLocations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ExtendedLocations_1.1.0/sdk/extendedlocation/Azure.ResourceManager.ExtendedLocations/) |
| Resource Management - Fabric | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Fabric/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Fabric-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Fabric_1.0.0-beta.2/sdk/fabric/Azure.ResourceManager.Fabric/) |
| Resource Management - Fluid Relay | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.FluidRelay/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FluidRelay-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FluidRelay_1.1.0/sdk/fluidrelay/Azure.ResourceManager.FluidRelay/) |
-| Resource Management - Front Door | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.3.0/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |
+| Resource Management - Front Door | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.3.1/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |
| Resource Management - Graph Services | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.GraphServices/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.GraphServices-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GraphServices_1.1.1/sdk/graphservices/Azure.ResourceManager.GraphServices/) |
| Resource Management - Guest Configuration | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.GuestConfiguration/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.GuestConfiguration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GuestConfiguration_1.2.0/sdk/guestconfiguration/Azure.ResourceManager.GuestConfiguration/) |
| Resource Management - Hardware Security Modules | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.HardwareSecurityModules/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.HardwareSecurityModules-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HardwareSecurityModules_1.0.0-beta.4/sdk/hardwaresecuritymodules/Azure.ResourceManager.HardwareSecurityModules/) |
@@ -265,7 +265,7 @@
| Resource Management - Kubernetes Configuration | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration_1.2.0/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration/) |
| Resource Management - Kusto | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Kusto/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Kusto-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kusto_1.6.0/sdk/kusto/Azure.ResourceManager.Kusto/) |
| Resource Management - Lab Services | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.LabServices/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.LabServices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LabServices_1.1.0/sdk/labservices/Azure.ResourceManager.LabServices/) |
-| Resource Management - Large Instance | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.1/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |
+| Resource Management - Large Instance | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.2/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |
| Resource Management - Load Testing | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.LoadTesting/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.LoadTesting-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LoadTesting_1.1.0/sdk/loadtestservice/Azure.ResourceManager.LoadTesting/) |
| Resource Management - Log Analytics | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.2.2)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.OperationalInsights-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.2.2/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.3.0-beta.1/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/) |
| Resource Management - Logic Apps | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Logic-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.1.0/sdk/logic/Azure.ResourceManager.Logic/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.2.0-beta.1/sdk/logic/Azure.ResourceManager.Logic/) |
@@ -320,12 +320,12 @@
| Resource Management - Relay | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Relay/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Relay-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relay_1.2.0/sdk/relay/Azure.ResourceManager.Relay/) |
| Resource Management - Reservations | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Reservations/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Reservations-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Reservations_1.4.0/sdk/reservations/Azure.ResourceManager.Reservations/) |
| Resource Management - Resource Connector | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ResourceConnector/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceConnector-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceConnector_1.0.0-beta.2/sdk/resourceconnector/Azure.ResourceManager.ResourceConnector/) |
-| Resource Management - Resource Graph | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.0.1)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.0.1/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0-beta.2/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |
+| Resource Management - Resource Graph | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.0.1)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.0.1/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0-beta.3/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |
| Resource Management - Resource Health | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.0.0)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceHealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.0.0/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.1.0-beta.3/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/) |
| Resource Management - Resource Manager | NuGet [1.13.0](https://www.nuget.org/packages/Azure.ResourceManager/1.13.0) | [docs](/dotnet/api/overview/azure/ResourceManager-readme) | GitHub [1.13.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager_1.13.0/sdk/resourcemanager/Azure.ResourceManager/) |
| Resource Management - Resource Mover | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.1)
NuGet [1.1.2-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.2-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceMover-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/)
GitHub [1.1.2-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.2-beta.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/) |
| Resource Management - Resources | NuGet [1.9.0](https://www.nuget.org/packages/Azure.ResourceManager.Resources/1.9.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources_1.9.0/sdk/resources/Azure.ResourceManager.Resources/) |
-| Resource Management - ScVmm | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-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.ScVmm_1.0.0-beta.5/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |
+| Resource Management - ScVmm | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ScVmm_1.0.0-beta.6/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |
| Resource Management - Security | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.1.0)
NuGet [1.2.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.2.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityCenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.1.0/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/)
GitHub [1.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.2.0-beta.5/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/) |
| Resource Management - Security DevOps | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.SecurityDevOps/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityDevOps-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityDevOps_1.0.0-beta.4/sdk/securitydevops/Azure.ResourceManager.SecurityDevOps/) |
| Resource Management - Security Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.1.0/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.2.0-beta.1/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/) |
diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md
index b38cf4b8ab93f..0b8c7cefa79d1 100644
--- a/docs/azure/includes/dotnet-new.md
+++ b/docs/azure/includes/dotnet-new.md
@@ -112,7 +112,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-beta.2](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0-beta.2/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |
-| System.ClientModel | NuGet [1.3.0](https://www.nuget.org/packages/System.ClientModel/1.3.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.3.0/sdk/core/System.ClientModel/) |
+| System.ClientModel | NuGet [1.3.0](https://www.nuget.org/packages/System.ClientModel/1.3.0)
NuGet [1.4.0-beta.1](https://www.nuget.org/packages/System.ClientModel/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.3.0/sdk/core/System.ClientModel/)
GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.4.0-beta.1/sdk/core/System.ClientModel/) |
| Tables | NuGet [12.10.0](https://www.nuget.org/packages/Azure.Data.Tables/12.10.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.10.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.10.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 Translation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Text/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Translation.Text-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_1.0.0/sdk/translation/Azure.AI.Translation.Text/) |
@@ -172,44 +172,44 @@
| Resource Management - Alerts Management | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.AlertsManagement/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AlertsManagement-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AlertsManagement_1.1.0/sdk/alertsmanagement/Azure.ResourceManager.AlertsManagement/) |
| Resource Management - Analysis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Analysis/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Analysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Analysis_1.1.0/sdk/analysisservices/Azure.ResourceManager.Analysis/) |
| Resource Management - API Center | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiCenter-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.0.0-beta.2/sdk/apicenter/Azure.ResourceManager.ApiCenter/) |
-| Resource Management - API Management | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.2.0)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.2.0/sdk/apimanagement/Azure.ResourceManager.ApiManagement/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.0-beta.1/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |
-| Resource Management - App Compliance Automation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.0/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |
+| Resource Management - API Management | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.2.0)
NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.2.0/sdk/apimanagement/Azure.ResourceManager.ApiManagement/)
GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.0-beta.2/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |
+| Resource Management - App Compliance Automation | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.1/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |
| Resource Management - App Configuration | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.4.0/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) |
-| Resource Management - App Platform | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.AppPlatform/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppPlatform-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppPlatform_1.1.1/sdk/appplatform/Azure.ResourceManager.AppPlatform/) |
+| Resource Management - App Platform | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.AppPlatform/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AppPlatform-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppPlatform_1.1.2/sdk/appplatform/Azure.ResourceManager.AppPlatform/) |
| Resource Management - App Service | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.AppService/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppService-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppService_1.3.0/sdk/websites/Azure.ResourceManager.AppService/) |
-| Resource Management - Application Insights | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.0/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |
+| Resource Management - Application Insights | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |
| Resource Management - Arc ScVmm | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ArcScVmm/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ArcScVmm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArcScVmm_1.0.0-beta.4/sdk/arc-scvmm/Azure.ResourceManager.ArcScVmm/) |
-| Resource Management - Astro | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.1/sdk/astronomer/Azure.ResourceManager.Astro/) |
+| Resource Management - Astro | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.2/sdk/astronomer/Azure.ResourceManager.Astro/) |
| Resource Management - Attestation | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Attestation/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Attestation-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Attestation_1.0.0-beta.4/sdk/attestation/Azure.ResourceManager.Attestation/) |
| Resource Management - Authorization | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Authorization/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Authorization-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Authorization_1.1.3/sdk/authorization/Azure.ResourceManager.Authorization/) |
| Resource Management - Automanage | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Automanage/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Automanage-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automanage_1.1.0/sdk/automanage/Azure.ResourceManager.Automanage/) |
| Resource Management - Automation | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Automation/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Automation-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automation_1.1.0/sdk/automation/Azure.ResourceManager.Automation/) |
| Resource Management - Azure AI Search | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.2.3)
NuGet [1.3.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.3.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Search-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.2.3/sdk/search/Azure.ResourceManager.Search/)
GitHub [1.3.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.3.0-beta.4/sdk/search/Azure.ResourceManager.Search/) |
-| Resource Management - Azure Stack HCI | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.0/sdk/azurestackhci/Azure.ResourceManager.Hci/) |
+| Resource Management - Azure Stack HCI | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.1/sdk/azurestackhci/Azure.ResourceManager.Hci/) |
| Resource Management - Azure VMware Solution | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Avs/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Avs-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Avs_1.4.0/sdk/avs/Azure.ResourceManager.Avs/) |
| Resource Management - Batch | NuGet [1.5.0](https://www.nuget.org/packages/Azure.ResourceManager.Batch/1.5.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Batch-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Batch_1.5.0/sdk/batch/Azure.ResourceManager.Batch/) |
-| Resource Management - Billing | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.0/sdk/billing/Azure.ResourceManager.Billing/) |
+| Resource Management - Billing | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.1/sdk/billing/Azure.ResourceManager.Billing/) |
| Resource Management - Billing Benefits | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.BillingBenefits/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.BillingBenefits-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BillingBenefits_1.0.0-beta.3/sdk/billingbenefits/Azure.ResourceManager.BillingBenefits/) |
| Resource Management - Blueprint | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Blueprint/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Blueprint-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Blueprint_1.0.0-beta.4/sdk/blueprint/Azure.ResourceManager.Blueprint/) |
| Resource Management - Bot Service | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.BotService-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.1.0/sdk/botservice/Azure.ResourceManager.BotService/) |
| Resource Management - Change Analysis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ChangeAnalysis/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ChangeAnalysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ChangeAnalysis_1.1.0/sdk/changeanalysis/Azure.ResourceManager.ChangeAnalysis/) |
-| Resource Management - Chaos | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.0.0/sdk/chaos/Azure.ResourceManager.Chaos/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.0-beta.1/sdk/chaos/Azure.ResourceManager.Chaos/) |
+| Resource Management - Chaos | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.0.0)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.0.0/sdk/chaos/Azure.ResourceManager.Chaos/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.0-beta.2/sdk/chaos/Azure.ResourceManager.Chaos/) |
| Resource Management - Cognitive Services | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CognitiveServices-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.4.0/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/) |
-| Resource Management - Communication | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.2.0/sdk/communication/Azure.ResourceManager.Communication/) |
+| Resource Management - Communication | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.2.1/sdk/communication/Azure.ResourceManager.Communication/) |
| Resource Management - Compute | NuGet [1.8.0](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.8.0)
NuGet [1.9.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.9.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute-readme) | GitHub [1.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.8.0/sdk/compute/Azure.ResourceManager.Compute/)
GitHub [1.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.9.0-beta.1/sdk/compute/Azure.ResourceManager.Compute/) |
| Resource Management - Computefleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.0.0/sdk/computefleet/Azure.ResourceManager.ComputeFleet/) |
| Resource Management - Computeschedule | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeSchedule-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.0.0/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/) |
-| Resource Management - Confidential Ledger | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.0.1)
NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.0.1/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/)
GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0-beta.4/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |
-| Resource Management - Confluent | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.0/sdk/confluent/Azure.ResourceManager.Confluent/) |
-| Resource Management - Connected VMware vSphere | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.0/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |
-| Resource Management - Consumption | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.0.1)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.0.1/sdk/consumption/Azure.ResourceManager.Consumption/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0-beta.2/sdk/consumption/Azure.ResourceManager.Consumption/) |
+| Resource Management - Confidential Ledger | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.0.1)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.0.1/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0-beta.5/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |
+| Resource Management - Confluent | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.1/sdk/confluent/Azure.ResourceManager.Confluent/) |
+| Resource Management - Connected VMware vSphere | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.1/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |
+| Resource Management - Consumption | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.0.1)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.0.1/sdk/consumption/Azure.ResourceManager.Consumption/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0-beta.3/sdk/consumption/Azure.ResourceManager.Consumption/) |
| Resource Management - Container Apps | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.AppContainers/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppContainers-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppContainers_1.3.0/sdk/containerapps/Azure.ResourceManager.AppContainers/) |
| Resource Management - Container Instances | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.2.1)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.2.1/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0-beta.1/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) |
| Resource Management - Container Registry | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.2.1)
NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.2.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)
GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.3.0-beta.2/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) |
| Resource Management - Container Service | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.2.3/sdk/containerservice/Azure.ResourceManager.ContainerService/) |
| Resource Management - Container Service Fleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.0.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0-beta.1/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) |
| Resource Management - Containerorchestratorruntime | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.1/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) |
-| Resource Management - Content Delivery Network | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.3.0/sdk/cdn/Azure.ResourceManager.Cdn/) |
+| Resource Management - Content Delivery Network | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.3.1/sdk/cdn/Azure.ResourceManager.Cdn/) |
| Resource Management - Cosmos DB | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.3.2)
NuGet [1.4.0-beta.12](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0-beta.12) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.3.2/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/)
GitHub [1.4.0-beta.12](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0-beta.12/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) |
| Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.1/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) |
| Resource Management - Costmanagement | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.CostManagement/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CostManagement-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CostManagement_1.0.1/sdk/costmanagement/Azure.ResourceManager.CostManagement/) |
@@ -226,10 +226,10 @@
| Resource Management - Datadog | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Datadog/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Datadog-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Datadog_1.0.0-beta.4/sdk/datadog/Azure.ResourceManager.Datadog/) |
| Resource Management - Defender EASM | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DefenderEasm/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DefenderEasm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DefenderEasm_1.0.0-beta.2/sdk/defendereasm/Azure.ResourceManager.DefenderEasm/) |
| Resource Management - Deployment Manager | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeploymentManager/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeploymentManager-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeploymentManager_1.0.0-beta.3/sdk/deploymentmanager/Azure.ResourceManager.DeploymentManager/) |
-| Resource Management - Desktop Virtualization | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.0/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |
+| Resource Management - Desktop Virtualization | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.1/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |
| Resource Management - Dev Center | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevCenter-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.0.1/sdk/devcenter/Azure.ResourceManager.DevCenter/) |
| Resource Management - Dev Spaces | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.DevSpaces/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.DevSpaces-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevSpaces_1.0.0-beta.4/sdk/devspaces/Azure.ResourceManager.DevSpaces/) |
-| Resource Management - Device Provisioning Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.0/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |
+| Resource Management - Device Provisioning Services | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |
| Resource Management - Device Registry | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceRegistry-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.0.0/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/) |
| Resource Management - Device Update | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceUpdate/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceUpdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceUpdate_1.0.0/sdk/deviceupdate/Azure.ResourceManager.DeviceUpdate/) |
| Resource Management - DevOps Infrastructure | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DevOpsInfrastructure/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevOpsInfrastructure-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevOpsInfrastructure_1.0.0-beta.1/sdk/devopsinfrastructure/Azure.ResourceManager.DevOpsInfrastructure/) |
@@ -243,12 +243,12 @@
| Resource Management - Elastic | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Elastic/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Elastic-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Elastic_1.0.0/sdk/elastic/Azure.ResourceManager.Elastic/) |
| Resource Management - ElasticSan | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ElasticSan-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.1.0/sdk/elasticsan/Azure.ResourceManager.ElasticSan/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.2.0-beta.1/sdk/elasticsan/Azure.ResourceManager.ElasticSan/) |
| Resource Management - Energy Services | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EnergyServices/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EnergyServices-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EnergyServices_1.0.0-beta.2/sdk/openenergyplatform/Azure.ResourceManager.EnergyServices/) |
-| Resource Management - Event Grid | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.0.1)
NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.0.1/sdk/eventgrid/Azure.ResourceManager.EventGrid/)
GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0-beta.5/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |
+| Resource Management - Event Grid | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.0.1)
NuGet [1.1.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.0.1/sdk/eventgrid/Azure.ResourceManager.EventGrid/)
GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0-beta.6/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |
| Resource Management - Event Hubs | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EventHubs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.1.0/sdk/eventhub/Azure.ResourceManager.EventHubs/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.2.0-beta.1/sdk/eventhub/Azure.ResourceManager.EventHubs/) |
| Resource Management - Extended Location | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ExtendedLocations/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ExtendedLocations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ExtendedLocations_1.1.0/sdk/extendedlocation/Azure.ResourceManager.ExtendedLocations/) |
| Resource Management - Fabric | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Fabric/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Fabric-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Fabric_1.0.0-beta.2/sdk/fabric/Azure.ResourceManager.Fabric/) |
| Resource Management - Fluid Relay | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.FluidRelay/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FluidRelay-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FluidRelay_1.1.0/sdk/fluidrelay/Azure.ResourceManager.FluidRelay/) |
-| Resource Management - Front Door | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.3.0/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |
+| Resource Management - Front Door | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.3.1/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |
| Resource Management - Graph Services | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.GraphServices/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.GraphServices-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GraphServices_1.1.1/sdk/graphservices/Azure.ResourceManager.GraphServices/) |
| Resource Management - Guest Configuration | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.GuestConfiguration/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.GuestConfiguration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GuestConfiguration_1.2.0/sdk/guestconfiguration/Azure.ResourceManager.GuestConfiguration/) |
| Resource Management - Hardware Security Modules | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.HardwareSecurityModules/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.HardwareSecurityModules-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HardwareSecurityModules_1.0.0-beta.4/sdk/hardwaresecuritymodules/Azure.ResourceManager.HardwareSecurityModules/) |
@@ -272,7 +272,7 @@
| Resource Management - Kubernetes Configuration | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration_1.2.0/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration/) |
| Resource Management - Kusto | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Kusto/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Kusto-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kusto_1.6.0/sdk/kusto/Azure.ResourceManager.Kusto/) |
| Resource Management - Lab Services | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.LabServices/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.LabServices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LabServices_1.1.0/sdk/labservices/Azure.ResourceManager.LabServices/) |
-| Resource Management - Large Instance | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.1/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |
+| Resource Management - Large Instance | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.2/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |
| Resource Management - Load Testing | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.LoadTesting/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.LoadTesting-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LoadTesting_1.1.0/sdk/loadtestservice/Azure.ResourceManager.LoadTesting/) |
| Resource Management - Log Analytics | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.2.2)
NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.OperationalInsights-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.2.2/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/)
GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.3.0-beta.1/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/) |
| Resource Management - Logic Apps | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Logic-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.1.0/sdk/logic/Azure.ResourceManager.Logic/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.2.0-beta.1/sdk/logic/Azure.ResourceManager.Logic/) |
@@ -328,12 +328,12 @@
| Resource Management - Relay | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Relay/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Relay-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relay_1.2.0/sdk/relay/Azure.ResourceManager.Relay/) |
| Resource Management - Reservations | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Reservations/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Reservations-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Reservations_1.4.0/sdk/reservations/Azure.ResourceManager.Reservations/) |
| Resource Management - Resource Connector | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ResourceConnector/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceConnector-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceConnector_1.0.0-beta.2/sdk/resourceconnector/Azure.ResourceManager.ResourceConnector/) |
-| Resource Management - Resource Graph | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.0.1)
NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.0.1/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/)
GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0-beta.2/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |
+| Resource Management - Resource Graph | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.0.1)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.0.1/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0-beta.3/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |
| Resource Management - Resource Health | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.0.0)
NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceHealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.0.0/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/)
GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.1.0-beta.3/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/) |
| Resource Management - Resource Manager | NuGet [1.13.0](https://www.nuget.org/packages/Azure.ResourceManager/1.13.0) | [docs](/dotnet/api/overview/azure/ResourceManager-readme) | GitHub [1.13.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager_1.13.0/sdk/resourcemanager/Azure.ResourceManager/) |
| Resource Management - Resource Mover | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.1)
NuGet [1.1.2-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.2-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceMover-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/)
GitHub [1.1.2-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.2-beta.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/) |
| Resource Management - Resources | NuGet [1.9.0](https://www.nuget.org/packages/Azure.ResourceManager.Resources/1.9.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources_1.9.0/sdk/resources/Azure.ResourceManager.Resources/) |
-| Resource Management - ScVmm | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-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.ScVmm_1.0.0-beta.5/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |
+| Resource Management - ScVmm | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ScVmm_1.0.0-beta.6/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |
| Resource Management - Security | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.1.0)
NuGet [1.2.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.2.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityCenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.1.0/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/)
GitHub [1.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.2.0-beta.5/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/) |
| Resource Management - Security DevOps | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.SecurityDevOps/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityDevOps-readme?view=azure-dotnet-preview&preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityDevOps_1.0.0-beta.4/sdk/securitydevops/Azure.ResourceManager.SecurityDevOps/) |
| Resource Management - Security Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.1.0)
NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.1.0/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/)
GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.2.0-beta.1/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/) |
diff --git a/docs/azure/media/app-registration.png b/docs/azure/media/app-registration.png
new file mode 100644
index 0000000000000..01fdbe4b53adf
Binary files /dev/null and b/docs/azure/media/app-registration.png differ
diff --git a/docs/azure/media/app-role-assignment.png b/docs/azure/media/app-role-assignment.png
new file mode 100644
index 0000000000000..5983e5229003f
Binary files /dev/null and b/docs/azure/media/app-role-assignment.png differ
diff --git a/docs/azure/media/create-group.png b/docs/azure/media/create-group.png
new file mode 100644
index 0000000000000..9dad3914e1be8
Binary files /dev/null and b/docs/azure/media/create-group.png differ
diff --git a/docs/azure/sdk/authentication/local-development-service-principal.md b/docs/azure/sdk/authentication/local-development-service-principal.md
index 4bf890b974e85..1654c86a90410 100644
--- a/docs/azure/sdk/authentication/local-development-service-principal.md
+++ b/docs/azure/sdk/authentication/local-development-service-principal.md
@@ -3,176 +3,197 @@ title: Authenticate .NET apps to Azure services during local development using s
description: Learn how to authenticate your app to Azure services during local development using dedicated application service principals.
ms.topic: how-to
ms.custom: devx-track-dotnet, engagement-fy23, devx-track-azurecli
-ms.date: 08/02/2024
+ms.date: 03/04/2025
---
# Authenticate .NET apps to Azure services during local development using service principals
-Developers need to debug and test cloud apps on their local workstation. When an app runs on a developer's workstation during local development, it must still authenticate to any Azure services used by the app. This article covers how to set up dedicated application service principal objects to be used during local development.
+During local development, applications need to authenticate to Azure to access various Azure services. Two common approaches for local authentication are to [use a developer account](local-development-dev-accounts.md) or a service principal. This article explains how to use an application service principal. In the sections ahead, you learn:
-:::image type="content" source="../media/local-dev-service-principal-overview.png" alt-text="A diagram showing how a local .NET app uses the developer's credentials to connect to Azure by using locally installed development tools.":::
+- How to register an application with Microsoft Entra to create a service principal
+- How to use Microsoft Entra groups to efficiently manage permissions
+- How to assign roles to scope permissions
+- How to authenticate using a service principal from your app code
+
+Using dedicated application service principals allows you to adhere to the principle of least privilege when accessing Azure resources. Permissions are limited to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.
-Dedicated application service principals for local development allow you to follow the principle of least privilege during app development. Since permissions are scoped to exactly what's needed for the app during development, app code is prevented from accidentally accessing an Azure resource intended for use by a different app. This also prevents bugs from occurring when the app is moved to production because the app was over-privileged in the dev environment.
+:::image type="content" source="../media/local-dev-service-principal-overview.png" alt-text="A diagram showing how a local .NET app uses the developer's credentials to connect to Azure by using locally installed development tools.":::
-An application service principal is set up for the app when the app is registered in Azure. When registering an app for local development, it's recommended to:
+When the app is registered in Azure, an application service principal is created. For local development:
-- Create a separate app registration for each developer working on the app. This will create separate application service principals for each developer to use during local development and avoid the need for developers to share credentials for a single application service principal.
-- Create a separate app registration per app. This scopes the app's permissions to only what is needed by the app.
+- Create a separate app registration for each developer working on the app to ensure each developer has their own application service principal, avoiding the need to share credentials.
+- Create a separate app registration for each app to limit the app's permissions to only what is necessary.
-During local development, environment variables are set with the application service principal's identity. The Azure Identity library reads these environment variables and uses this information to authenticate the app to the Azure resources it needs.
+During local development, environment variables are set with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.
-## 1 - Register the application in Azure
+## Register the app in Azure
-Application service principal objects are created with an app registration in Azure. This can be done using either the Azure portal or Azure CLI.
+Application service principal objects are created through an app registration in Azure using either the Azure portal or Azure CLI.
### [Azure portal](#tab/azure-portal)
-Sign in to the [Azure portal](https://portal.azure.com/) and follow these steps.
+1. In the Azure portal, use the search bar to navigate to the **App registrations** page.
+1. On the **App registrations** page, select **+ New registration**.
+1. On the **Register an application** page:
+ - For the **Name** field, enter a descriptive value that includes the app name and the target environment.
+ - For the **Supported account types**, select **Accounts in this organizational directory only (Microsoft Customer Led only - Single tenant)**, or whichever option best fits your requirements.
+1. Select **Register** to register your app and create the service principal.
+
+ :::image type="content" source="../../media/app-registration.png" alt-text="A screenshot showing how to create an app registration in the Azure portal.":::
-| Instructions | Screenshot |
-|:----------------|-----------:|
-| [!INCLUDE [Create app registration step 1](<../includes/local-dev-app-registration-azure-portal-1.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-1-240px.png" alt-text="A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page." lightbox="../media/local-dev-app-registration-azure-portal-1.png"::: |
-| [!INCLUDE [Create app registration step 2](<../includes/local-dev-app-registration-azure-portal-2.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-2-240px.png" alt-text="A screenshot showing the location of the New registration button in the App registrations page." lightbox="../media/local-dev-app-registration-azure-portal-2.png"::: |
-| [!INCLUDE [Create app registration step 3](<../includes/local-dev-app-registration-azure-portal-3.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-3-240px.png" alt-text="A screenshot showing how to fill out the Register an application page by giving the app a name and specifying supported account types as accounts in this organizational directory only." lightbox="../media/local-dev-app-registration-azure-portal-3.png"::: |
-| [!INCLUDE [Create app registration step 4](<../includes/local-dev-app-registration-azure-portal-4.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-4-240px.png" alt-text="A screenshot of the App registration page after the app registration has been completed. This screenshot shows the location of the application ID and tenant ID, which will be needed in a future step. It also shows the location of the link to use to add an application secret for the app." lightbox="../media/local-dev-app-registration-azure-portal-4.png"::: |
-| [!INCLUDE [Create app registration step 5](<../includes/local-dev-app-registration-azure-portal-5.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-5-240px.png" alt-text="A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page." lightbox="../media/local-dev-app-registration-azure-portal-5.png"::: |
-| [!INCLUDE [Create app registration step 6](<../includes/local-dev-app-registration-azure-portal-6.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-6-240px.png" alt-text="A screenshot showing the page where a new client secret is added for the application service principal create by the app registration process." lightbox="../media/local-dev-app-registration-azure-portal-6.png"::: |
-| [!INCLUDE [Create app registration step 7](<../includes/local-dev-app-registration-azure-portal-7.md>)] | :::image type="content" source="../media/local-dev-app-registration-azure-portal-7-240px.png" alt-text="A screenshot showing the page with the generated client secret." lightbox="../media/local-dev-app-registration-azure-portal-7.png"::: |
+1. On the **App registration** page for your app, copy the **Application (client) ID** and **Directory (tenant) ID** and paste them in a temporary location for later use in your app code configurations.
+1. Select **Add a certificate or secret** to set up credentials for your app.
+1. On the **Certificates & secrets** page, select **+ New client secret**.
+1. In the **Add a client secret** flyout panel that opens:
+ - For the **Description**, enter a value of Current.
+ - For the **Expires** value, leave the default recommended value of 180 days.
+ - Select **Add** to add the secret.
+1. On the **Certificates & secrets** page, copy the **Value** property of the client secret for use in a future step.
+
+ > [!NOTE]
+ > The client secret value is only displayed once after the app registration is created. You can add more client secrets without invalidating this client secret, but there's no way to display this value again.
### [Azure CLI](#tab/azure-cli)
Azure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).
-First, use the [az ad sp create-for-rbac](/cli/azure/ad/sp#az-ad-sp-create-for-rbac) command to create a new service principal for the app. This will also create the app registration for the app at the same time.
+1. Use the [az ad sp create-for-rbac](/cli/azure/ad/sp#az-ad-sp-create-for-rbac) command to create a new app registration and service principal for the app.
-```azurecli
-az ad sp create-for-rbac \
- --name {service-principal-name}
-```
+ ```azurecli
+ az ad sp create-for-rbac --name
+ ```
-The output of this command resembles the following JSON:
+ The output of this command resembles the following JSON:
-```json
-{
- "appId": "00000000-0000-0000-0000-000000000000",
- "displayName": "{service-principal-name}",
- "password": "abcdefghijklmnopqrstuvwxyz",
- "tenant": "11111111-1111-1111-1111-111111111111"
-}
-```
+ ```json
+ {
+ "appId": "00000000-0000-0000-0000-000000000000",
+ "displayName": "",
+ "password": "abcdefghijklmnopqrstuvwxyz",
+ "tenant": "11111111-1111-1111-1111-111111111111"
+ }
+ ```
+
+1. Copy this output into a temporary file in a text editor, as you'll need these values in a future step.
-Copy this output into a temporary file in a text editor, as you'll need these values in a future step. This is the only place you ever see the client secret (password) for the service principal. You can, however, add a new password later without invalidating the service principal or existing passwords, if needed.
+ > [!NOTE]
+ > The client secret value is only displayed once after the app registration is created. You can add more client secrets without invalidating this client secret, but there's no way to display this value again.
---
-## 2 - Create Microsoft Entra group for local development
+## Create a Microsoft Entra group for local development
-Since there are typically multiple developers who work on an app, it's recommended to create a Microsoft Entra group to encapsulate the roles (permissions) the app needs in local development rather than assigning the roles to individual service principal objects. This approach offers the following advantages:
+Create a Microsoft Entra group to encapsulate the roles (permissions) the app needs in local development rather than assigning the roles to individual service principal objects. This approach offers the following advantages:
-- Every developer is assured to have the same roles assigned since roles are assigned at the group level.
+- Every developer has the same roles assigned at the group level.
- If a new role is needed for the app, it only needs to be added to the group for the app.
-- If a new developer joins the team, a new application service principal is created for the developer and added to the group, assuring the developer has the right permissions to work on the app.
+- If a new developer joins the team, a new application service principal is created for the developer and added to the group, ensuring the developer has the right permissions to work on the app.
### [Azure portal](#tab/azure-portal)
-| Instructions | Screenshot |
-|:----------------|-----------:|
-| [!INCLUDE [Create app group step 1](<../includes/local-dev-app-ad-group-azure-portal-1.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-1-240px.png" alt-text="A screenshot showing how to use the top search bar in the Azure portal to search for and navigate to the Microsoft Entra ID page." lightbox="../media/local-dev-app-ad-group-azure-portal-1.png"::: |
-| [!INCLUDE [Create app group step 2](<../includes/local-dev-app-ad-group-azure-portal-2.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-2-240px.png" alt-text="A screenshot showing the location of the Groups menu item in the left-hand menu of the Microsoft Entra Default Directory page." lightbox="../media/local-dev-app-ad-group-azure-portal-2.png"::: |
-| [!INCLUDE [Create app group step 3](<../includes/local-dev-app-ad-group-azure-portal-3.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-3-240px.png" alt-text="A screenshot showing the location of the New Group button in the All groups page." lightbox="../media/local-dev-app-ad-group-azure-portal-3.png"::: |
-| [!INCLUDE [Create app group step 4](<../includes/local-dev-app-ad-group-azure-portal-4.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-4-240px.png" alt-text="A screenshot showing how to fill out the form to create a new Microsoft Entra group for the application. This screenshot also shows the location of the link to select to add members to this group." lightbox="../media/local-dev-app-ad-group-azure-portal-4.png"::: |
-| [!INCLUDE [Create app group step 5](<../includes/local-dev-app-ad-group-azure-portal-5.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-5-240px.png" alt-text="A screenshot of the Add members dialog box showing how to select application service principals to be included in the group." lightbox="../media/local-dev-app-ad-group-azure-portal-5.png"::: |
-| [!INCLUDE [Create app group step 6](<../includes/local-dev-app-ad-group-azure-portal-6.md>)] | :::image type="content" source="../media/local-dev-app-ad-group-azure-portal-6-240px.png" alt-text="A screenshot of the New Group page showing how to complete the process by selecting the Create button." lightbox="../media/local-dev-app-ad-group-azure-portal-6.png"::: |
+1. Navigate to the **Microsoft Entra ID** overview page in the Azure portal.
+1. Select **All groups** from the left-hand menu.
+1. On the **Groups** page, select **New group**.
+1. On the **New group** page, fill out the following form fields:
+ - **Group type**: Select **Security**.
+ - **Group name**: Enter a name for the group that includes a reference to the app or environment name.
+ - **Group description**: Enter a description that explains the purpose of the group.
+
+ :::image type="content" source="../../media/create-group.png" alt-text="A screenshot showing how to create a group in the Azure portal.":::
+
+1. Select the **No members selected** link under **Members** to add members to the group.
+1. In the flyout panel that opens, search for the service principal you created earlier and select it from the filtered results. Choose the **Select** button at the bottom of the panel to confirm your selection.
+1. Select **Create** at the bottom of the **New group** page to create the group and return to the **All groups** page. If you don't see the new group listed, wait a moment and refresh the page.
### [Azure CLI](#tab/azure-cli)
-The [az ad group create](/cli/azure/ad/group#az-ad-group-create) command is used to create groups in Microsoft Entra ID. The `--display-name` and `--mail-nickname` parameters are required. The name given to the group should be based on the name of the app. It's also useful to include a phrase like 'local-dev' in the group's name to indicate the group's purpose.
+1. Use the [az ad group create](/cli/azure/ad/group#az-ad-group-create) command to create groups in Microsoft Entra ID.
-```azurecli
-az ad group create \
- --display-name MyDisplay \
- --mail-nickname MyDisplay \
- --description {group-description}
-```
+ ```azurecli
+ az ad group create \
+ --display-name \
+ --mail-nickname \
+ --description
+ ```
-To add members to the group, you need the object ID of the application service principal, which is different than the application ID. Use the [az ad sp list](/cli/azure/ad/sp#az-ad-sp-list) command to list the available service principals. The `--filter` parameter command accepts OData-style filters and can be used to filter the list as shown. The `--query` parameter limits columns to only those of interest.
+ The `--display-name` and `--mail-nickname` parameters are required. The name given to the group should be based on the name and environment of the app to indicate the group's purpose.
-```azurecli
-az ad sp list \
- --filter "startswith(displayName, 'msdocs')" \
- --query "[].{objectId:objectId, displayName:displayName}" \
- --output table
-```
+1. To add members to the group, you need the object ID of the application service principal, which is different than the application ID. Use the [az ad sp list](/cli/azure/ad/sp#az-ad-sp-list) command to list the available service principals:
-The [az ad group member add](/cli/azure/ad/group/member#az-ad-group-member-add) command can then be used to add members to the group:
+ ```azurecli
+ az ad sp list \
+ --filter "startswith(displayName, '')" \
+ --query "[].{objectId:id, displayName:displayName}"
+ ```
-```azurecli
-az ad group member add \
- --group {group-name} \
- --member-id {object-id}
-```
+ The `--filter` parameter accepts OData-style filters and can be used to filter the list as shown. The `--query` parameter limits the output to only the columns of interest.
+
+1. Use the [az ad group member add](/cli/azure/ad/group/member#az-ad-group-member-add) command to add members to the group:
+
+ ```azurecli
+ az ad group member add \
+ --group \
+ --member-id
+ ```
---
-## 3 - Assign roles to the application
+## Assign roles to the group
-Next, determine what roles (permissions) your app needs on what resources and assign those roles to your app. In this example, the roles will be assigned to the Microsoft Entra group created in step 2. Groups can be assigned a role at a resource, resource group, or subscription scope. This example shows how to assign roles at the resource group scope, since most apps group all their Azure resources into a single resource group.
+Next, determine what roles (permissions) your app needs on what resources and assign those roles to the Microsoft Entra group you created. Groups can be assigned a role at the resource, resource group, or subscription scope. This example shows how to assign roles at the resource group scope, since most apps group all their Azure resources into a single resource group.
### [Azure portal](#tab/azure-portal)
-| Instructions | Screenshot |
-|:----------------|-----------:|
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-1.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-1-240px.png" alt-text="A screenshot showing how to use the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to." lightbox="../media/assign-local-dev-group-to-role-azure-portal-1.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-2.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-2-240px.png" alt-text="A screenshot of the resource group page showing the location of the Access control (IAM) menu item." lightbox="../media/assign-local-dev-group-to-role-azure-portal-2.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-3.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-3-240px.png" alt-text="A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group." lightbox="../media/assign-local-dev-group-to-role-azure-portal-3.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-4.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-4-240px.png" alt-text="A screenshot showing how to filter and select role assignments to be added to the resource group." lightbox="../media/assign-local-dev-group-to-role-azure-portal-4.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-5.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-5-240px.png" alt-text="A screenshot showing the radio button to select to assign a role to a Microsoft Entra group and the link used to select the group to assign the role to." lightbox="../media/assign-local-dev-group-to-role-azure-portal-5.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-6.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-6-240px.png" alt-text="A screenshot showing how to filter for and select the Microsoft Entra group for the app in the Select members dialog box." lightbox="../media/assign-local-dev-group-to-role-azure-portal-6.png"::: |
-| [!INCLUDE [Assign dev service principal to role step 1](<../includes/assign-local-dev-group-to-role-azure-portal-7.md>)] | :::image type="content" source="../media/assign-local-dev-group-to-role-azure-portal-7-240px.png" alt-text="A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process." lightbox="../media/assign-local-dev-group-to-role-azure-portal-7.png"::: |
+1. In the Azure portal, navigate to the **Overview** page of the resource group that contains your app.
+1. Select **Access control (IAM)** from the left navigation.
+1. On the **Access control (IAM)** page, select **+ Add** and then choose **Add role assignment** from the drop-down menu. The **Add role assignment** page provides several tabs to configure and assign roles.
+1. On the **Role** tab, use the search box to locate the role you want to assign. Select the role, and then choose **Next**.
+1. On the **Members** tab:
+ - For the **Assign access to** value, select **User, group, or service principal** .
+ - For the **Members** value, choose **+ Select members** to open the **Select members** flyout panel.
+ - Search for the Microsoft Entra group you created earlier and select it from the filtered results. Choose **Select** to select the group and close the flyout panel.
+ - Select **Review + assign** at the bottom of the **Members** tab.
-### [Azure CLI](#tab/azure-cli)
+ :::image type="content" source="../../media/app-role-assignment.png" alt-text="A screenshot showing how to assign a role to the Microsoft Entra group.":::
-An application service principal is assigned a role in Azure using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command:
+1. On the **Review + assign** tab, select **Review + assign** at the bottom of the page.
-```azurecli
-az role assignment create --assignee "{appId}" \
- --role "{roleName}" \
- --resource-group "{resourceGroupName}"
-```
+### [Azure CLI](#tab/azure-cli)
-To get the role names that a service principal can be assigned to, use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command:
+1. Use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command to get the names of the roles that a service principal can be assigned to:
-```azurecli
-az role definition list \
- --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
- --output table
-```
+ ```azurecli
+ az role definition list \
+ --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
+ --output table
+ ```
-For example, to allow the application service principal with the `appId` of `00000000-0000-0000-0000-000000000000` read, write, and delete access to Azure Storage blob containers and data to all storage accounts in the *msdocs-dotnet-sdk-auth-example* resource group, assign the application service principal to the *Storage Blob Data Contributor* role using the following command:
+1. Use the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command to assign a role to an application service principal:
-```azurecli
-az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
- --role "Storage Blob Data Contributor" \
- --resource-group "msdocs-dotnet-sdk-auth-example"
-```
+ ```azurecli
+ az role assignment create \
+ --assignee "" \
+ --role "" \
+ --resource-group ""
+ ```
-For information on assigning permissions at the resource or subscription level using the Azure CLI, see [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).
+ For information on assigning permissions at the resource or subscription level using the Azure CLI, see [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).
---
-## 4 - Set application environment variables
+## Set the app environment variables
-At runtime, `DefaultAzureCredential` looks for the service principal information in a collection of environment variables. There are multiple ways to configure environment variables when working with .NET, depending on your tooling and environment.
+At runtime, certain credentials from the [Azure Identity library](/dotnet/api/azure.identity?view=azure-dotnet&preserve-view=true), such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. There are multiple ways to configure environment variables when working with .NET, depending on your tooling and environment.
-Regardless of the approach you choose, configure the following environment variables when working with a service principal:
+Regardless of the approach you choose, configure the following environment variables for a service principal:
-- `AZURE_CLIENT_ID` → The app ID value.
-- `AZURE_TENANT_ID` → The tenant ID value.
-- `AZURE_CLIENT_SECRET` → The password/credential generated for the app.
+- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.
+- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.
+- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.
### [Visual Studio](#tab/visual-studio)
-When working locally with Visual Studio, environment variables can be set in the `launchsettings.json` file in the `Properties` folder of your project. When the app starts up, these values are pulled in automatically. Keep in mind, these configurations don't travel with your app when it's deployed, so you need to set up environment variables on your target hosting environment.
+In Visual Studio, environment variables can be set in the `launchsettings.json` file in the `Properties` folder of your project. These values are pulled in automatically when the app starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.
```json
"profiles": {
@@ -183,9 +204,9 @@ When working locally with Visual Studio, environment variables can be set in the
"applicationUrl": "https://localhost:7177;http://localhost:5177",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
- "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
- "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
- "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
+ "AZURE_CLIENT_ID": "",
+ "AZURE_TENANT_ID":"",
+ "AZURE_CLIENT_SECRET": ""
}
},
"IIS Express": {
@@ -193,9 +214,9 @@ When working locally with Visual Studio, environment variables can be set in the
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
- "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
- "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
- "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
+ "AZURE_CLIENT_ID": "",
+ "AZURE_TENANT_ID":"",
+ "AZURE_CLIENT_SECRET": ""
}
}
}
@@ -203,36 +224,36 @@ When working locally with Visual Studio, environment variables can be set in the
### [Visual Studio Code](#tab/vs-code)
-When working locally with Visual Studio Code, environment variables can be set in the `launch.json` file of your project. When the app starts up, these values will be pulled in automatically. Keep in mind, these configurations don't travel with your app when it's deployed, so you need to set up environment variables on your target hosting environment.
+In Visual Studio Code, environment variables can be set in the `launch.json` file of your project. These values are pulled in automatically when the app starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.
```json
"configurations": [
{
"env": {
"ASPNETCORE_ENVIRONMENT": "Development",
- "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
- "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
- "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
+ "AZURE_CLIENT_ID": "",
+ "AZURE_TENANT_ID":"",
+ "AZURE_CLIENT_SECRET": ""
}
}
```
### [Windows](#tab/windows)
-You can set environment variables for Windows from the command line. However, when using this approach, the values are accessible to all apps running on that operating system and may cause conflicts if you aren't careful. Environment variables can be set at the user or system level.
+You can set environment variables for Windows from the command line. However, the values are accessible to all apps running on that operating system and could cause conflicts, so use caution with this approach. Environment variables can be set at the user or system level.
```bash
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
-setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
-setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
-setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"
+setx AZURE_CLIENT_ID ""
+setx AZURE_TENANT_ID ""
+setx AZURE_CLIENT_SECRET ""
# Set system environment variables - requires running as admin
-setx ASPNETCORE_ENVIRONMENT "Development"
-setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
-setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
-setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
+setx ASPNETCORE_ENVIRONMENT "Development" /m
+setx AZURE_CLIENT_ID "" /m
+setx AZURE_TENANT_ID "" /m
+setx AZURE_CLIENT_SECRET "" /m
```
PowerShell can also be used to set environment variables at the user or machine level:
@@ -240,19 +261,17 @@ PowerShell can also be used to set environment variables at the user or machine
```powershell
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
-[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
-[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
-[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
+[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "", "User")
+[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "", "User")
+[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
-[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
-[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
-[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
+[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "", "Machine")
+[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "", "Machine")
+[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "", "Machine")
```
---
-## 5 - Implement DefaultAzureCredential in your application
-
-[!INCLUDE [Implement DefaultAzureCredential](<../includes/implement-defaultazurecredential.md>)]
+[!INCLUDE [Implement Service Principal](<../includes/implement-service-principal.md>)]
diff --git a/docs/azure/sdk/includes/implement-service-principal-concepts.md b/docs/azure/sdk/includes/implement-service-principal-concepts.md
new file mode 100644
index 0000000000000..2dc663426db01
--- /dev/null
+++ b/docs/azure/sdk/includes/implement-service-principal-concepts.md
@@ -0,0 +1,8 @@
+---
+ms.topic: include
+ms.date: 02/12/2025
+---
+
+## Authenticate to Azure services from your app
+
+The [Azure Identity library](/dotnet/api/azure.identity?view=azure-dotnet&preserve-view=true) provides various *credentials*—implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use when working with service principals locally and in production.
diff --git a/docs/azure/sdk/includes/implement-service-principal.md b/docs/azure/sdk/includes/implement-service-principal.md
new file mode 100644
index 0000000000000..083de7bd3418c
--- /dev/null
+++ b/docs/azure/sdk/includes/implement-service-principal.md
@@ -0,0 +1,40 @@
+---
+ms.topic: include
+ms.date: 02/12/2025
+---
+
+[!INCLUDE [implement-service-principal-concepts](implement-service-principal-concepts.md)]
+
+### Implement the code
+
+Add the [Azure.Identity](/dotnet/api/azure.identity) package. In an ASP.NET Core project, also install the [Microsoft.Extensions.Azure](/dotnet/api/microsoft.extensions.azure) package:
+
+### [Command Line](#tab/command-line)
+
+In a terminal of your choice, navigate to the application project directory and run the following commands:
+
+```dotnetcli
+dotnet add package Azure.Identity
+dotnet add package Microsoft.Extensions.Azure
+```
+
+### [NuGet Package Manager](#tab/nuget-package)
+
+Right-click your project in the Visual Studio **Solution Explorer** window and select **Manage NuGet Packages**. Search for **Azure.Identity**, and install the matching package. Repeat this process for the **Microsoft.Extensions.Azure** package.
+
+:::image type="content" source="../media/nuget-azure-identity.png" alt-text="Install a package using the package manager.":::
+
+---
+
+Azure services are accessed using specialized client classes from the various Azure SDK client libraries. These classes and your own custom services should be registered for dependency injection so they can be used throughout your app. In `Program.cs`, complete the following steps to configure a client class for dependency injection and token-based authentication:
+
+1. Include the `Azure.Identity` and `Microsoft.Extensions.Azure` namespaces via `using` directives.
+1. Register the Azure service client using the corresponding `Add`-prefixed extension method.
+1. Configure `ClientSecretCredential` with the `tenantId`, `clientId`, and `clientSecret`.
+1. Pass the `ClientSecretCredential` instance to the `UseCredential` method.
+
+:::code language="csharp" source="../snippets/authentication/local-dev-service-principal/Program.cs" id="snippet_ClientSecretCredential_UseCredential":::
+
+An alternative to the `UseCredential` method is to provide the credential to the service client directly:
+
+:::code language="csharp" source="../snippets/authentication/local-dev-service-principal/Program.cs" id="snippet_ClientSecretCredential":::
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-1.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-1.md
deleted file mode 100644
index dacdd475a1aad..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-1.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-In the Azure portal:
-
-1. Enter *app registrations* in the search bar at the top of the Azure portal.
-1. Select the item labeled **App registrations** under the **Services** heading on the menu that appears below the search bar.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-2.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-2.md
deleted file mode 100644
index b1e78a64b1530..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-2.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-On the **App registrations** page, select **+ New registration**.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-3.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-3.md
deleted file mode 100644
index 2487b4efb3bd4..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-3.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-On the **Register an application** page, fill out the form as follows.
-
-1. **Name** → Enter a name for the app registration in Azure. It's recommended this name include the app name, the user the app registration is for, and an identifier like 'dev' to indicate this app registration is for use in local development.
-1. **Supported account types** → **Accounts in this organizational directory only*.*
-
-Select **Register** to register your app and create the application service principal.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-4.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-4.md
deleted file mode 100644
index 5ac4f73d2e7f1..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-4.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-On the App registration page for your app:
-
-1. **Application (client) ID** → This is the app id the app will use to access Azure during local development. Copy this value to a temporary location in a text editor, as you'll need it in a future step.
-1. **Directory (tenant) id** → This value will also be needed by your app when it authenticates to Azure. Copy this value to a temporary location in a text editor, as it will also be needed it in a future step.
-1. **Client credentials** → You must set the client credentials for the app before your app can authenticate to Azure and use Azure services. Select **Add a certificate or secret** to add credentials for your app.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-5.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-5.md
deleted file mode 100644
index 90e99ef46dfdd..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-5.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-On the **Certificates & secrets** page, select **+ New client secret**.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-6.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-6.md
deleted file mode 100644
index 5ab21e61064e5..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-6.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-The **Add a client secret** dialog will pop out from the right-hand side of the page. In this dialog:
-
-1. **Description** → Enter a value of *Current*.
-1. **Expires** → Select a value of *24 months*.
-
-Select **Add** to add the secret.
diff --git a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-7.md b/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-7.md
deleted file mode 100644
index f74a4ca4e853e..0000000000000
--- a/docs/azure/sdk/includes/local-dev-app-registration-azure-portal-7.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-ms.topic: include
-ms.date: 08/05/2024
----
-On the **Certificates & secrets** page, you'll be shown the value of the client secret.
-
-Copy this value to a temporary location in a text editor, as you'll need it in a future step.
-
-***IMPORTANT: This is the only time you will see this value.*** Once you leave or refresh this page, you won't be able to see this value again. You may add an additional client secret without invalidating this client secret, but you won't see this value again.
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1-240px.png
deleted file mode 100644
index 2a611f35ee9bb..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1.png
deleted file mode 100644
index 8ac8554309dce..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-1.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2-240px.png
deleted file mode 100644
index 01bd5170ee7e3..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2.png
deleted file mode 100644
index 7683df0ed28db..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-2.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3-240px.png
deleted file mode 100644
index 0569c52efabb6..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3.png
deleted file mode 100644
index b586204c7f863..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-3.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4-240px.png
deleted file mode 100644
index 6bcbaab13ccd9..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4.png
deleted file mode 100644
index 5ccb21b030bce..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-4.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5-240px.png
deleted file mode 100644
index 63f63fc7af175..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5.png
deleted file mode 100644
index c9e5636ee6b32..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-5.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6-240px.png
deleted file mode 100644
index e2f2058391cc8..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6.png
deleted file mode 100644
index 437a4d1e7ea7a..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-6.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7-240px.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7-240px.png
deleted file mode 100644
index c845c13e446ea..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7-240px.png and /dev/null differ
diff --git a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7.png b/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7.png
deleted file mode 100644
index b7bab4769015e..0000000000000
Binary files a/docs/azure/sdk/media/local-dev-app-registration-azure-portal-7.png and /dev/null differ
diff --git a/docs/azure/sdk/snippets/authentication/Directory.Packages.props b/docs/azure/sdk/snippets/authentication/Directory.Packages.props
index fbfee9bb18874..4b82dd136e424 100644
--- a/docs/azure/sdk/snippets/authentication/Directory.Packages.props
+++ b/docs/azure/sdk/snippets/authentication/Directory.Packages.props
@@ -4,14 +4,16 @@
+
+
+
-
+
-
-
+
\ No newline at end of file
diff --git a/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Program.cs b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Program.cs
new file mode 100644
index 0000000000000..d8ee41b85db14
--- /dev/null
+++ b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Program.cs
@@ -0,0 +1,77 @@
+using Azure.Identity;
+using Microsoft.Extensions.Azure;
+using Azure.Storage.Blobs;
+using Azure.Core;
+
+var builder = WebApplication.CreateBuilder(args);
+
+registerUsingServicePrincipal(builder);
+
+var app = builder.Build();
+
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}
+
+app.UseHttpsRedirection();
+
+var summaries = new[]
+{
+ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+};
+
+app.MapGet("/weatherforecast", async (BlobServiceClient client) =>
+{
+ var containerClient = client.GetBlobContainerClient("docs");
+
+ var blobs = containerClient.GetBlobs();
+
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ (
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ Random.Shared.Next(-20, 55),
+ summaries[Random.Shared.Next(summaries.Length)]
+ ))
+ .ToArray();
+ return blobs.FirstOrDefault().Name;
+})
+.WithName("GetWeatherForecast")
+.WithOpenApi();
+
+app.Run();
+
+void registerUsingServicePrincipal(WebApplicationBuilder builder)
+{
+ #region snippet_ClientSecretCredential_UseCredential
+ builder.Services.AddAzureClients(clientBuilder =>
+ {
+ var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
+ var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
+ var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
+
+ clientBuilder.AddBlobServiceClient(
+ new Uri("https://.blob.core.windows.net"));
+
+ clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
+ });
+ #endregion snippet_ClientSecretCredential_UseCredential
+
+ #region snippet_ClientSecretCredential
+ var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
+ var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
+ var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
+
+ builder.Services.AddSingleton(_ =>
+ new BlobServiceClient(
+ new Uri("https://.blob.core.windows.net"),
+ new ClientSecretCredential(tenantId, clientId, clientSecret)));
+ #endregion snippet_ClientSecretCredential
+}
+
+internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
+{
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+}
diff --git a/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Properties/launchSettings.json b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Properties/launchSettings.json
new file mode 100644
index 0000000000000..02561bcc4467b
--- /dev/null
+++ b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/Properties/launchSettings.json
@@ -0,0 +1,15 @@
+{
+ "profiles": {
+ "UserAssignedIdentityClientId": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:52833;http://localhost:52834",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/docs/azure/sdk/snippets/authentication/local-dev-service-principal/UserAssignedIdentityClientId.csproj b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/UserAssignedIdentityClientId.csproj
new file mode 100644
index 0000000000000..94c4ea943ef74
--- /dev/null
+++ b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/UserAssignedIdentityClientId.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.Development.json b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.Development.json
new file mode 100644
index 0000000000000..0c208ae9181e5
--- /dev/null
+++ b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.json b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.json
new file mode 100644
index 0000000000000..10f68b8c8b4f7
--- /dev/null
+++ b/docs/azure/sdk/snippets/authentication/local-dev-service-principal/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/docs/core/compatibility/10.0.md b/docs/core/compatibility/10.0.md
index 9ce43e70dd393..5da792b1b23cd 100644
--- a/docs/core/compatibility/10.0.md
+++ b/docs/core/compatibility/10.0.md
@@ -56,6 +56,7 @@ If you're migrating an app to .NET 10, the breaking changes listed here might af
| Title | Type of change | Introduced version |
|-------------------------------------------------------------------------------------------------------------------|---------------------|--------------------|
+| [API obsoletions](windows-forms/10.0/obsolete-apis.md) | Source incompatible | Preview 1 |
| [Renamed parameter in HtmlElement.InsertAdjacentElement](windows-forms/10.0/insertadjacentelement-orientation.md) | Source incompatible | Preview 1 |
| [TreeView checkbox image truncation](windows-forms/10.0/treeview-text-location.md) | Behavioral change | Preview 1 |
| [StatusStrip uses System RenderMode by default](windows-forms/10.0/statusstrip-renderer.md) | Behavioral change | Preview 1 |
diff --git a/docs/core/compatibility/toc.yml b/docs/core/compatibility/toc.yml
index 4180e5311ac7f..286002fca5b30 100644
--- a/docs/core/compatibility/toc.yml
+++ b/docs/core/compatibility/toc.yml
@@ -44,6 +44,8 @@ items:
href: sdk/10.0/custom-build-event-warning.md
- name: Windows Forms
items:
+ - name: API obsoletions
+ href: windows-forms/10.0/obsolete-apis.md
- name: Renamed parameter in HtmlElement.InsertAdjacentElement
href: windows-forms/10.0/insertadjacentelement-orientation.md
- name: TreeView checkbox image truncation
@@ -2124,6 +2126,8 @@ items:
items:
- name: .NET 10
items:
+ - name: API obsoletions
+ href: windows-forms/10.0/obsolete-apis.md
- name: Renamed parameter in HtmlElement.InsertAdjacentElement
href: windows-forms/10.0/insertadjacentelement-orientation.md
- name: TreeView checkbox image truncation
diff --git a/docs/core/compatibility/windows-forms/10.0/obsolete-apis.md b/docs/core/compatibility/windows-forms/10.0/obsolete-apis.md
new file mode 100644
index 0000000000000..6cd2b0bf296b8
--- /dev/null
+++ b/docs/core/compatibility/windows-forms/10.0/obsolete-apis.md
@@ -0,0 +1,62 @@
+---
+title: "Breaking change: .NET 10 obsoletions in Windows Forms"
+titleSuffix: ""
+description: Learn about the .NET 10 breaking change where some Windows Forms APIs have been marked as obsolete.
+ms.date: 03/10/2025
+---
+# Windows Forms obsoletions (.NET 10)
+
+Some Windows Forms APIs have been marked as obsolete, starting in .NET 10.
+
+## Previous behavior
+
+In previous .NET versions, these APIs can be used without any build warning.
+
+## New behavior
+
+In .NET 10 and later versions, use of these APIs produces a compile-time warning with a custom diagnostic ID. The use of custom diagnostic IDs allows you to suppress the warnings individually instead of blanket-suppressing all obsoletion warnings.
+
+The following table lists the custom diagnostic IDs and their corresponding warning messages.
+
+| Diagnostic ID | Description | Severity | Version introduced |
+| - | - |
+| [WFDEV004](/dotnet/desktop/winforms/wfdev-diagnostics/wfdev004) | , and the corresponding events are obsolete. Use , , and instead. | Warning | Preview 1 |
+| [WFDEV005](/dotnet/desktop/winforms/wfdev-diagnostics/wfdev005) | method is obsolete. Use methods instead. | Warning | Preview 1 |
+| [WFDEV006](/dotnet/desktop/winforms/wfdev-diagnostics/wfdev006) | , , , , , are obsolete. They're provided for binary compatibility with .NET Framework. | Warning | Preview 1 |
+
+## Version introduced
+
+.NET 10
+
+## Type of breaking change
+
+These obsoletion warnings can affect [source compatibility](../../categories.md#source-compatibility).
+
+## Recommended action
+
+- Follow the specific guidance provided for the each diagnostic ID using the URL link provided on the warning.
+- If necessary, you can suppress the warning using the custom `WFDEVxxx` diagnostic ID value.
+
+## Affected APIs
+
+### WFDEV004
+
+-
+-
+
+### WFDEV005
+
+-
+
+### WFDEV006
+
+-
+-
+-
+-
+-
+-
+
+## See also
+
+- [Obsolete Windows Forms features in .NET 10+](/dotnet/desktop/winforms/wfdev-diagnostics/obsoletions-overview)
diff --git a/docs/core/diagnostics/metrics-strongly-typed.md b/docs/core/diagnostics/metrics-strongly-typed.md
new file mode 100644
index 0000000000000..2d3fe8defb655
--- /dev/null
+++ b/docs/core/diagnostics/metrics-strongly-typed.md
@@ -0,0 +1,189 @@
+---
+title: Source-generated metrics with strongly-typed tags
+description: Learn how to use a source generator to create strongly-typed metric tags in .NET, reducing boilerplate and ensuring consistent.
+ms.date: 03/07/2025
+---
+
+# Source-generated metrics with strongly-typed tags
+
+Modern .NET applications can capture metrics using the API. These metrics often include additional context in the form of key-value pairs called *tags* (sometimes referred to as *dimensions* in telemetry systems). This article shows how to use a compile-time source generator to define **strongly-typed metric tags** (TagNames) and metric recording types and methods. By using strongly-typed tags, you eliminate repetitive boilerplate code and ensure that related metrics share the same set of tag names with compile-time safety. The primary benefit of this approach is improved developer productivity and type safety.
+
+> [!NOTE]
+> In the context of metrics, a tag is sometimes also called a "dimension." This article uses "tag" for clarity and consistency with .NET metrics terminology.
+
+## Tag name defaults and customization
+
+By default, the source generator derives metric tag names from the field and property names of your tag class. In other words, each public field or property in the strongly-typed tag object becomes a tag name by default. You can override this by using the on a field or property to specify a custom tag name. In the examples below, you’ll see both approaches in action.
+
+## Example 1: Basic metric with a single tag
+
+The following example demonstrates a simple counter metric with one tag. In this scenario, we want to count the number of processed requests and categorize them by a `Region` tag:
+
+```csharp
+public struct RequestTags
+{
+ public string Region { get; set; }
+}
+
+public static partial class MyMetrics
+{
+ [Counter(typeof(RequestTags))]
+ public static partial RequestCount CreateRequestCount(Meter meter);
+}
+```
+
+In the code above, `RequestTags` is a strongly-typed tag struct with a single property `Region`. The `CreateRequestCount` method is marked with where `T` is an `int`, indicating it generates a **Counter** instrument that tracks `int` values. The attribute references `typeof(RequestTags)`, meaning the counter will use the tags defined in `RequestTags` when recording metrics. The source generator will produce a strongly-typed instrument class (named `RequestCount`) with an `Add` method that accepts integer value and `RequestTags` object.
+
+To use the generated metric, create a and record measurements as shown below:
+
+```csharp
+Meter meter = new Meter("MyCompany.MyApp", "1.0");
+RequestCount requestCountMetric = MyMetrics.CreateRequestCount(meter);
+
+// Create a tag object with the relevant tag value
+var tags = new RequestTags { Region = "NorthAmerica" };
+
+// Record a metric value with the associated tag
+requestCountMetric.Add(1, tags);
+```
+
+In this usage example, calling `MyMetrics.CreateRequestCount(meter)` creates a counter instrument (via the `Meter`) and returns a `RequestCount` metric object. When you call `requestCountMetric.Add(1, tags)`, the metric system records a count of 1 associated with the tag `Region="NorthAmerica"`. You can reuse the `RequestTags` object or create new ones to record counts for different regions, and the tag name `Region` will consistently be applied to every measurement.
+
+## Example 2: Metric with nested tag objects
+
+For more complex scenarios, you can define tag classes that include multiple tags, nested objects, or even inherited properties. This allows a group of related metrics to share a common set of tags easily. In the next example, we define a set of tag classes and use them for three different metrics:
+
+```csharp
+public class MetricTags : MetricParentTags
+{
+ [TagName("Dim1DimensionName")]
+ public string? Dim1; // custom tag name via attribute
+
+ public Operations Operation { get; set; } // tag name defaults to "Operation"
+
+ public MetricChildTags? ChildTagsObject { get; set; }
+}
+
+public enum Operations
+{
+ Unknown = 0,
+ Operation1 = 1,
+}
+
+public class MetricParentTags
+{
+ [TagName("DimensionNameOfParentOperation")]
+ public string? ParentOperationName { get; set; } // custom tag name via attribute
+
+ public MetricTagsStruct ChildTagsStruct { get; set; }
+}
+
+public class MetricChildTags
+{
+ public string? Dim2 { get; set; } // tag name defaults to "Dim2"
+}
+
+public struct MetricTagsStruct
+{
+ public string Dim3 { get; set; } // tag name defaults to "Dim3"
+}
+
+public static partial class Metric
+{
+ [Histogram(typeof(MetricTags))]
+ public static partial Latency CreateLatency(Meter meter);
+
+ [Counter(typeof(MetricTags))]
+ public static partial TotalCount CreateTotalCount(Meter meter);
+
+ [Counter(typeof(MetricTags))]
+ public static partial TotalFailures CreateTotalFailures(Meter meter);
+}
+```
+
+In this example, `MetricTags` is a tag class that inherits from `MetricParentTags` and also contains a nested tag object (`MetricChildTags`) and a nested struct (`MetricTagsStruct`). The tag properties demonstrate both default and customized tag names:
+
+- The `Dim1` field in `MetricTags` has a `[TagName("Dim1DimensionName")]` attribute, so its tag name will be `"Dim1DimensionName"`.
+- The `Operation` property has no attribute, so its tag name defaults to `"Operation"`.
+- In `MetricParentTags`, the `ParentOperationName` property is overridden with a custom tag name `"DimensionNameOfParentOperation"`.
+- The nested `MetricChildTags` class defines a `Dim2` property (no attribute, tag name `"Dim2"`).
+- The `MetricTagsStruct` struct defines a `Dim3` field (tag name `"Dim3"`).
+
+All three metric definitions `CreateLatency`, `CreateTotalCount`, and `CreateTotalFailures` use `MetricTags` as their tag object type. This means the generated metric types (`Latency`, `TotalCount`, and `TotalFailures`) will all expect a `MetricTags` instance when recording data. **Each of these metrics will have the same set of tag names:** `Dim1DimensionName`, `Operation`, `Dim2`, `Dim3`, and `DimensionNameOfParentOperation`.
+
+The following code shows how to create and use these metrics in a class:
+
+```csharp
+internal class MyClass
+{
+ private readonly Latency _latencyMetric;
+ private readonly TotalCount _totalCountMetric;
+ private readonly TotalFailures _totalFailuresMetric;
+
+ public MyClass(Meter meter)
+ {
+ // Create metric instances using the source-generated factory methods
+ _latencyMetric = Metric.CreateLatency(meter);
+ _totalCountMetric = Metric.CreateTotalCount(meter);
+ _totalFailuresMetric = Metric.CreateTotalFailures(meter);
+ }
+
+ public void DoWork()
+ {
+ var stopwatch = new Stopwatch();
+ stopwatch.Start();
+ bool requestSuccessful = true;
+ // ... perform some operation ...
+ stopwatch.Stop();
+
+ // Create a tag object with values for all tags
+ var tags = new MetricTags
+ {
+ Dim1 = "Dim1Value",
+ Operation = Operations.Operation1,
+ ParentOperationName = "ParentOpValue",
+ ChildTagsObject = new MetricChildTags
+ {
+ Dim2 = "Dim2Value",
+ },
+ ChildTagsStruct = new MetricTagsStruct
+ {
+ Dim3 = "Dim3Value"
+ }
+ };
+
+ // Record the metric values with the associated tags
+ _latencyMetric.Record(stopwatch.ElapsedMilliseconds, tags);
+ _totalCountMetric.Add(1, tags);
+ if (!requestSuccessful)
+ {
+ _totalFailuresMetric.Add(1, tags);
+ }
+ }
+}
+```
+
+In the preceding `MyClass.DoWork` method, a `MetricTags` object is populated with values for each tag. This single `tags` object is then passed to all three instruments when recording data. The `Latency` metric (a histogram) records the elapsed time, and both counters (`TotalCount` and `TotalFailures`) record occurrence counts. Because all metrics share the same tag object type, the tags (`Dim1DimensionName`, `Operation`, `Dim2`, `Dim3`, `DimensionNameOfParentOperation`) are present on every measurement.
+
+## Performance considerations
+
+Using strongly-typed tags via source generation adds no overhead compared to using metrics directly. If you need to further minimize allocations for very high-frequency metrics, consider defining your tag object as a `struct` (value type) instead of a `class`. Using a `struct` for the tag object can avoid heap allocations when recording metrics, since the tags would be passed by value.
+
+## Generated metric method requirements
+
+When defining metric factory methods (the partial methods decorated with `[Counter]`, `[Histogram]`, etc.), the source generator imposes a few requirements:
+
+- Each method must be `public static partial` (for the source generator to provide the implementation).
+- The return type of each partial method must be unique (so that the generator can create a uniquely named type for the metric).
+- The method name should not start with an underscore (`_`), and parameter names should not start with an underscore.
+- The first parameter must be a (this is the meter instance used to create the underlying instrument).
+- The methods cannot be generic and cannot have generic parameters.
+- The tag properties in the tag class can only be of type `string` or `enum`. For other types (for example, `bool` or numeric types), convert the value to a string before assigning it to the tag object.
+
+Adhering to these requirements ensures that the source generator can successfully produce the metric types and methods.
+
+## See also
+
+- [Creating metrics in .NET (Instrumentation tutorial)](metrics-instrumentation.md)
+- [Collecting metrics in .NET (Using MeterListener and exporters)](metrics-collection.md)
+- [Logging source generation in .NET](../extensions/logger-message-generator.md) (for a similar source-generation approach applied to logging)
diff --git a/docs/core/diagnostics/metrics.md b/docs/core/diagnostics/metrics.md
index a31648369da02..a383d3321b3e5 100644
--- a/docs/core/diagnostics/metrics.md
+++ b/docs/core/diagnostics/metrics.md
@@ -28,6 +28,7 @@ There are two parts to using metrics in a .NET app:
- [Instrumentation tutorial](metrics-instrumentation.md) - How to create new metrics in code
- [Collection tutorial](metrics-collection.md) - How to store and view metric data for your app
+- [Source-generated metrics with strongly-typed tags](metrics-strongly-typed.md) - How to use source-generated metrics with strongly-typed tags
- [Built-in metrics](built-in-metrics.md) - Discover metrics that are ready for use in .NET runtime libraries
- [Compare metric APIs](compare-metric-apis.md)
- [EventCounters](event-counters.md) - Learn what EventCounters are, how to implement them, and how to consume them
diff --git a/docs/core/extensions/httpclient-factory.md b/docs/core/extensions/httpclient-factory.md
index e4043245583b9..f06cec7e86c72 100644
--- a/docs/core/extensions/httpclient-factory.md
+++ b/docs/core/extensions/httpclient-factory.md
@@ -220,7 +220,7 @@ An is returne
:::code source="snippets/http/configurehandler/Program.cs" id="configurehandler":::
-Configuring the `HttClientHandler` lets you specify a proxy for the `HttpClient` instance among various other properties of the handler. For more information, see [Proxy per client](../../fundamentals/networking/http/httpclient.md#http-proxy).
+Configuring the `HttClientHandler` lets you specify a proxy for the `HttpClient` instance among various other properties of the handler. For more information, see [Proxy per client](../../fundamentals/networking/http/httpclient.md#configure-an-http-proxy).
### Additional configuration
diff --git a/docs/core/introduction.md b/docs/core/introduction.md
index 0bd017fb32520..9fa44daa1f4f8 100644
--- a/docs/core/introduction.md
+++ b/docs/core/introduction.md
@@ -83,6 +83,6 @@ There are multiple variants of .NET, each supporting a different type of app. Th
## Next steps
* [Choose a .NET tutorial](tutorials/index.md)
-* [Try .NET in your browser](../csharp/tour-of-csharp/tutorials/numbers-in-csharp.yml)
+* [Try .NET in your browser](../csharp/tour-of-csharp/tutorials/numbers-in-csharp.md)
* [Take a tour of C#](../csharp/tour-of-csharp/overview.md)
* [Take a tour of F#](../fsharp/tour.md)
diff --git a/docs/core/project-sdk/msbuild-props.md b/docs/core/project-sdk/msbuild-props.md
index bf74a4743916b..a745eebad270e 100644
--- a/docs/core/project-sdk/msbuild-props.md
+++ b/docs/core/project-sdk/msbuild-props.md
@@ -1556,11 +1556,11 @@ When you use the [MSTest project SDK](../testing/unit-testing-mstest-sdk.md), th
| `None` | No extensions are enabled. |
| `AllMicrosoft` | Enable all extensions shipped by Microsoft (including extensions with a restrictive license). |
-For more information, see [MSTest runner profile](../testing/unit-testing-mstest-sdk.md#mstest-runner-profile).
+For more information, see [Microsoft.Testing.Platform profile](../testing/unit-testing-mstest-sdk.md#microsofttestingplatform-profile).
### UseVSTest
-Set the `UseVSTest` property to `true` to switch from the MSTest runner to the [VSTest](/visualstudio/test/vstest-console-options) runner when using the [MSTest project SDK](../testing/unit-testing-mstest-sdk.md).
+Set the `UseVSTest` property to `true` to switch from Microsoft.Testing.Platform to the [VSTest](/visualstudio/test/vstest-console-options) runner when using the [MSTest project SDK](../testing/unit-testing-mstest-sdk.md).
### MSTestAnalysisMode
diff --git a/docs/core/testing/microsoft-testing-platform-integration-dotnet-test.md b/docs/core/testing/microsoft-testing-platform-integration-dotnet-test.md
index a63fb4356b0c5..5092ff6eb5207 100644
--- a/docs/core/testing/microsoft-testing-platform-integration-dotnet-test.md
+++ b/docs/core/testing/microsoft-testing-platform-integration-dotnet-test.md
@@ -41,7 +41,6 @@ By default, `dotnet test` is using VSTest behavior to run tests. You can enable
enable
false
- true
Exe
true
@@ -137,7 +136,6 @@ Or in project file:
enable
false
- true
Exe
true
@@ -179,7 +177,6 @@ Or in project file:
enable
false
- true
Exe
true
diff --git a/docs/core/testing/microsoft-testing-platform-vs-vstest.md b/docs/core/testing/microsoft-testing-platform-vs-vstest.md
index 916386ec8723f..e472c04f1433a 100644
--- a/docs/core/testing/microsoft-testing-platform-vs-vstest.md
+++ b/docs/core/testing/microsoft-testing-platform-vs-vstest.md
@@ -8,7 +8,7 @@ ms.date: 12/15/2023
# Microsoft.Testing.Platform and VSTest comparison
-`Microsoft.Testing.Platform` is a lightweight and portable alternative to [VSTest](https://github.com/microsoft/vstest) for running tests in command line, in continuous integration (CI) pipelines, in Visual Studio Test Explorer, and in Visual Studio Code. In this article, you learn the key differences between the MSTest runner and VSTest.
+`Microsoft.Testing.Platform` is a lightweight and portable alternative to [VSTest](https://github.com/microsoft/vstest) for running tests in command line, in continuous integration (CI) pipelines, in Visual Studio Test Explorer, and in Visual Studio Code. In this article, you learn the key differences between Microsoft.Testing.Platform and VSTest.
## Differences in test execution
diff --git a/docs/core/testing/unit-testing-fsharp-with-mstest.md b/docs/core/testing/unit-testing-fsharp-with-mstest.md
index 52dcde1bf9f10..692b511275f5c 100644
--- a/docs/core/testing/unit-testing-fsharp-with-mstest.md
+++ b/docs/core/testing/unit-testing-fsharp-with-mstest.md
@@ -56,7 +56,7 @@ Make the *MathService.Tests* directory the current directory and create a new pr
```
-The test project requires other packages to create and run unit tests. `dotnet new` in the previous step added MSTest and the MSTest runner. Now, add the `MathService` class library as another dependency to the project. Use the `dotnet add reference` command:
+The test project requires other packages to create and run unit tests. `dotnet new` in the previous step added MSTest. Now, add the `MathService` class library as another dependency to the project. Use the `dotnet add reference` command:
```dotnetcli
dotnet add reference ../MathService/MathService.fsproj
diff --git a/docs/core/testing/unit-testing-mstest-runner-intro.md b/docs/core/testing/unit-testing-mstest-runner-intro.md
index 667bb81ab79e9..c799e9c54c2ca 100644
--- a/docs/core/testing/unit-testing-mstest-runner-intro.md
+++ b/docs/core/testing/unit-testing-mstest-runner-intro.md
@@ -12,11 +12,11 @@ MSTest supports running tests with both VSTest and [Microsoft.Testing.Platform (
The MSTest runner is open source and builds on the [`Microsoft.Testing.Platform`](./microsoft-testing-platform-intro.md) library. You can find `Microsoft.Testing.Platform` code in the [microsoft/testfx](https://github.com/microsoft/testfx/tree/main/src/Platform/Microsoft.Testing.Platform) GitHub repository. The MSTest runner comes bundled with `MSTest in 3.2.0` or newer.
-## Enable MSTest runner in an MSTest project
+## Enable Microsoft.Testing.Platform in an MSTest project
-It's recommended to use [MSTest SDK](./unit-testing-mstest-sdk.md) as it greatly simplifies your project configuration and updating the project, and it ensures a proper alignment of the versions of the platform (MSTest runner) and its extensions.
+It's recommended to use [MSTest SDK](./unit-testing-mstest-sdk.md) as it greatly simplifies your project configuration and updating the project, and it ensures a proper alignment of the versions of the platform (Microsoft.Testing.Platform) and its extensions.
-When you use `MSTest SDK`, by default you're opted in to using MSTest runner.
+When you use `MSTest SDK`, by default you're opted in to using Microsoft.Testing.Platform.
```xml
@@ -38,7 +38,7 @@ Consider the following example project file:
-
+
true
true
@@ -70,7 +70,7 @@ Consider the following example project file:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/BranchesAndLoops/Program.cs" id="Challenge":::
+
+
+
+You completed the "branches and loops" interactive tutorial. You can select the **list collection** link to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
+
+You can learn more about these concepts in these articles:
+
+- [Selection statements](../../language-reference/statements/selection-statements.md)
+- [Iteration statements](../../language-reference/statements/iteration-statements.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/branches-and-loops.yml b/docs/csharp/tour-of-csharp/tutorials/branches-and-loops.yml
deleted file mode 100644
index ad0acc682c48d..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/branches-and-loops.yml
+++ /dev/null
@@ -1,312 +0,0 @@
-### YamlMime:Tutorial
-title: Learn conditional logic with branch and loop statements
-metadata:
- title: Branches and loops - Introductory interactive tutorial
- description: In this tutorial about branches and loops, you'll use your browser to learn C# interactively. You'll write C# code and see the results of compiling and running your code directly in the browser.
- audience: Developer
- level: Beginner
- ms.custom: mvc
- ms.date: 03/23/2022
- ms.topic: interactive-tutorial
- displayType: two-column
- interactive: csharp
- nextTutorialHref: list-collection.yml
- nextTutorialTitle: The list collection
-items:
-- durationInMinutes: 1
- content: |
- This tutorial teaches you how to write code that examines variables and changes execution path based on those variables. You'll use your browser to write C# interactively and see the results of compiling and running your code. This tutorial contains a series of lessons that explore branching and looping constructs in C#. These lessons teach you the fundamentals of the C# language.
-
- > [!TIP]
- > To paste a code snippet inside the **focus mode** you should use your keyboard shortcut (Ctrl + v, or cmd + v).
-- title: Make decisions using the if statement
- durationInMinutes: 4
- content: |
- Run the following code in the interactive window. Select the **Enter focus mode** button. Then, type the following code block in the interactive window and select **Run**:
-
- ```csharp
- int a = 5;
- int b = 6;
- if (a + b > 10)
- Console.WriteLine("The answer is greater than 10.");
- ```
-
- If you are running this on your environment, you should follow the instructions for the [local version](branches-and-loops-local.md) instead.
-
- Modify the declaration of `b` so that the sum is less than 10:
-
- ```csharp
- int b = 3;
- ```
-
- Select the **Run** button again. Because the answer is less than 10, nothing is printed. The **condition** you're testing is false. You don't have any code to execute because you've only
- written one of the possible branches for an `if` statement: the true branch.
-
- > [!TIP]
- > As you explore C# (or any programming language), you'll
- > make mistakes when you write code. The **compiler** will
- > find those errors and report them to you. When the output
- > contains error messages, look closely at the example code,
- > and the code in the interactive window to see what to fix.
- > That exercise will help you learn the structure of C# code.
-
- This first sample shows the power of `if` and boolean types. A *boolean* is a variable that can have one of two values: `true` or `false`. C# defines a special type, `bool` for boolean variables. The `if` statement checks the value of a `bool`. When the value is `true`, the statement following the `if` executes. Otherwise, it's skipped.
-
- This process of checking conditions and executing statements based on those conditions is powerful. Let's explore more.
-
-- title: Make if and else work together
- durationInMinutes: 10
- content: |
-
- To execute different code in both the true and false branches, you
- create an `else` branch that executes when the condition is false. Try this:
-
- ```csharp
- int a = 5;
- int b = 3;
- if (a + b > 10)
- Console.WriteLine("The answer is greater than 10");
- else
- Console.WriteLine("The answer is not greater than 10");
- ```
-
- The statement following the `else` keyword executes only when the condition being tested is `false`. Combining `if` and `else` with boolean conditions provides all the power you need.
-
- > [!IMPORTANT]
- > The indentation under the `if` and `else` statements is for human readers.
- > The C# language doesn't treat indentation or white space as significant.
- > The statement following the `if` or `else` keyword will be executed based
- > on the condition. All the samples in this tutorial follow a common
- > practice to indent lines based on the control flow of statements.
-
- Because indentation isn't significant, you need to use `{` and `}` to
- indicate when you want more than one statement to be part of the block
- that executes conditionally. C# programmers typically use those braces
- on all `if` and `else` clauses. The following example is the same as what you
- created. Try it.
-
- ```csharp
- int a = 5;
- int b = 3;
- if (a + b > 10)
- {
- Console.WriteLine("The answer is greater than 10");
- }
- else
- {
- Console.WriteLine("The answer is not greater than 10");
- }
- ```
-
- > [!TIP]
- > Through the rest of this tutorial, the code samples all include the braces,
- > following accepted practices.
-
- You can test more complicated conditions:
-
- ```csharp
- int a = 5;
- int b = 3;
- int c = 4;
- if ((a + b + c > 10) && (a == b))
- {
- Console.WriteLine("The answer is greater than 10");
- Console.WriteLine("And the first number is equal to the second");
- }
- else
- {
- Console.WriteLine("The answer is not greater than 10");
- Console.WriteLine("Or the first number is not equal to the second");
- }
- ```
-
- The `==` symbol tests for *equality*. Using `==` distinguishes the test for equality from assignment, which you saw in `a = 5`.
-
- The `&&` represents "and". It means both conditions must be true to execute
- the statement in the true branch. These examples also show that you can have multiple
- statements in each conditional branch, provided you enclose them in `{` and `}`.
-
- You can also use `||` to represent "or":
-
- ```csharp
- int a = 5;
- int b = 3;
- int c = 4;
- if ((a + b + c > 10) || (a == b))
- {
- Console.WriteLine("The answer is greater than 10");
- Console.WriteLine("Or the first number is equal to the second");
- }
- else
- {
- Console.WriteLine("The answer is not greater than 10");
- Console.WriteLine("And the first number is not equal to the second");
- }
- ```
-
- Modify the values of `a`, `b`, and `c` and switch between `&&` and `||` to explore. You'll gain more understanding of how the `&&` and `||` operators work.
-
-- title: Use loops to repeat operations
- durationInMinutes: 6
- content: |
- Another important concept to create larger programs is **loops**. You'll
- use loops to repeat statements that you want executed more than once. Try
- this code in the interactive window:
-
- ```csharp
- int counter = 0;
- while (counter < 10)
- {
- Console.WriteLine($"Hello World! The counter is {counter}");
- counter++;
- }
- ```
-
- The `while` statement checks a condition and executes the statement
- following the `while`. It will repeat checking the condition and
- executing those statements until the condition is false.
-
- There's one other new operator in this example. The `++` after
- the `counter` variable is the **increment** operator. It adds 1
- to the value of counter, and stores that value in the counter variable.
-
- > [!IMPORTANT]
- > Make sure that the `while` loop condition does switch to
- > false as you execute the code. Otherwise, you create an
- > **infinite loop** where your program never ends. Let's
- > not demonstrate that, because the engine that runs your
- > code will time out and you'll see no output from your program.
-
- The `while` loop tests the condition before executing the code
- following the `while`. The `do` ... `while` loop executes the
- code first, and then checks the condition. It looks like this:
-
- ```csharp
- int counter = 0;
- do
- {
- Console.WriteLine($"Hello World! The counter is {counter}");
- counter++;
- } while (counter < 10);
- ```
-
- This `do` loop and the earlier `while` loop work the same.
-
- Let's move on to one last loop statement.
-
-- title: Work with the for loop
- durationInMinutes: 5
- content: |
- Another common loop statement that you'll see in C# code is the
- `for` loop. Try this code in the interactive window:
-
- ```csharp
- for (int counter = 0; counter < 10; counter++)
- {
- Console.WriteLine($"Hello World! The counter is {counter}");
- }
- ```
-
- This does the same work as the `while` loop and the `do` loop you've
- already used. The `for` statement has three parts that control
- how it works.
-
- The first part is the **for initializer**: `int counter = 0;` declares
- that `counter` is the loop variable, and sets its initial value to `0`.
-
- The middle part is the **for condition**: `counter < 10` declares that this
- `for` loop continues to execute as long as the value of counter is less than 10.
-
- The final part is the **for iterator**: `counter++` specifies how to modify the loop
- variable after executing the block following the `for` statement. Here, it specifies
- that `counter` should be incremented by 1 each time the block executes.
-
- Experiment with these yourself. Try each of the following:
-
- - Change the initializer to start at a different value.
- - Change the condition to stop at a different value.
-
- When you're done, let's move on to write some code yourself to
- use what you've learned.
-
- There's one other looping statement that isn't covered in this tutorial: the `foreach` statement. The `foreach` statement repeats its statement for every item in a sequence of items. It's most often used with *collections*, so it is covered in the next tutorial.
-
-- title: Created nested loops
- durationInMinutes: 10
- content: |
- A `while`, `do`, or `for` loop can be nested inside another loop to create a matrix
- using the combination of each item in the outer loop with each item in the inner
- loop. Let's do that to build a set of alphanumeric pairs to represent rows and columns.
-
- One `for` loop can generate the rows:
-
- ```csharp
- for (int row = 1; row < 11; row++)
- {
- Console.WriteLine($"The row is {row}");
- }
- ```
-
- Another loop can generate the columns:
-
- ```csharp
- for (char column = 'a'; column < 'k'; column++)
- {
- Console.WriteLine($"The column is {column}");
- }
- ```
-
- You can nest one loop inside the other to form pairs:
-
- ```csharp
- for (int row = 1; row < 11; row++)
- {
- for (char column = 'a'; column < 'k'; column++)
- {
- Console.WriteLine($"The cell is ({row}, {column})");
- }
- }
- ```
-
- You can see that the outer loop increments once for each full run of the
- inner loop. Reverse the row and column nesting, and see the changes for yourself.
-
-- title: Combine branches and loops
- durationInMinutes: 12
- content: |
- Now that you've seen the `if` statement and the looping
- constructs in the C# language, see if you can write C# code to
- find the sum of all integers 1 through 20 that are divisible
- by 3. Here are a few hints:
-
- - The `%` operator gives you the remainder of a division operation.
- - The `if` statement gives you the condition to see if a number should be part of the sum.
- - The `for` loop can help you repeat a series of steps for all the numbers 1 through 20.
-
- Try it yourself. Then check how you did. As a hint, you should get 63 for an answer.
-
-- title: Complete challenge
- durationInMinutes: 1
- content: |
- Did you come up with something like this?
-
- ```csharp
- int sum = 0;
- for (int number = 1; number < 21; number++)
- {
- if (number % 3 == 0)
- {
- sum = sum + number;
- }
- }
- Console.WriteLine($"The sum is {sum}");
- ```
-
-- title: Congratulations!
- content: |
- You've completed the "branches and loops" interactive tutorial. You can select the **list collection** link below to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
-
- You can learn more about these concepts in these articles:
-
- - [Selection statements](../../language-reference/statements/selection-statements.md)
- - [Iteration statements](../../language-reference/statements/iteration-statements.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/hello-world.md b/docs/csharp/tour-of-csharp/tutorials/hello-world.md
new file mode 100644
index 0000000000000..2170368b820ab
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/hello-world.md
@@ -0,0 +1,133 @@
+---
+title: Hello World - Introductory interactive tutorial
+description: In this tutorial, you use your browser to learn C# interactively. You write C# code and see the results of compiling and running your code directly in the browser.
+ms.date: 03/05/2025
+---
+# Introduction to C# - interactive tutorial
+
+This tutorial teaches you C# interactively, using your browser to write C# and see the results of compiling and running your code. It contains a series of lessons that begin with a "Hello World" program. These lessons teach you the fundamentals of the C# language.
+
+> [!TIP]
+>
+> When a code snippet block includes the "Run" button, that button opens the interactive window, or replaces the existing code in the interactive window. When the snippet doesn't include a "Run" button, you can copy the code and add it to the current interactive window.
+
+## Run your first program
+
+Run the following code in the interactive window.
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="HelloWorld":::
+
+Congratulations! You ran your first C# program. It's a simple program that prints the message "Hello World!" It used the method to print that message. `Console` is a type that represents the console window. `WriteLine` is a method of the `Console` type that prints a line of text to that text console.
+
+Let's move on and explore more. The rest of this lesson explores working with the `string` type, which represents text in C#. Like the `Console` type, the `string` type has methods. The `string` methods work with text.
+
+## Declare and use variables
+
+Your first program printed the `string` "Hello World!" on the screen.
+
+> [!TIP]
+>
+> As you explore C# (or any programming language), you make mistakes when you write code. The **compiler** finds those errors and report them to you. When the output contains error messages, look closely at the example code, and the code in the interactive window to see what to fix. That exercise helps you learn the structure of C# code.
+
+Your first program is limited to printing one message. You can write more useful programs by using *variables*. A *variable* is a symbol you can use to run the same code with different values. Let's try it! Start with the following code:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="Variables":::
+
+The first line declares a variable, `aFriend`, and assigns it a value, "Bill". The second line prints the name.
+
+You can assign different values to any variable you declare. You can change the name to one of your friends. Add these two lines in the preceding interactive window following the code you already added. Make sure you keep the declaration of the `aFriend` variable and its initial assignment.
+
+> [!IMPORTANT]
+> Don't delete the declaration of `aFriend`. Add the following code at the end of the preceding interactive window:
+
+:::code language="csharp" source="./snippets/HelloWorld/Program.cs" id="Assignment":::
+
+Notice that the same line of code prints two different messages, based on the value stored in the `aFriend` variable.
+
+You might notice that the word "Hello" was missing in the last two messages. Let's fix that now. Modify the lines that print the message to the following code:
+
+:::code language="csharp" source="./snippets/HelloWorld/Program.cs" id="ConcatMessage":::
+
+Select **Run** again to see the results.
+
+You've been using `+` to build strings from **variables** and **constant** strings. There's a better way. You can place a variable between `{` and `}` characters to tell C# to replace that text with the value of the variable.
+
+This process is called [String interpolation](../../language-reference/tokens/interpolated.md).
+
+If you add a `$` before the opening quote of the string, you can then include variables, like `aFriend`, inside the string between curly braces. Give it a try:
+
+Select **Run** again to see the results. Instead of "Hello {aFriend}", the message should be "Hello Maira".
+
+:::code language="csharp" source="./snippets/HelloWorld/Program.cs" id="Interpolation":::
+
+## Work with strings
+
+Your last edit was our first look at what you can do with strings. Let's explore more.
+
+You're not limited to a single variable between the curly braces. Try the following code:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="WorkWithStrings":::
+
+Strings are more than a collection of letters. You can find the length of a string using `Length`. `Length` is a **property** of a string and it returns the number of characters in that string. Add the following code at the bottom of the interactive window:
+
+:::code language="csharp" source="./snippets/HelloWorld/Program.cs" id="Properties":::
+
+> [!TIP]
+>
+> Now is a good time to explore on your own. You learned that `Console.WriteLine()` writes text to the screen. You learned how to declare variables and concatenate strings together. Experiment in the interactive window. The window has a feature called *IntelliSense* that makes suggestions for what you can do. Type a `.` after the `d` in `firstFriend`. You see a list of suggestions for properties and methods you can use.
+
+You've been using a *method*, , to print messages. A *method* is a block of code that implements some action. It has a name, so you can access it.
+
+## Trim
+
+Suppose your strings have leading or trailing spaces that you don't want to display. You want to **trim** the spaces from the strings.
+The method and related methods and do that work. You can just use those methods to remove leading and trailing spaces. Try the following code:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="Trim":::
+
+The square brackets `[` and `]` help visualize what the `Trim`, `TrimStart,` and, `TrimEnd` methods do. The brackets show where whitespace starts and ends.
+
+This sample reinforces a couple of important concepts for working with strings. The methods that manipulate strings return new string objects rather than making modifications in place. You can see that each call to any of the `Trim` methods returns a new string but doesn't change the original message.
+
+## Replace
+
+There are other methods available to work with a string. For example, you probably used a search and replace command in an editor or word processor before. The method does something similar in a string. It searches for a substring and replaces it with different text. The method takes two **parameters**. These parameters are the strings between the parentheses. The first string is the text to search for. The second string is the text to replace it with. Try it for yourself. Add this code. Type it in to see the hints as you start typing `.Re` after the `sayHello` variable:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="Replace":::
+
+Two other useful methods make a string ALL CAPS or all lower case. Try the following code. Type it in to see how **IntelliSense** provides hints as you start to type `To`:
+
+:::code language="csharp" source="./snippets/HelloWorld/Program.cs" id="UpperLower":::
+
+## Search strings
+
+The other part of a *search and replace* operation is to find text in a string. You can use the method for searching. It tells you if a string contains a substring inside it. Try the following code to explore :
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="SearchStrings":::
+
+The method returns a *boolean* value which tells you if the string you were searching for was found. A *boolean* stores either a `true` or a `false` value. When displayed as text output, they're capitalized: `True` and `False`, respectively. You learn more about *boolean* values in a later lesson.
+
+## Challenge
+
+There are two similar methods, and that also search for substrings in a string. These methods find a substring at the beginning or the end of the string. Try to modify the previous sample to use and instead of . Search for "You" or "goodbye" at the beginning of a string. Search for "hello" or "goodbye" at the end of a string.
+
+> [!NOTE]
+>
+> Watch your punctuation when you test for the text at the end of the string. If the string ends with a period, you must check for a string that ends with a period.
+
+You should get `true` for starting with "You" and ending with "hello" and `false` for starting with or ending with "goodbye".
+
+Did you come up with something like the following (expand to see the answer):
+
+
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/HelloWorld/Program.cs" id="Challenge":::
+
+
+
+You completed the "Hello C#" introduction to C# tutorial. You can select the **Numbers in C#** tutorial to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
+
+For further reading on the `string` type:
+
+- [C# programming guide article on strings](../../programming-guide/strings/index.md).
+- [How to tips on working with strings](../../how-to/index.md#working-with-strings).
diff --git a/docs/csharp/tour-of-csharp/tutorials/hello-world.yml b/docs/csharp/tour-of-csharp/tutorials/hello-world.yml
deleted file mode 100644
index a3eb05865822d..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/hello-world.yml
+++ /dev/null
@@ -1,224 +0,0 @@
-### YamlMime:Tutorial
-title: Hello World - Introductory interactive tutorial
-metadata:
- title: Hello World - Introductory interactive tutorial
- description: In this tutorial, you'll use your browser to learn C# interactively. You write C# code and see the results of compiling and running your code directly in the browser.
- audience: Developer
- level: Beginner
- ms.date: 03/15/2024
- ms.topic: interactive-tutorial
- nextTutorialHref: numbers-in-csharp.yml
- nextTutorialTitle: Numbers in C#
- displayType: two-column
- interactive: csharp
- ms.custom: mvc
-items:
-- durationInMinutes: 1
- content: |
- This tutorial teaches you C# interactively, using your browser to write C# and see the results of compiling and running your code. It contains a series of lessons that begin with a "Hello World" program. These lessons teach you the fundamentals of the C# language.
-
- > [!TIP]
- > To paste a code snippet inside the **focus mode** you should use your keyboard shortcut (Ctrl + v, or cmd + v).
-- title: Run your first program
- durationInMinutes: 2
- content: |
- Run the following code in the interactive window. Select the **Enter focus mode** button. Then, type the following code block in the interactive window and select **Run**:
-
- ```csharp
- Console.WriteLine("Hello World!");
- ```
-
- Congratulations! You've run your first C# program. It's a simple program that prints the message "Hello World!". It used the method to print that message. `Console` is a type that represents the console window. `WriteLine` is a method of the `Console` type that prints a line of text to that text console.
-
- Let's move on and explore more. The rest of this lesson explores working with the `string` type, which represents text in C#. Like the `Console` type, the `string` type has methods. The `string` methods work with text.
-
-- title: Declare and use variables
- durationInMinutes: 3
- content: |
- Your first program printed the `string` "Hello World!" on
- the screen.
-
- > [!TIP]
- > As you explore C# (or any programming language), you'll
- > make mistakes when you write code. The **compiler** will
- > find those errors and report them to you. When the output
- > contains error messages, look closely at the example code,
- > and the code in the interactive window to see what to fix.
- > That exercise will help you learn the structure of C# code.
-
- Your first program is limited to printing one message. You can write more
- useful programs by using *variables*. A *variable* is a symbol you can
- use to run the same code with different values. Let's try it! Replace the
- code you've written in the interactive window with the following code:
-
- ```csharp
- string aFriend = "Bill";
- Console.WriteLine(aFriend);
- ```
-
- The first line declares a variable, `aFriend`, and assigns it a value, "Bill". The second line
- prints out the name.
-
- You can assign different values to any variable you declare. You can change
- the name to one of your friends. Add these two lines in the interactive window
- following the code you've already added. Make sure you keep the declaration
- of the `aFriend` variable and its initial assignment.
-
- > [!IMPORTANT]
- > Don't delete the declaration of `aFriend`. Add the code below following the existing declaration.
-
- ```csharp
- aFriend = "Maira";
- Console.WriteLine(aFriend);
- ```
-
- Notice that the same line of code prints two different messages, based on
- the value stored in the `aFriend` variable.
-
- You may have also noticed that the word "Hello" was missing in the last two messages. Let's fix
- that now. Modify the lines that print the message to the following:
-
- ```csharp
- Console.WriteLine("Hello " + aFriend);
- ```
-
- Select **Run** again to see the results.
-
- You've been using `+` to build strings from **variables** and **constant** strings. There's a better way.
- You can place a variable between `{` and `}` characters to tell C# to replace that text with the value of the variable.
-
- This is called [String interpolation](../../language-reference/tokens/interpolated.md).
-
- If you add a `$` before the opening quote of the string, you can then include variables, like `aFriend`, inside the string between curly braces. Give it a try:
-
-
- ```csharp
- Console.WriteLine($"Hello {aFriend}");
- ```
-
- Select **Run** again to see the results. Instead of "Hello {aFriend}", the message should be "Hello Maira".
-
-- title: Work with strings
- durationInMinutes: 5
- content: |
- Your last edit was our first look at what you can do with strings. Let's explore more.
-
- You're not limited to a single variable between the curly braces. Try this:
-
- ```csharp
- string firstFriend = "Maria";
- string secondFriend = "Sage";
- Console.WriteLine($"My friends are {firstFriend} and {secondFriend}");
- ```
-
- As you explore more with strings, you'll find that strings are more than a collection of letters. You can find the length of a string using `Length`. `Length` is a **property** of a string and it returns the number of characters in that string. Add the following code at the bottom of the interactive window:
-
- ```csharp
- Console.WriteLine($"The name {firstFriend} has {firstFriend.Length} letters.");
- Console.WriteLine($"The name {secondFriend} has {secondFriend.Length} letters.");
- ```
-
- > [!TIP]
- > This is a good time to explore on your own. You've learned that `Console.WriteLine()`
- > writes text to the screen. You've learned how to declare variables and
- > concatenate strings together. Experiment in the interactive window. The window has a feature called *IntelliSense* that
- > makes suggestions for what you can do. Type a `.` after the `d` in `firstFriend`. You'll see a list of suggestions for properties
- > and methods you can use.
-
-- title: Do more with strings
- durationInMinutes: 5
- content: |
- You've been using a *method*, , to print messages. A *method* is a block of code that implements some action. It has a name, so you can access it.
-
- ## Trim
-
- Suppose your strings have leading or trailing spaces that you don't want to display. You want to **trim** the spaces from the strings.
- The method and related methods and do that work. You can just use those methods to remove leading and trailing spaces. Try the following code:
-
- ```csharp
- string greeting = " Hello World! ";
- Console.WriteLine($"[{greeting}]");
-
- string trimmedGreeting = greeting.TrimStart();
- Console.WriteLine($"[{trimmedGreeting}]");
-
- trimmedGreeting = greeting.TrimEnd();
- Console.WriteLine($"[{trimmedGreeting}]");
-
- trimmedGreeting = greeting.Trim();
- Console.WriteLine($"[{trimmedGreeting}]");
- ```
-
- The square brackets `[` and `]` help visualize what the `Trim`, `TrimStart` and `TrimEnd` methods do. The brackets show where whitespace starts and ends.
-
- This sample reinforces a couple of important concepts for working with strings. The methods that manipulate strings return new string objects rather than making modifications in place. You can see that each call to any of the `Trim` methods returns a new string but doesn't change the original message.
-
- ## Replace
-
- There are other methods available to work with a string. For example, you've probably used a search and replace command in an editor or word processor before. The method does something similar in a string. It searches for a substring and replaces it with different text. The method takes two **parameters**. These are the strings between the parentheses. The first string is the text to search for. The second string is the text to replace it with. Try it for yourself. Add this code. Type it in to see the hints as you start typing `.Re` after the `sayHello` variable:
-
- ```csharp
- string sayHello = "Hello World!";
- Console.WriteLine(sayHello);
- sayHello = sayHello.Replace("Hello", "Greetings");
- Console.WriteLine(sayHello);
- ```
-
- Two other useful methods make a string ALL CAPS or all lower case. Try the following code. Type it in to see how **IntelliSense** provides hints as you start to type `To`:
-
- ```csharp
- Console.WriteLine(sayHello.ToUpper());
- Console.WriteLine(sayHello.ToLower());
- ```
-
-- title: Search strings
- durationInMinutes: 10
- content: |
- The other part of a *search and replace* operation is to find text in a
- string. You can use the method for searching. It
- tells you if a string contains a substring inside it. Try the following
- code to explore :
-
- ```csharp
- string songLyrics = "You say goodbye, and I say hello";
- Console.WriteLine(songLyrics.Contains("goodbye"));
- Console.WriteLine(songLyrics.Contains("greetings"));
- ```
-
- The method returns a *boolean* value which tells you if the
- string you were searching for was found. A *boolean* stores either a `true` or a
- `false` value. When displayed as text output, they are capitalized: `True` and `False`, respectively. You'll learn more about *boolean* values
- in a later lesson.
-
- ***Challenge***
-
- There are two similar methods, and that also search for sub-strings in a string. These find a substring at the beginning or the
- end of the string. Try to modify the previous sample to use and
- instead of . Search for "You" or "goodbye" at the beginning of a string. Search for "hello" or "goodbye" at the end of a string.
-
- > [!NOTE]
- > Watch your punctuation when you test for the text at the end of the string. If the string
- > ends with a period, you must check for a string that ends with a period.
-
- You should get `true` for starting with "You" and ending with "hello" and `false` for starting with or ending with "goodbye".
-
-- title: Complete challenge
- durationInMinutes: 3
- content: |
- Did you come up with something like this?
-
- ```csharp
- string songLyrics = "You say goodbye, and I say hello";
- Console.WriteLine(songLyrics.StartsWith("You"));
- Console.WriteLine(songLyrics.StartsWith("goodbye"));
-
- Console.WriteLine(songLyrics.EndsWith("hello"));
- Console.WriteLine(songLyrics.EndsWith("goodbye"));
- ```
-
-- content: |
- You've completed the "Hello C#" introduction to C# tutorial. You can select the **Numbers in C#** link below to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
-
- For further reading on the `string` type:
- - [C# programming guide article on strings](../../programming-guide/strings/index.md).
- - [How to tips on working with strings](../../how-to/index.md#working-with-strings).
diff --git a/docs/csharp/tour-of-csharp/tutorials/index.md b/docs/csharp/tour-of-csharp/tutorials/index.md
index 0b8d5ee5e7800..b766bd1c5d82d 100644
--- a/docs/csharp/tour-of-csharp/tutorials/index.md
+++ b/docs/csharp/tour-of-csharp/tutorials/index.md
@@ -1,67 +1,46 @@
---
title: Interactive tutorials
description: Learn C# in your browser, and get started with your own development environment
-ms.date: 03/15/2024
-ms.custom: mvc
+ms.date: 03/07/2025
---
# Introduction to C\#
-Welcome to the introduction to C# tutorials. These lessons start with interactive code
-that you can run in your browser. You can learn the basics of C# from the
-[C# for Beginners video series](https://aka.ms/dotnet/beginnervideos/youtube/csharp) before starting these interactive lessons.
+Welcome to the introduction to C# tutorials. These lessons start with interactive code that you can run in your browser. You can learn the basics of C# from the [C# for Beginners video series](https://aka.ms/dotnet/beginnervideos/youtube/csharp) before starting these interactive lessons.
> [!VIDEO https://www.youtube.com/embed/9THmGiSPjBQ?si=3kUKFtOMLpEzeq7J]
-The first lessons explain C# concepts using small snippets of code. You'll
-learn the basics of C# syntax and how to work with data types like strings,
-numbers, and booleans. It's all interactive, and you'll be writing and running code
-within minutes. These first lessons assume no prior knowledge of
-programming or the C# language.
+The first lessons explain C# concepts using small snippets of code. You'll learn the basics of C# syntax and how to work with data types like strings, numbers, and booleans. It's all interactive, and you'll be writing and running code within minutes. These first lessons assume no prior knowledge of programming or the C# language.
You can try these tutorials in different environments. The concepts you'll learn are the same. The difference is which experience you prefer:
-- [In your browser, on the docs platform](hello-world.yml): This experience embeds a runnable C# code window in docs pages. You write and execute C# code in the browser.
+- [In your browser, on the docs platform](hello-world.md): This experience embeds a runnable C# code window in docs pages. You write and execute C# code in the browser.
- [In the Microsoft Learn training experience](/training/paths/csharp-first-steps/). This learning path contains several modules that teach the basics of C#.
-- [On your local machine](numbers-in-csharp-local.md). After you've explored online, you can [download the .NET SDK and build programs on your machine](local-environment.md).
-All the introductory tutorials following the Hello World lesson are available using
-the online browser experience or [in your own local development
-environment](local-environment.md). At the end of each tutorial, you decide if you want to continue
-with the next lesson online or on your own machine. There are links
-to help you set up your environment and continue with the next tutorial
-on your machine.
+## [Hello world](hello-world.md)
-## [Hello world](hello-world.yml)
+In the [Hello world](hello-world.md) tutorial, you'll create the most basic C# program. You'll explore the `string` type and how to work with text. You can also use the path on [Microsoft Learn training](/training/paths/csharp-first-steps/).
-In the [Hello world](hello-world.yml) tutorial, you'll create the most basic
-C# program. You'll explore the `string` type and how to work with text. You can also use the path on [Microsoft Learn training](/training/paths/csharp-first-steps/).
+## [Numbers in C#](numbers-in-csharp.md)
-## [Numbers in C#](numbers-in-csharp.yml)
+In the [Numbers in C#](numbers-in-csharp.md) tutorial, you'll learn how computers store numbers and how to perform calculations with different numeric types. You'll learn the basics of rounding, and how to perform mathematical calculations using C#.
-In the [Numbers in C#](numbers-in-csharp.yml) tutorial, you'll learn
-how computers store numbers and how to perform calculations with different
-numeric types. You'll learn the basics of rounding, and how to perform
-mathematical calculations using C#. This tutorial is also available
-[to run locally on your machine](numbers-in-csharp-local.md).
+This tutorial assumes that you've finished the [Hello world](hello-world.md) lesson.
-This tutorial assumes that you've finished the [Hello world](hello-world.yml) lesson.
+## [Branches and loops](branches-and-loops.md)
-## [Branches and loops](branches-and-loops.yml)
+The [Branches and loops](branches-and-loops.md) tutorial teaches the basics of selecting different paths of code execution based on the values stored in variables. You'll learn the basics of control flow, which is the basis of how programs make decisions and choose different actions.
-The [Branches and loops](branches-and-loops.yml) tutorial teaches the basics of selecting
-different paths of code execution based on the values stored in variables. You'll learn the
-basics of control flow, which is the basis of how programs make decisions and choose
-different actions. This tutorial is also available
-[to run locally on your machine](branches-and-loops-local.md).
+This tutorial assumes that you've finished the [Hello world](hello-world.md) and [Numbers in C#](numbers-in-csharp.md) lessons.
-This tutorial assumes that you've finished the [Hello world](hello-world.yml) and
-[Numbers in C#](numbers-in-csharp.yml) lessons.
+## [List collection](list-collection.md)
-## [List collection](list-collection.yml)
-
-The [List collection](list-collection.yml) lesson gives you
-a tour of the List collection type that stores sequences of data. You'll learn how to add and remove items, search for items, and sort the lists. You'll explore different kinds of lists. This tutorial is also
-available [to run locally on your machine](arrays-and-collections.md).
+The [List collection](list-collection.md) lesson gives you a tour of the List collection type that stores sequences of data. You'll learn how to add and remove items, search for items, and sort the lists. You'll explore different kinds of lists.
This tutorial assumes that you've finished the lessons listed above.
+
+## Set up your local environment
+
+After you finish these tutorials, set up a development environment.
+
+[!INCLUDE [Prerequisites](../../includes/prerequisites.md)]
diff --git a/docs/csharp/tour-of-csharp/tutorials/list-collection.md b/docs/csharp/tour-of-csharp/tutorials/list-collection.md
new file mode 100644
index 0000000000000..a059d6ea1fa39
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/list-collection.md
@@ -0,0 +1,96 @@
+---
+title: Data collections - Introductory interactive tutorial
+description: In this tutorial, you use your browser to learn about C# collections. You write C# code and see the results of compiling and running your code directly in the browser.
+ms.date: 03/07/2025
+---
+# Learn to manage data collections using List\ in C\#
+
+This introductory tutorial provides an introduction to the C# language and the basics of the class.
+
+This tutorial teaches you C# interactively, using your browser to write C# code and see the results of compiling and running your code. It contains a series of lessons that create, modify, and explore collections and arrays. You work primarily with the class.
+
+## A basic list example
+
+> [!TIP]
+>
+> When a code snippet block includes the "Run" button, that button opens the interactive window, or replaces the existing code in the interactive window. When the snippet doesn't include a "Run" button, you can copy the code and add it to the current interactive window.
+
+Run the following code in the interactive window. Replace `` with your name and select **Run**:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/ListCollection/Program.cs" id="BasicList":::
+
+You created a list of strings, added three names to that list, and printed the names in all CAPS. You're using concepts that you learned in earlier tutorials to loop through the list.
+
+The code to display names makes use of the [string interpolation](../../language-reference/tokens/interpolated.md) feature. When you precede a `string` with the `$` character, you can embed C# code in the string declaration. The actual string replaces that C# code with the value it generates. In this example, it replaces the `{name.ToUpper()}` with each name, converted to capital letters, because you called the method.
+
+Let's keep exploring.
+
+## Modify list contents
+
+The collection you created uses the type. This type stores sequences of elements. You specify the type of the elements between the angle brackets.
+
+One important aspect of this type is that it can grow or shrink, enabling you to add or remove elements. You can see the results by modifying the contents after you displayed its contents. Add the following code after the code you already wrote (the loop that prints the contents):
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="ModifyList":::
+
+You added two more names to the end of the list. You also removed one as well. The output from this block of code shows the initial contents, then prints a blank line and the new contents.
+
+The enables you to reference individual items by **index** as well. You access items using the `[` and `]` tokens. Add the following code after what you already wrote and try it:
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="Indexers":::
+
+You're not allowed to access past the end of the list. You can check how long the list is using the property. Add the following code:
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="Property":::
+
+Select **Run** again to see the results. In C#, indices start at 0, so the largest valid index is one less than the number of items in the list.
+
+## Search and sort lists
+
+Our samples use relatively small lists, but your applications might often create lists with many more elements, sometimes numbering in the thousands. To find elements in these larger collections, you need to search the list for different items. The method searches for an item and returns the index of the item. If the item isn't in the list, `IndexOf` returns `-1`. Try it to see how it works. Add the following code after what you wrote so far:
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="Search":::
+
+You might not know if an item is in the list, so you should always check the index returned by . If it's `-1`, the item wasn't found.
+
+The items in your list can be sorted as well. The method sorts all the items in the list in their normal order (alphabetically for strings). Add this code and run again:
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="Sort":::
+
+## Lists of other types
+
+You've been using the `string` type in lists so far. Let's make a using a different type. Let's build a set of numbers. Delete the code you wrote so far, and replace it with the following code:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/ListCollection/Program.cs" id="CreateList":::
+
+That creates a list of integers, and sets the first two integers to the value 1. The *Fibonacci Sequence*, a sequence of numbers, starts with two 1's. Each next Fibonacci number is found by taking the sum of the previous two numbers. Add this code:
+
+:::code language="csharp" source="./snippets/ListCollection/Program.cs" id="Fibonacci":::
+
+Press **Run** to see the results;
+
+## Challenge
+
+See if you can put together some of the concepts from this and earlier lessons. Expand on what you built so far with Fibonacci Numbers. Try to write the code to generate the first 20 numbers in the sequence. (As a hint, the 20th Fibonacci number is 6765.)
+
+Did you come up with something like this?
+
+
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/ListCollection/Program.cs" id="Answer":::
+
+With each iteration of the loop, you're taking the last two integers in the list, summing them, and adding that value to the list. The loop repeats until you added 20 items to the list.
+
+
+
+You completed the list interactive tutorial, the final introduction to C# interactive tutorial. You can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
+
+You can learn more about [.NET collections](../../../standard/collections/index.md) in the following articles:
+
+- [Selecting a collection type](../../../standard/collections/selecting-a-collection-class.md)
+- [Commonly used collection types](../../../standard/collections/commonly-used-collection-types.md)
+- [When to use generic collections](../../../standard/collections/when-to-use-generic-collections.md)
+
+Congratulations, you completed the list tutorial. You can continue with [more](../../fundamentals/tutorials/classes.md) tutorials in your own development environment.
+
+You can learn more about working with the `List` type in the .NET fundamentals article on [collections](../../../standard/collections/index.md). You also learn about many other collection types.
diff --git a/docs/csharp/tour-of-csharp/tutorials/list-collection.yml b/docs/csharp/tour-of-csharp/tutorials/list-collection.yml
deleted file mode 100644
index 56cc03a25031e..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/list-collection.yml
+++ /dev/null
@@ -1,163 +0,0 @@
-### YamlMime:Tutorial
-title: Learn to manage data collections using the generic list type
-metadata:
- title: Data collections - Introductory interactive tutorial
- description: In this tutorial, you'll use your browser to learn C# interactively. You write C# code and see the results of compiling and running your code directly in the browser.
- audience: Developer
- ms.custom: mvc
- ms.topic: interactive-tutorial
- ms.date: 03/23/2022
- level: Beginner
- displayType: two-column
- interactive: csharp
-items:
-- durationInMinutes: 1
- content: |
- This tutorial teaches you C# interactively, using your browser to write C# code and see the results of compiling and running your code. It contains a series of lessons that create, modify, and explore collections and arrays.
-
- > [!TIP]
- > To paste a code snippet inside the **focus mode** you should use your keyboard shortcut (Ctrl + v, or cmd + v).
-- title: Create lists
- durationInMinutes: 2
- content: |
- Run the following code in the interactive window. Select the **Enter focus mode** button. Then, type the following code block in the interactive window (replace `` with your name) and select **Run**:
-
- ```csharp
- var names = new List { "", "Ana", "Felipe" };
- foreach (var name in names)
- {
- Console.WriteLine($"Hello {name.ToUpper()}!");
- }
- ```
-
- If you are running this on your environment, you should follow the instructions for the [local version](arrays-and-collections.md) instead.
-
- You've created a list of strings, added three names to that list, and printed out the names in all CAPS. You're using concepts
- that you've learned in earlier tutorials to loop through the list.
-
- The code to display names makes use of the [string interpolation](../../language-reference/tokens/interpolated.md) feature. When you precede a `string` with the `$` character, you can embed C# code in the string declaration. The actual string replaces that C# code with the value it generates. In this example, it replaces the `{name.ToUpper()}` with each name, converted to capital letters, because you called the method.
-
- Let's keep exploring.
-
-- title: Modify list contents
- durationInMinutes: 3
- content: |
- The collection you created uses the type. This type stores sequences of elements. You specify the type of the elements between the angle brackets.
-
- One important aspect of this type is that it can grow or shrink, enabling you to add or remove elements. You can see the results by modifying the contents after you've displayed its contents. Add the following code below the code you've already written (below the loop that prints the contents):
-
- ```csharp
- Console.WriteLine();
- names.Add("Maria");
- names.Add("Bill");
- names.Remove("Ana");
- foreach (var name in names)
- {
- Console.WriteLine($"Hello {name.ToUpper()}!");
- }
- ```
-
- You've added two more names to the end of the list. You've also removed one as well. The output from this block of code shows the initial contents, then prints a blank line and the new contents.
-
- The enables you to reference individual items by **index** as well. You access items using the `[` and `]` tokens. Add the following code below what you've already written and try it:
-
- ```csharp
- Console.WriteLine($"My name is {names[0]}.");
- Console.WriteLine($"I've added {names[2]} and {names[3]} to the list.");
- ```
-
- You're not allowed to access past the end of the list. You can check how long the list is using the property. Add the following code to try it:
-
- ```csharp
- Console.WriteLine($"The list has {names.Count} people in it");
- ```
-
- Select **Run** again to see the results. In C#, indices start at 0, so the largest valid index is one less than the number of items in the list.
-
-- title: Search and sort lists
- durationInMinutes: 5
- content: |
- Our samples use relatively small lists, but your applications may often create lists with many more elements, sometimes numbering in the thousands. To find elements in these larger collections, you need to search the list for different items. The method searches for an item and returns the index of the item. If the item isn't in the list, `IndexOf` returns `-1`. Try it to see how it works. Add the following code below what you've written so far:
-
- ```csharp
- var index = names.IndexOf("Felipe");
- if (index != -1)
- {
- Console.WriteLine($"The name {names[index]} is at index {index}");
- }
- var notFound = names.IndexOf("Not Found");
- Console.WriteLine($"When an item is not found, IndexOf returns {notFound}");
- ```
-
- You may not know if an item is in the list, so you should always check the index returned by . If it is `-1`, the item was not found.
-
- The items in your list can be sorted as well. The method sorts all the items in the list in their normal order (alphabetically for strings). Add this code and run again:
-
- ```csharp
- names.Sort();
- foreach (var name in names)
- {
- Console.WriteLine($"Hello {name.ToUpper()}!");
- }
- ```
-
-- title: Lists of other types
- durationInMinutes: 5
- content: |
- You've been using the `string` type in lists so far. Let's make a using a different type. Let's build a set of numbers. Delete the code you wrote so far, and replace it with the following code:
-
- ```csharp
- var fibonacciNumbers = new List {1, 1};
- ```
-
- That creates a list of integers, and sets the first two integers to the value 1. The *Fibonacci Sequence*, a sequence of numbers, starts with two 1s. Each next Fibonacci number is found by taking the sum of the previous two numbers. Add this code:
-
- ```csharp
- var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
- var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
-
- fibonacciNumbers.Add(previous + previous2);
-
- foreach(var item in fibonacciNumbers)
- {
- Console.WriteLine(item);
- }
- ```
-
- Press **Run** to see the results;
-
-- title: Challenge
- durationInMinutes: 10
- content: |
- See if you can put together some of the concepts from this and earlier lessons. Expand on what you've built so far with Fibonacci Numbers. Try and write the code to generate the first 20 numbers in the sequence. (As a hint, the 20th Fibonacci number is 6765.)
-
-- title: Complete challenge
- durationInMinutes: 3
- content: |
- Did you come up with something like this?
-
- ```csharp
- var fibonacciNumbers = new List {1, 1};
-
- while (fibonacciNumbers.Count < 20)
- {
- var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
- var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
-
- fibonacciNumbers.Add(previous + previous2);
- }
- foreach(var item in fibonacciNumbers)
- {
- Console.WriteLine(item);
- }
- ```
-
- With each iteration of the loop, you're taking the last two integers in the list, summing them, and adding that value to the list. The loop repeats until you've added 20 items to the list.
-
-- content: |
- You've completed the list interactive tutorial. That's the final introduction to C# interactive tutorial. You can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
-
- You can learn more about [.NET collections](../../../standard/collections/index.md) in the following articles:
- - [Selecting a collection type](../../../standard/collections/selecting-a-collection-class.md)
- - [Commonly used collection types](../../../standard/collections/commonly-used-collection-types.md)
- - [When to use generic collections](../../../standard/collections/when-to-use-generic-collections.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/local-environment.md b/docs/csharp/tour-of-csharp/tutorials/local-environment.md
deleted file mode 100644
index 7207f5e9c5bc2..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/local-environment.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-title: Become familiar with the development tools
-description: This article provides a basic introduction to the tools you'll use to develop C# and .NET Applications on your machine.
-ms.date: 02/02/2021
----
-# Set up your local environment
-
-The first step in running a tutorial on your machine is to set up a development environment.
-
-[!INCLUDE [Prerequisites](../../includes/prerequisites.md)]
-
-## Basic application development flow
-
-The instructions in these tutorials assume that you're using the .NET CLI to create, build, and run applications. You'll use the following commands:
-
-* [`dotnet new`](../../../core/tools/dotnet-new.md) creates an application. This command generates the files and assets necessary for your application. The introduction to C# tutorials all use the `console` application type. Once you've got the basics, you can expand to other application types.
-* [`dotnet build`](../../../core/tools/dotnet-build.md) builds the executable.
-* [`dotnet run`](../../../core/tools/dotnet-run.md) runs the executable.
-
-If you use Visual Studio 2019 for these tutorials, you'll choose a Visual Studio menu selection when a tutorial directs you to run one of these CLI commands:
-
-* **File** > **New** > **Project** creates an application.
- * The `Console Application` project template is recommended.
- * You will be given the option to specify a target framework. The tutorials below work best when targeting .NET 5 or higher.
-* **Build** > **Build Solution** builds the executable.
-* **Debug** > **Start Without Debugging** runs the executable.
-
-## Pick your tutorial
-
-You can start with any of the following tutorials:
-
-## Numbers in C\#
-
-In the [Numbers in C#](numbers-in-csharp-local.md) tutorial, you'll learn
-how computers store numbers and how to perform calculations with different
-numeric types. You'll learn the basics of rounding and how to perform
-mathematical calculations using C#.
-
-This tutorial assumes that you have finished the [Hello world](hello-world.yml) lesson.
-
-## Branches and loops
-
-The [Branches and loops](branches-and-loops-local.md) tutorial teaches the basics of selecting
-different paths of code execution based on the values stored in variables. You'll learn the
-basics of control flow, which is the basis of how programs make decisions and choose
-different actions.
-
-This tutorial assumes that you have finished the [Hello world](hello-world.yml) and
-[Numbers in C#](numbers-in-csharp-local.md) lessons.
-
-## List collection
-
-The [List collection](arrays-and-collections.md) lesson gives you a tour of the List collection type that stores sequences of data. You'll learn how to add and remove items, search for items, and sort the lists. You'll explore different kinds of lists.
-
-This tutorial assumes that you have finished the lessons listed above.
diff --git a/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp-local.md b/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp-local.md
deleted file mode 100644
index 8c9f886f34ab1..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp-local.md
+++ /dev/null
@@ -1,317 +0,0 @@
----
-title: Work with Numbers - Introductory tutorial
-description: Learn C# by exploring numeric types, their uses, properties, and methods.
-ms.date: 03/23/2022
----
-
-# How to use integer and floating point numbers in C\#
-
-This tutorial teaches you about the numeric types in C#. You'll write small amounts of code, then you'll compile and run that code. The tutorial contains a series of lessons that explore numbers and math operations in C#. These lessons teach you the fundamentals of the C# language.
-
-> [!TIP]
-> To paste a code snippet inside the **focus mode** you should use your keyboard shortcut (Ctrl + v, or cmd + v).
-
-## Prerequisites
-
-The tutorial expects that you have a machine set up for local development. See [Set up your local environment](local-environment.md) for installation instructions and an overview of application development in .NET.
-
-If you don't want to set up a local environment, see the [interactive-in-browser version of this tutorial](numbers-in-csharp.yml).
-
-## Explore integer math
-
-Create a directory named *numbers-quickstart*. Make it the current directory and run the following command:
-
-```dotnetcli
-dotnet new console -n NumbersInCSharp -o .
-```
-
-[!INCLUDE [csharp10-templates](../../../../includes/csharp10-templates.md)]
-
-Open *Program.cs* in your favorite editor, and replace the contents of the file with the following code:
-
-```csharp
-int a = 18;
-int b = 6;
-int c = a + b;
-Console.WriteLine(c);
-```
-
-Run this code by typing `dotnet run` in your command window.
-
-You've seen one of the fundamental math operations with integers. The `int` type represents an **integer**, a zero, positive, or negative whole number. You use the `+` symbol for addition. Other common mathematical operations for integers include:
-
-- `-` for subtraction
-- `*` for multiplication
-- `/` for division
-
-Start by exploring those different operations. Add these lines after the line that writes the value of `c`:
-
-```csharp
-// subtraction
-c = a - b;
-Console.WriteLine(c);
-
-// multiplication
-c = a * b;
-Console.WriteLine(c);
-
-// division
-c = a / b;
-Console.WriteLine(c);
-```
-
-Run this code by typing `dotnet run` in your command window.
-
-You can also experiment by writing multiple mathematics operations in the same line, if you'd like. Try `c = a + b - 12 * 17;` for example. Mixing variables and constant numbers is allowed.
-
-> [!TIP]
-> As you explore C# (or any programming language), you'll make mistakes when you write code. The **compiler** will find those errors and report them to you. When the output contains error messages, look closely at the example code and the code in your window to see what to fix. That exercise will help you learn the structure of C# code.
-
-You've finished the first step. Before you start the next section, let's move the current code into a separate *method*. A method is a series of statements grouped together and given a name. You call a method by writing the method's name followed by `()`. Organizing your code into methods makes it easier to start working with a new example. When you finish, your code should look like this:
-
-```csharp
-WorkWithIntegers();
-
-void WorkWithIntegers()
-{
- int a = 18;
- int b = 6;
- int c = a + b;
- Console.WriteLine(c);
-
-
- // subtraction
- c = a - b;
- Console.WriteLine(c);
-
- // multiplication
- c = a * b;
- Console.WriteLine(c);
-
- // division
- c = a / b;
- Console.WriteLine(c);
-}
-```
-
-The line `WorkWithIntegers();` invokes the method. The following code declares the method and defines it.
-
-## Explore order of operations
-
-Comment out the call to `WorkingWithIntegers()`. It will make the output less cluttered as you work in this section:
-
-```csharp
-//WorkWithIntegers();
-```
-
-The `//` starts a **comment** in C#. Comments are any text you want to keep in your source code but not execute as code. The compiler doesn't generate any executable code from comments. Because `WorkWithIntegers()` is a method, you need to only comment out one line.
-
-The C# language defines the precedence of different mathematics operations with rules consistent with the rules you learned in mathematics. Multiplication and division take precedence over addition and subtraction. Explore that by adding the following code after the call to `WorkWithIntegers()`, and executing `dotnet run`:
-
-```csharp
-int a = 5;
-int b = 4;
-int c = 2;
-int d = a + b * c;
-Console.WriteLine(d);
- ```
-
-The output demonstrates that the multiplication is performed before the addition.
-
-You can force a different order of operation by adding parentheses around the operation or operations you want performed first. Add the following lines and run again:
-
-```csharp
-d = (a + b) * c;
-Console.WriteLine(d);
-```
-
-Explore more by combining many different operations. Add something like the following lines. Try `dotnet run` again.
-
-```csharp
-d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
-Console.WriteLine(d);
-```
-
-You may have noticed an interesting behavior for integers. Integer division always produces an integer result, even when you'd expect the result to include a decimal or fractional portion.
-
-If you haven't seen this behavior, try the following code:
-
-```csharp
-int e = 7;
-int f = 4;
-int g = 3;
-int h = (e + f) / g;
-Console.WriteLine(h);
-```
-
-Type `dotnet run` again to see the results.
-
-Before moving on, let's take all the code you've written in this section and put it in a new method. Call that new method `OrderPrecedence`. Your code should look something like this:
-
-```csharp
-// WorkWithIntegers();
-OrderPrecedence();
-
-void WorkWithIntegers()
-{
- int a = 18;
- int b = 6;
- int c = a + b;
- Console.WriteLine(c);
-
-
- // subtraction
- c = a - b;
- Console.WriteLine(c);
-
- // multiplication
- c = a * b;
- Console.WriteLine(c);
-
- // division
- c = a / b;
- Console.WriteLine(c);
-}
-
-void OrderPrecedence()
-{
- int a = 5;
- int b = 4;
- int c = 2;
- int d = a + b * c;
- Console.WriteLine(d);
-
- d = (a + b) * c;
- Console.WriteLine(d);
-
- d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
- Console.WriteLine(d);
-
- int e = 7;
- int f = 4;
- int g = 3;
- int h = (e + f) / g;
- Console.WriteLine(h);
-}
-```
-
-## Explore integer precision and limits
-
-That last sample showed you that integer division truncates the result. You can get the **remainder** by using the **modulo** operator, the `%` character. Try the following code after the method call to `OrderPrecedence()`:
-
-```csharp
-int a = 7;
-int b = 4;
-int c = 3;
-int d = (a + b) / c;
-int e = (a + b) % c;
-Console.WriteLine($"quotient: {d}");
-Console.WriteLine($"remainder: {e}");
-```
-
-The C# integer type differs from mathematical integers in one other way: the `int` type has minimum and maximum limits. Add this code to see those limits:
-
-```csharp
-int max = int.MaxValue;
-int min = int.MinValue;
-Console.WriteLine($"The range of integers is {min} to {max}");
-```
-
-If a calculation produces a value that exceeds those limits, you have an **underflow** or **overflow** condition. The answer appears to wrap from one limit to the other. Add these two lines to see an example:
-
-```csharp
-int what = max + 3;
-Console.WriteLine($"An example of overflow: {what}");
-```
-
-Notice that the answer is very close to the minimum (negative) integer. It's the same as `min + 2`. The addition operation **overflowed** the allowed values for integers. The answer is a very large negative number because an overflow "wraps around" from the largest possible integer value to the smallest.
-
-There are other numeric types with different limits and precision that you would use when the `int` type doesn't meet your needs. Let's explore those other types next. Before you start the next section, move the code you wrote in this section into a separate method. Name it `TestLimits`.
-
-## Work with the double type
-
-The `double` numeric type represents a double-precision floating point number. Those terms may be new to you. A **floating point** number is useful to represent non-integral numbers that may be very large or small in magnitude. **Double-precision** is a relative term that describes the number of binary digits used to store the value. **Double precision** numbers have twice the number of binary digits as **single-precision**. On modern computers, it's more common to use double precision than single precision numbers. **Single precision** numbers are declared using the `float` keyword. Let's explore. Add the following code and see the result:
-
-```csharp
-double a = 5;
-double b = 4;
-double c = 2;
-double d = (a + b) / c;
-Console.WriteLine(d);
-```
-
-Notice that the answer includes the decimal portion of the quotient. Try a slightly more complicated expression with doubles:
-
-```csharp
-double e = 19;
-double f = 23;
-double g = 8;
-double h = (e + f) / g;
-Console.WriteLine(h);
-```
-
-The range of a double value is much greater than integer values. Try the following code below what you've written so far:
-
-```csharp
-double max = double.MaxValue;
-double min = double.MinValue;
-Console.WriteLine($"The range of double is {min} to {max}");
-```
-
-These values are printed in scientific notation. The number to the left of the `E` is the significand. The number to the right is the exponent, as a power of 10. Just like decimal numbers in math, doubles in C# can have rounding errors. Try this code:
-
-```csharp
-double third = 1.0 / 3.0;
-Console.WriteLine(third);
-```
-
-You know that `0.3` repeating finite number of times isn't exactly the same as `1/3`.
-
-***Challenge***
-
-Try other calculations with large numbers, small numbers, multiplication, and division using the `double` type. Try more complicated calculations. After you've spent some time with the challenge, take the code you've written and place it in a new method. Name that new method `WorkWithDoubles`.
-
-## Work with decimal types
-
-You've seen the basic numeric types in C#: integers and doubles. There's one other type to learn: the `decimal` type. The `decimal` type has a smaller range but greater precision than `double`. Let's take a look:
-
-```csharp
-decimal min = decimal.MinValue;
-decimal max = decimal.MaxValue;
-Console.WriteLine($"The range of the decimal type is {min} to {max}");
-```
-
-Notice that the range is smaller than the `double` type. You can see the greater precision with the decimal type by trying the following code:
-
-```csharp
-double a = 1.0;
-double b = 3.0;
-Console.WriteLine(a / b);
-
-decimal c = 1.0M;
-decimal d = 3.0M;
-Console.WriteLine(c / d);
-```
-
-The `M` suffix on the numbers is how you indicate that a constant should use the `decimal` type. Otherwise, the compiler assumes the `double` type.
-
-> [!NOTE]
-> The letter `M` was chosen as the most visually distinct letter between the `double` and `decimal` keywords.
-
-Notice that the math using the decimal type has more digits to the right of the decimal point.
-
-***Challenge***
-
-Now that you've seen the different numeric types, write code that calculates the area of a circle whose radius is 2.50 centimeters. Remember that the area of a circle is the radius squared multiplied by PI. One hint: .NET contains a constant for PI, that you can use for that value. , like all constants declared in the `System.Math` namespace, is a `double` value. For that reason, you should use `double` instead of `decimal` values for this challenge.
-
-You should get an answer between 19 and 20. You can check your answer by [looking at the finished sample code on GitHub](https://github.com/dotnet/samples/tree/main/csharp/numbers-quickstart/Program.cs#L9-L11).
-
-Try some other formulas if you'd like.
-
-You've completed the "Numbers in C#" quickstart. You can continue with the [Branches and loops](branches-and-loops-local.md) quickstart in your own development environment.
-
-You can learn more about numbers in C# in the following articles:
-
-- [Integral numeric types](../../language-reference/builtin-types/integral-numeric-types.md)
-- [Floating-point numeric types](../../language-reference/builtin-types/floating-point-numeric-types.md)
-- [Built-in numeric conversions](../../language-reference/builtin-types/numeric-conversions.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.md b/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.md
new file mode 100644
index 0000000000000..8146a44713e8c
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.md
@@ -0,0 +1,143 @@
+---
+title: Work with Numbers - Introductory interactive tutorial
+description: In this tutorial about numeric types, you use your browser to learn C# interactively. You're going to write C# code and see the results of compiling and running your code directly in the browser.
+ms.date: 03/06/2025
+---
+# How to use integer and floating point numbers in C\#
+
+This tutorial teaches you about the numeric types in C#. You write small amounts of code, then you compile and run that code. The tutorial contains a series of lessons that explore numbers and math operations in C#. These lessons teach you the fundamentals of the C# language.
+
+> [!TIP]
+>
+> When a code snippet block includes the "Run" button, that button opens the interactive window, or replaces the existing code in the interactive window. When the snippet doesn't include a "Run" button, you can copy the code and add it to the current interactive window.
+
+## Explore integer math
+
+Run the following code in the interactive window.
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="Addition":::
+
+The preceding code demonstrates fundamental math operations with integers. The `int` type represents an **integer**, a positive or negative whole number. You use the `+` symbol for addition. Other common mathematical operations for integers include:
+
+- `-` for subtraction
+- `*` for multiplication
+- `/` for division
+
+Start by exploring those different operations. Modify the third line to try each of these operations. For example, to try subtraction, replace the `+` with a `-` as shown in the following line:
+
+```csharp
+int c = a - b;
+```
+
+Try it. Select the "Run" button. Then, try multiplication, `*` and, division, `/`. You can also experiment by writing multiple mathematics operations in the same line, if you'd like.
+
+> [!TIP]
+>
+> As you explore C# (or any programming language), you make mistakes when you write code. The **compiler** finds those errors and report them to you. When the output contains error messages, look closely at the example code, and the code in the interactive window to see what to fix. That exercise helps you learn the structure of C# code.
+
+## Explore order of operations
+
+The C# language defines the precedence of different mathematics operations with rules consistent with the rules you learned in mathematics. Multiplication and division take precedence over addition and subtraction. Explore that by running the following code in the interactive window:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="Precedence":::
+
+The output demonstrates that the multiplication is performed before the addition.
+
+You can force a different order of operation by adding parentheses around the operation or operations you want performed first. Add the following lines to the interactive window:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="Parentheses":::
+
+Explore more by combining many different operations. Replace the fourth line in the preceding code with something like this:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="CompoundExpression":::
+
+You might notice an interesting behavior for integers. Integer division always produces an integer result, even when you'd expect the result to include a decimal or fractional portion.
+
+Try the following code:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="Truncation":::
+
+## Explore integer precision and limits
+
+That last sample showed you that integer division truncates the result. You can get the **remainder** by using the **remainder** operator, the `%` character:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="QuotientAndRemainder":::
+
+The C# integer type differs from mathematical integers in one other way: the `int` type has minimum and maximum limits. Try the following code to see those limits:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="MinAndMax":::
+
+If a calculation produces a value that exceeds those limits, you have an **underflow** or **overflow** condition. The answer appears to wrap from one limit to the other. To see an example, add these two lines in the interactive window:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="Overflow":::
+
+Notice that the answer is very close to the minimum (negative) integer. It's the same as `min + 2`. The addition operation **overflowed** the allowed values for integers. The answer is a large negative number because an overflow "wraps around" from the largest possible integer value to the smallest.
+
+There are other numeric types with different limits and precision that you would use when the `int` type doesn't meet your needs. Let's explore those types of numbers next.
+
+## Work with the double type
+
+The `double` numeric type represents a double-precision floating point number. Those terms might be new to you. A **floating point** number is useful to represent nonintegral numbers that might be large or small in magnitude. **Double-precision** is a relative term that describes the number of binary digits used to store the value. **Double precision** numbers have twice the number of binary digits as **single-precision**. On modern computers, it's more common to use double precision than single precision numbers. **Single precision** numbers are declared using the `float` keyword. Let's explore. Run the following code and see the result:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="FloatingPoint":::
+
+Notice that the answer includes the decimal portion of the quotient. Try a slightly more complicated expression with doubles. You can use the following values, or substitute other numbers:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="ChangeDoubleValues":::
+
+The range of a double value is greater than integer values. Try the following code in the interactive window:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="MinMax":::
+
+These values are printed in scientific notation. The number before the `E` is the significand. The number after the `E` is the exponent, as a power of 10.
+
+Just like decimal numbers in math, doubles in C# can have rounding errors. Try this code:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="RoundingError":::
+
+You know that `0.3` is `3/10` and not exactly the same as `1/3`. Similarly, `0.33` is `33/100`. That value is closer to `1/3`, but still not exact. No matter how many decimal places you add, a rounding error remains.
+
+***Challenge***
+
+Try other calculations with large numbers, small numbers, multiplication, and division using the `double` type. Try more complicated calculations.
+
+## Work with decimal types
+
+There's one other type to learn: the `decimal` type. The `decimal` type has a smaller range but greater precision than `double`. Let's take a look:
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="Decimal":::
+
+Notice that the range is smaller than the `double` type. You can see the greater precision with the decimal type by trying the following code:
+
+:::code language="csharp" source="./snippets/NumbersInCsharp/Program.cs" id="Precision":::
+
+Notice that the math using the decimal type has more digits to the right of the decimal point.
+
+The `M` suffix on the numbers is how you indicate that a constant should use the `decimal` type. Otherwise, the compiler assumes the `double` type.
+
+> [!NOTE]
+> The letter `M` was chosen as the most visually distinct letter between the `double` and `decimal` keywords.
+
+***Challenge***
+
+Write code that calculates the area of a circle whose radius is 2.50 centimeters. Remember that the area of a circle is the radius squared multiplied by PI. One hint: .NET contains a constant for PI, that you can use for that value. , like all constants declared in the `System.Math` namespace, is a `double` value. For that reason, you should use `double` instead of `decimal` values for this challenge.
+
+You should get an answer between 19 and 20.
+
+Once you try it, open the details pane to see how you did:
+
+
+
+:::code language="csharp" interactive="try-dotnet-method" source="./snippets/NumbersInCsharp/Program.cs" id="Challenge":::
+
+
+
+Try some other formulas if you'd like.
+
+You completed the "Numbers in C#" interactive tutorial. You can select the **Branches and Loops** link to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
+
+You can learn more about numbers in C# in the following articles:
+
+- [Integral numeric types](../../language-reference/builtin-types/integral-numeric-types.md)
+- [Floating-point numeric types](../../language-reference/builtin-types/floating-point-numeric-types.md)
+- [Built-in numeric conversions](../../language-reference/builtin-types/numeric-conversions.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.yml b/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.yml
deleted file mode 100644
index e82aaf2deb4e5..0000000000000
--- a/docs/csharp/tour-of-csharp/tutorials/numbers-in-csharp.yml
+++ /dev/null
@@ -1,293 +0,0 @@
-### YamlMime:Tutorial
-title: Manipulate integral and floating point numbers
-metadata:
- title: Work with numbers - Introductory interactive tutorial
- description: In this tutorial about numeric types, you'll use your browser to learn C# interactively. You're going to write C# code and see the results of compiling and running your code directly in the browser.
- audience: Developer
- ms.custom: mvc
- ms.date: 03/23/2022
- ms.topic: interactive-tutorial
- level: Beginner
- nextTutorialHref: branches-and-loops.yml
- nextTutorialTitle: Branches and loops in C#
- displayType: two-column
- interactive: csharp
-items:
-- durationInMinutes: 1
- content: |
- This tutorial teaches you about the numeric types in C# interactively, using your browser. You'll write C# and see the results of compiling and running your code. It contains a series of lessons that explore numbers and math operations in C#. These lessons teach you the fundamentals of the C# language.
-
- > [!TIP]
- > To paste a code snippet inside the **focus mode** you should use your keyboard shortcut (Ctrl + v, or cmd + v).
-- title: Explore integer math
- durationInMinutes: 4
- content: |
- Run the following code in the interactive window. Select the **Enter focus mode** button. Then, type the following code block in the interactive window and select **Run**:
-
- ```csharp
- int a = 18;
- int b = 6;
- int c = a + b;
- Console.WriteLine(c);
- ```
-
- If you're working on your environment, you should follow the instructions for the [local version](numbers-in-csharp-local.md) instead.
-
- You've seen one of the fundamental math operations with integers. The `int` type represents an **integer**, a positive or negative whole number. You use the `+` symbol for addition. Other common mathematical operations for integers include:
-
- - `-` for subtraction
- - `*` for multiplication
- - `/` for division
-
- > [!TIP]
- > Throughout this interactive tutorial, you can explore on your own by modifying the code you've written in the interactive window. This tutorial provides examples that you can try at each step.
-
- Start by exploring those different operations. Modify the third line to try each of these operations. After each edit, select the **Run** button.
-
- Subtraction:
-
- ```csharp
- int c = a - b;
- ```
-
- Multiplication:
-
- ```csharp
- int c = a * b;
- ```
-
- Division:
-
- ```csharp
- int c = a / b;
- ```
-
- You can also experiment by writing multiple mathematics operations in the same line, if you'd like.
-
- > [!TIP]
- > As you explore C# (or any programming language), you'll
- > make mistakes when you write code. The **compiler** will
- > find those errors and report them to you. When the output
- > contains error messages, look closely at the example code,
- > and the code in the interactive window to see what to fix.
- > That exercise will help you learn the structure of C# code.
-
-- title: Explore order of operations
- durationInMinutes: 7
- content: |
- The C# language defines the precedence of different mathematics operations
- with rules consistent with the rules you learned in mathematics.
- Multiplication and division take precedence over addition and subtraction.
- Explore that by running the following code in the interactive window:
-
- ```csharp
- int a = 5;
- int b = 4;
- int c = 2;
- int d = a + b * c;
- Console.WriteLine(d);
- ```
-
- The output demonstrates that the multiplication is performed before the addition.
-
- You can force a different order of operation by adding parentheses around
- the operation or operations you want performed first:
-
- ```csharp
- int a = 5;
- int b = 4;
- int c = 2;
- int d = (a + b) * c;
- Console.WriteLine(d);
- ```
-
- Explore more by combining many different operations. Replace the fourth line above with something like this:
-
- ```csharp
- int d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
- ```
-
- You may have noticed an interesting behavior for integers. Integer
- division always produces an integer result, even when you'd expect
- the result to include a decimal or fractional portion.
-
- If you haven't seen this behavior, try the following code:
-
- ```csharp
- int a = 7;
- int b = 4;
- int c = 3;
- int d = (a + b) / c;
- Console.WriteLine(d);
- ```
-
- Select **Run** again to see the results.
-
-- title: Explore integer precision and limits
- durationInMinutes: 5
- content: |
- That last sample showed you that integer division truncates the result.
- You can get the **remainder** by using the **remainder** operator, the `%` character:
-
- ```csharp
- int a = 7;
- int b = 4;
- int c = 3;
- int d = (a + b) / c;
- int e = (a + b) % c;
- Console.WriteLine($"quotient: {d}");
- Console.WriteLine($"remainder: {e}");
- ```
-
- The C# integer type differs from mathematical integers in one other
- way: the `int` type has minimum and maximum limits. Run this code
- in the interactive window to see those limits:
-
- ```csharp
- int max = int.MaxValue;
- int min = int.MinValue;
- Console.WriteLine($"The range of integers is {min} to {max}");
- ```
-
- If a calculation produces a value that exceeds those limits, you
- have an **underflow** or **overflow** condition. The answer appears
- to wrap from one limit to the other. Add these two lines to the interactive
- window to see an example:
-
- ```csharp
- int what = max + 3;
- Console.WriteLine($"An example of overflow: {what}");
- ```
-
- Notice that the answer is very close to the minimum (negative) integer. It's
- the same as `min + 2`.
- The addition operation **overflowed** the allowed values for integers.
- The answer is a very large negative number because an overflow "wraps around"
- from the largest possible integer value to the smallest.
-
- There are other numeric types with different limits and precision that you
- would use when the `int` type doesn't meet your needs. Let's explore those types of numbers next.
-
-- title: Work with the double type
- durationInMinutes: 5
- content: |
- The `double` numeric type represents a double-precision floating point
- number. Those terms may be new to you. A **floating point** number is
- useful to represent non-integral numbers that may be very large or small
- in magnitude. **Double-precision** is a relative term that describes the
- numbers of binary digits used to store the value. **Double precision**
- numbers have twice the number of binary digits as **single-precision**. On modern computers,
- it is more common to use double precision than single precision numbers. **Single precision** numbers are declared using the `float` keyword.
- Let's explore. Try the following code in the interactive window and see the result:
-
- ```csharp
- double a = 5;
- double b = 4;
- double c = 2;
- double d = (a + b) / c;
- Console.WriteLine(d);
- ```
-
- Notice that the answer includes the decimal portion of the quotient. Try a slightly
- more complicated expression with doubles:
-
- ```csharp
- double a = 19;
- double b = 23;
- double c = 8;
- double d = (a + b) / c;
- Console.WriteLine(d);
- ```
-
- The range of a double value is much greater than integer values. Try the following
- code in the interactive window:
-
- ```csharp
- double max = double.MaxValue;
- double min = double.MinValue;
- Console.WriteLine($"The range of double is {min} to {max}");
- ```
-
- These values are printed out in scientific notation. The number to
- the left of the `E` is the significand. The number to the right is the exponent,
- as a power of 10.
-
- Just like decimal numbers in math, doubles in C# can have rounding errors. Try this code:
-
- ```csharp
- double third = 1.0 / 3.0;
- Console.WriteLine(third);
- ```
-
- You know that `0.3` is `3/10` and not exactly the same as `1/3`. Similarly, `0.33` is `33/100`. That's closer to `1/3`, but still not exact.
-
- ***Challenge***
-
- Try other calculations with large numbers, small numbers, multiplication,
- and division using the `double` type. Try more complicated calculations.
-
-- title: Work with decimal types
- durationInMinutes: 8
- content: |
- You've seen the basic numeric types in C#: integers and doubles. There's one
- other type to learn: the `decimal` type. The `decimal` type has a smaller
- range but greater precision than `double`. Let's take a look:
-
- ```csharp
- decimal min = decimal.MinValue;
- decimal max = decimal.MaxValue;
- Console.WriteLine($"The range of the decimal type is {min} to {max}");
- ```
-
- Notice that the range is smaller than the `double` type. You can see the greater
- precision with the decimal type by trying the following code:
-
- ```csharp
- double a = 1.0;
- double b = 3.0;
- Console.WriteLine(a / b);
-
- decimal c = 1.0M;
- decimal d = 3.0M;
- Console.WriteLine(c / d);
- ```
-
-
- Notice that the math using the decimal type has more digits to the right
- of the decimal point.
-
- The `M` suffix on the numbers is how you indicate that a constant should use the `decimal` type. Otherwise, the compiler assumes the `double` type.
-
- > [!NOTE]
- > The letter `M` was chosen as the most visually distinct letter between the `double` and `decimal` keywords.
-
- ***Challenge***
-
- Now that you've seen the different numeric types, write code that calculates
- the area of a circle whose radius is 2.50 centimeters. Remember that the area of a circle
- is the radius squared multiplied by PI. One hint: .NET contains a constant
- for PI, that you can use for that value. , like all constants declared in the `System.Math` namespace, is a `double` value. For that reason, you should use `double` instead of `decimal` values for this challenge.
-
- You should get an answer between 19 and 20.
-
-- title: Complete challenge
- durationInMinutes: 1
- content: |
- Did you come up with something like this?
-
- ```csharp
- double radius = 2.50;
- double area = Math.PI * radius * radius;
- Console.WriteLine(area);
- ```
-
- Try some other formulas if you'd like.
-
-- content: |
- You've completed the "Numbers in C#" interactive tutorial. You can select the **Branches and Loops** link below to start the next interactive tutorial, or you can visit the [.NET site](https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro) to download the .NET SDK, create a project on your machine, and keep coding. The "Next steps" section brings you back to these tutorials.
-
- You can learn more about numbers in C# in the following articles:
-
- - [Integral numeric types](../../language-reference/builtin-types/integral-numeric-types.md)
- - [Floating-point numeric types](../../language-reference/builtin-types/floating-point-numeric-types.md)
- - [Built-in numeric conversions](../../language-reference/builtin-types/numeric-conversions.md)
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/BranchesAndLoops.csproj b/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/BranchesAndLoops.csproj
new file mode 100644
index 0000000000000..fd4bd08da2987
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/BranchesAndLoops.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/Program.cs b/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/Program.cs
new file mode 100644
index 0000000000000..dae1c19e90003
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/BranchesAndLoops/Program.cs
@@ -0,0 +1,156 @@
+
+PageOne();
+PageTwo();
+MorePageTwo();
+ComplexPageTwo();
+PageThree();
+PageThreeDo();
+PageFour();
+PageFive();
+Challenge();
+
+void PageOne()
+{
+ //
+ int a = 5;
+ int b = 6;
+ if (a + b > 10)
+ Console.WriteLine("The answer is greater than 10.");
+ //
+}
+
+void PageTwo()
+{
+ //
+ int a = 5;
+ int b = 3;
+ if (a + b > 10)
+ Console.WriteLine("The answer is greater than 10");
+ else
+ Console.WriteLine("The answer is not greater than 10");
+ //
+}
+
+void MorePageTwo()
+{
+ //
+ int a = 5;
+ int b = 3;
+ if (a + b > 10)
+ {
+ Console.WriteLine("The answer is greater than 10");
+ }
+ else
+ {
+ Console.WriteLine("The answer is not greater than 10");
+ }
+ //
+}
+
+void ComplexPageTwo()
+{
+ //
+ int a = 5;
+ int b = 3;
+ int c = 4;
+ if ((a + b + c > 10) && (a == b))
+ {
+ Console.WriteLine("The answer is greater than 10");
+ Console.WriteLine("And the first number is equal to the second");
+ }
+ else
+ {
+ Console.WriteLine("The answer is not greater than 10");
+ Console.WriteLine("Or the first number is not equal to the second");
+ }
+ //
+
+ //
+ if ((a + b + c > 10) || (a == b))
+ //
+ {
+ Console.WriteLine("The answer is greater than 10");
+ Console.WriteLine("Or the first number is equal to the second");
+ }
+ else
+ {
+ Console.WriteLine("The answer is not greater than 10");
+ Console.WriteLine("And the first number is not equal to the second");
+ }
+}
+
+void PageThree()
+{
+ //
+ int counter = 0;
+ while (counter < 10)
+ {
+ Console.WriteLine($"Hello World! The counter is {counter}");
+ counter++;
+ }
+ //
+}
+
+void PageThreeDo()
+{
+ //
+ int counter = 0;
+ do
+ {
+ Console.WriteLine($"Hello World! The counter is {counter}");
+ counter++;
+ } while (counter < 10);
+ //
+}
+
+void PageFour()
+{
+ //
+ for (int counter = 0; counter < 10; counter++)
+ {
+ Console.WriteLine($"Hello World! The counter is {counter}");
+ }
+ //
+}
+
+void PageFive()
+{
+ //
+ for (int row = 1; row < 11; row++)
+ {
+ Console.WriteLine($"The row is {row}");
+ }
+ //
+
+ //
+ for (char column = 'a'; column < 'k'; column++)
+ {
+ Console.WriteLine($"The column is {column}");
+ }
+ //
+
+ //
+ for (int row = 1; row < 11; row++)
+ {
+ for (char column = 'a'; column < 'k'; column++)
+ {
+ Console.WriteLine($"The cell is ({row}, {column})");
+ }
+ }
+ //
+}
+
+void Challenge()
+{
+ //
+ int sum = 0;
+ for (int number = 1; number < 21; number++)
+ {
+ if (number % 3 == 0)
+ {
+ sum = sum + number;
+ }
+ }
+ Console.WriteLine($"The sum is {sum}");
+ //
+}
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/HelloWorld.csproj b/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/HelloWorld.csproj
new file mode 100644
index 0000000000000..fd4bd08da2987
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/HelloWorld.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/Program.cs b/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/Program.cs
new file mode 100644
index 0000000000000..fe73550748b2e
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/HelloWorld/Program.cs
@@ -0,0 +1,102 @@
+PageOne();
+PageTwo();
+PageThree();
+PageFour();
+PageFive();
+PageSix();
+Challenge();
+
+void PageOne()
+{
+ //
+ Console.WriteLine("Hello, World!");
+ //
+}
+
+void PageTwo()
+{
+ //
+ string aFriend = "Bill";
+ Console.WriteLine(aFriend);
+ //
+
+ //
+ aFriend = "Maira";
+ Console.WriteLine(aFriend);
+ //
+
+ //
+ Console.WriteLine("Hello " + aFriend);
+ //
+
+ //
+ Console.WriteLine($"Hello {aFriend}");
+ //
+}
+
+void PageThree()
+{
+ //
+ string firstFriend = "Maria";
+ string secondFriend = "Sage";
+ Console.WriteLine($"My friends are {firstFriend} and {secondFriend}");
+ //
+
+ //
+ Console.WriteLine($"The name {firstFriend} has {firstFriend.Length} letters.");
+ Console.WriteLine($"The name {secondFriend} has {secondFriend.Length} letters.");
+ //
+}
+
+void PageFour()
+{
+ //
+ string greeting = " Hello World! ";
+ Console.WriteLine($"[{greeting}]");
+
+ string trimmedGreeting = greeting.TrimStart();
+ Console.WriteLine($"[{trimmedGreeting}]");
+
+ trimmedGreeting = greeting.TrimEnd();
+ Console.WriteLine($"[{trimmedGreeting}]");
+
+ trimmedGreeting = greeting.Trim();
+ Console.WriteLine($"[{trimmedGreeting}]");
+ //
+}
+
+void PageFive()
+{
+ //
+ string sayHello = "Hello World!";
+ Console.WriteLine(sayHello);
+ sayHello = sayHello.Replace("Hello", "Greetings");
+ Console.WriteLine(sayHello);
+ //
+
+ //
+ Console.WriteLine(sayHello.ToUpper());
+ Console.WriteLine(sayHello.ToLower());
+ //
+}
+
+void PageSix()
+{
+ //
+ string songLyrics = "You say goodbye, and I say hello";
+ Console.WriteLine(songLyrics.Contains("goodbye"));
+ Console.WriteLine(songLyrics.Contains("greetings"));
+ //
+}
+
+void Challenge()
+{
+ //
+ string songLyrics = "You say goodbye, and I say hello";
+ Console.WriteLine(songLyrics.StartsWith("You"));
+ Console.WriteLine(songLyrics.StartsWith("goodbye"));
+
+ Console.WriteLine(songLyrics.EndsWith("hello"));
+ Console.WriteLine(songLyrics.EndsWith("goodbye"));
+ //
+}
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/ListCollection.csproj b/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/ListCollection.csproj
new file mode 100644
index 0000000000000..fd4bd08da2987
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/ListCollection.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/Program.cs b/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/Program.cs
new file mode 100644
index 0000000000000..3df770ea7cb45
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/ListCollection/Program.cs
@@ -0,0 +1,103 @@
+
+ListOfStrings();
+ListOfNumbers();
+ChallengeAnswer();
+
+void ListOfStrings()
+{
+ //
+ List names = ["", "Ana", "Felipe"];
+ foreach (var name in names)
+ {
+ Console.WriteLine($"Hello {name.ToUpper()}!");
+ }
+ //
+
+ //
+ Console.WriteLine();
+ names.Add("Maria");
+ names.Add("Bill");
+ names.Remove("Ana");
+ foreach (var name in names)
+ {
+ Console.WriteLine($"Hello {name.ToUpper()}!");
+ }
+ //
+
+ //
+ Console.WriteLine($"My name is {names[0]}.");
+ Console.WriteLine($"I've added {names[2]} and {names[3]} to the list.");
+ //
+
+ //
+ Console.WriteLine($"The list has {names.Count} people in it");
+ //
+
+ //
+ var index = names.IndexOf("Felipe");
+ if (index == -1)
+ {
+ Console.WriteLine($"When an item is not found, IndexOf returns {index}");
+ }
+ else
+ {
+ Console.WriteLine($"The name {names[index]} is at index {index}");
+ }
+
+ index = names.IndexOf("Not Found");
+ if (index == -1)
+ {
+ Console.WriteLine($"When an item is not found, IndexOf returns {index}");
+ }
+ else
+ {
+ Console.WriteLine($"The name {names[index]} is at index {index}");
+ }
+ //
+
+ //
+ names.Sort();
+ foreach (var name in names)
+ {
+ Console.WriteLine($"Hello {name.ToUpper()}!");
+ }
+ //
+}
+
+void ListOfNumbers()
+{
+ //
+ List fibonacciNumbers = [1, 1];
+ //
+
+ //
+ var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
+ var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
+
+ fibonacciNumbers.Add(previous + previous2);
+
+ foreach (var item in fibonacciNumbers)
+ {
+ Console.WriteLine(item);
+ }
+ //
+}
+
+void ChallengeAnswer()
+{
+ //
+ List fibonacciNumbers = [1, 1];
+
+ while (fibonacciNumbers.Count < 20)
+ {
+ var previous = fibonacciNumbers[fibonacciNumbers.Count - 1];
+ var previous2 = fibonacciNumbers[fibonacciNumbers.Count - 2];
+
+ fibonacciNumbers.Add(previous + previous2);
+ }
+ foreach (var item in fibonacciNumbers)
+ {
+ Console.WriteLine(item);
+ }
+ //
+}
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/NumbersInCsharp.csproj b/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/NumbersInCsharp.csproj
new file mode 100644
index 0000000000000..fd4bd08da2987
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/NumbersInCsharp.csproj
@@ -0,0 +1,10 @@
+
+
+
+ Exe
+ net9.0
+ enable
+ enable
+
+
+
diff --git a/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/Program.cs b/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/Program.cs
new file mode 100644
index 0000000000000..d320628b0b1bf
--- /dev/null
+++ b/docs/csharp/tour-of-csharp/tutorials/snippets/NumbersInCsharp/Program.cs
@@ -0,0 +1,131 @@
+
+PageOne();
+PageTwo();
+MorePageTwo();
+PageThree();
+PageFour();
+PageFive();
+
+// Bonus calculation:
+//
+double a = 19;
+double b = 23;
+double c = 8;
+double d = (a + b) / c;
+Console.WriteLine(d);
+//
+
+
+void PageOne()
+{
+ //
+ int a = 18;
+ int b = 6;
+ int c = a + b;
+ Console.WriteLine(c);
+ //
+}
+
+void PageTwo()
+{
+ //
+ int a = 5;
+ int b = 4;
+ int c = 2;
+ int d = a + b * c;
+ Console.WriteLine(d);
+ //
+
+ //
+ d = (a + b) * c;
+ Console.WriteLine(d);
+ //
+
+ //
+ d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
+ Console.WriteLine(d);
+ //
+}
+
+void MorePageTwo()
+{
+ //
+ int a = 7;
+ int b = 4;
+ int c = 3;
+ int d = (a + b) / c;
+ Console.WriteLine(d);
+ //
+}
+
+void PageThree()
+{
+ //
+ int a = 7;
+ int b = 4;
+ int c = 3;
+ int d = (a + b) / c;
+ int e = (a + b) % c;
+ Console.WriteLine($"quotient: {d}");
+ Console.WriteLine($"remainder: {e}");
+ //
+
+ //
+ int max = int.MaxValue;
+ int min = int.MinValue;
+ Console.WriteLine($"The range of integers is {min} to {max}");
+ //
+
+ //
+ int what = max + 3;
+ Console.WriteLine($"An example of overflow: {what}");
+ //
+
+}
+
+void PageFour()
+{
+ //
+ double a = 5;
+ double b = 4;
+ double c = 2;
+ double d = (a + b) / c;
+ Console.WriteLine(d);
+ //
+
+ //
+ double max = double.MaxValue;
+ double min = double.MinValue;
+ Console.WriteLine($"The range of double is {min} to {max}");
+ //
+
+ //
+ double third = 1.0 / 3.0;
+ Console.WriteLine(third);
+ //
+}
+
+void PageFive()
+{
+ //
+ decimal min = decimal.MinValue;
+ decimal max = decimal.MaxValue;
+ Console.WriteLine($"The range of the decimal type is {min} to {max}");
+ //
+
+ //
+ double a = 1.0;
+ double b = 3.0;
+ Console.WriteLine(a / b);
+
+ decimal c = 1.0M;
+ decimal d = 3.0M;
+ Console.WriteLine(c / d);
+ //
+
+ //
+ double radius = 2.50;
+ double area = Math.PI * radius * radius;
+ Console.WriteLine(area);
+ //
+}
diff --git a/docs/fundamentals/networking/http/http-overview.md b/docs/fundamentals/networking/http/http-overview.md
index c3e0f35ad8b9f..6b8d5bec9d03e 100644
--- a/docs/fundamentals/networking/http/http-overview.md
+++ b/docs/fundamentals/networking/http/http-overview.md
@@ -43,7 +43,7 @@ The request methods are differentiated via several factors, first by their _verb
## HTTP status codes
-.NET provides comprehensive support for the HTTP protocol, which accounts for most internet traffic, with the . For more information, see [Make HTTP requests with the HttpClient class](httpclient.md). Applications receive HTTP protocol errors by catching an . HTTP status codes are either reported in with the or in with the in case the called method doesn't return a response message. For more information about error handling, see [HTTP error handling](httpclient.md#http-error-handling), and for more information about status codes, see [RFC 9110, HTTP Semantics: Status Codes](https://www.rfc-editor.org/rfc/rfc9110#name-status-codes).
+.NET provides comprehensive support for the HTTP protocol, which accounts for most internet traffic, with the . For more information, see [Make HTTP requests with the HttpClient class](httpclient.md). Applications receive HTTP protocol errors by catching an . HTTP status codes are either reported in with the or in with the in case the called method doesn't return a response message. For more information about error handling, see [HTTP error handling](httpclient.md#use-http-error-handling), and for more information about status codes, see [RFC 9110, HTTP Semantics: Status Codes](https://www.rfc-editor.org/rfc/rfc9110#name-status-codes).
### Informational status codes
diff --git a/docs/fundamentals/networking/http/httpclient.md b/docs/fundamentals/networking/http/httpclient.md
index 98b74409fe10d..50563d60ad4ce 100644
--- a/docs/fundamentals/networking/http/httpclient.md
+++ b/docs/fundamentals/networking/http/httpclient.md
@@ -3,7 +3,7 @@ title: Make HTTP requests with the HttpClient
description: Learn how to make HTTP requests and handle responses with the HttpClient in .NET.
author: IEvangelist
ms.author: dapine
-ms.date: 03/06/2025
+ms.date: 03/09/2025
---
# Make HTTP requests with the HttpClient class
@@ -309,8 +309,6 @@ When you know an HTTP endpoint returns JSON, you can deserialize the response bo
In this code, the `result` value is the response body deserialized as the type `T`.
-
-
## Use HTTP error handling
When an HTTP request fails, the system throws the object. Catching the exception alone might not be sufficient. There are other potential exceptions thrown that you might want to consider handling. For example, the calling code might use a cancellation token that was canceled before the request completed. In this scenario, you can catch the error:
@@ -346,8 +344,6 @@ There might be scenarios where you need to throw the
-
## Configure an HTTP proxy
An HTTP proxy can be configured in one of two ways. A default is specified on the property. Alternatively, you can specify a proxy on the property.
diff --git a/docs/fundamentals/networking/http/snippets/httpclient-guidelines/MyClass.cs b/docs/fundamentals/networking/http/snippets/httpclient-guidelines/MyClass.cs
index 1d2cd441a0df8..dffd0e0a0d445 100644
--- a/docs/fundamentals/networking/http/snippets/httpclient-guidelines/MyClass.cs
+++ b/docs/fundamentals/networking/http/snippets/httpclient-guidelines/MyClass.cs
@@ -3,7 +3,7 @@
class MyClass
{
- static HttpClient? httpClient;
+ static HttpClient? s_httpClient;
MyClass()
{
@@ -24,6 +24,6 @@ class MyClass
InnerHandler = socketHandler,
};
- httpClient = new HttpClient(resilienceHandler);
+ s_httpClient = new HttpClient(resilienceHandler);
}
}
diff --git a/docs/index.yml b/docs/index.yml
index cef83d47dce74..d09d7011ef4b8 100644
--- a/docs/index.yml
+++ b/docs/index.yml
@@ -42,7 +42,7 @@ highlightedContent:
# Card
- title: "Interactive introduction to C#"
itemType: get-started
- url: csharp/tour-of-csharp/tutorials/hello-world.yml
+ url: csharp/tour-of-csharp/tutorials/hello-world.md
# Card
- title: "Azure for .NET developers"
itemType: overview
diff --git a/docs/navigate/tools-diagnostics/toc.yml b/docs/navigate/tools-diagnostics/toc.yml
index deb2b063f6d3d..9eebf75b45c94 100644
--- a/docs/navigate/tools-diagnostics/toc.yml
+++ b/docs/navigate/tools-diagnostics/toc.yml
@@ -391,6 +391,9 @@ items:
displayName: exception summarization,exception summary,exception summarizer,ExceptionSummary
- name: Collection
href: ../../core/diagnostics/metrics-collection.md
+ - name: Source-generated metrics
+ displayName: strongly-typed tags,dimensions
+ href: ../../core/diagnostics/metrics-strongly-typed.md
- name: Built-in metrics
items:
- name: Overview
diff --git a/docs/standard/garbage-collection/implementing-dispose.md b/docs/standard/garbage-collection/implementing-dispose.md
index 78f2294f24d62..d2fd4f5845170 100644
--- a/docs/standard/garbage-collection/implementing-dispose.md
+++ b/docs/standard/garbage-collection/implementing-dispose.md
@@ -15,7 +15,7 @@ ms.topic: how-to
The method is primarily implemented to release unmanaged resources. When working with instance members that are implementations, it's common to cascade calls. There are other reasons for implementing , for example, to free memory that was allocated, remove an item that was added to a collection, or signal the release of a lock that was acquired.
-The [.NET garbage collector](index.md) doesn't allocate or release unmanaged memory. The pattern for disposing an object, referred to as the dispose pattern, imposes order on the lifetime of an object. The dispose pattern is used for objects that implement the interface. This pattern is common when interacting with file and pipe handles, registry handles, wait handles, or pointers to blocks of unmanaged memory, because the garbage collector is unable to reclaim unmanaged objects.
+The [.NET garbage collector](index.md) doesn't allocate or release unmanaged memory. The pattern for disposing an object, referred to as the [dispose pattern](../design-guidelines/dispose-pattern.md), imposes order on the lifetime of an object. The dispose pattern is used for objects that implement the interface. This pattern is common when interacting with file and pipe handles, registry handles, wait handles, or pointers to blocks of unmanaged memory, because the garbage collector is unable to reclaim unmanaged objects.
To help ensure that resources are always cleaned up appropriately, a method should be idempotent, such that it's callable multiple times without throwing an exception. Furthermore, subsequent invocations of should do nothing.
@@ -23,23 +23,17 @@ The code example provided for the objects instead of implementing a finalizer.
-
-A is an abstract managed type that wraps an that identifies an unmanaged resource. On Windows it might identify a handle, and on Unix, a file descriptor. The `SafeHandle` provides all of the logic necessary to ensure that this resource is released once and only once, either when the `SafeHandle` is disposed of or when all references to the `SafeHandle` have been dropped and the `SafeHandle` instance is finalized.
+## Cascade dispose calls
-The is an abstract base class. Derived classes provide specific instances for different kinds of handle. These derived classes validate what values for the are considered invalid and how to actually free the handle. For example, derives from `SafeHandle` to wrap `IntPtrs` that identify open file handles/descriptors, and overrides its method to close it (via the `close` function on Unix or `CloseHandle` function on Windows). Most APIs in .NET libraries that create an unmanaged resource wraps it in a `SafeHandle` and return that `SafeHandle` to you as needed, rather than handing back the raw pointer. In situations where you interact with an unmanaged component and get an `IntPtr` for an unmanaged resource, you can create your own `SafeHandle` type to wrap it. As a result, few non-`SafeHandle` types need to implement finalizers. Most disposable pattern implementations only end up wrapping other managed resources, some of which may be `SafeHandle` objects.
+If your class owns an instance of another type that implements , the containing class itself should also implement . Typically a class that instantiates an implementation and stores it as an instance member (or property) is also responsible for its cleanup. This helps ensure that the referenced disposable types are given the opportunity to deterministically perform cleanup through the method. In the following example, the class is `sealed` (or `NotInheritable` in Visual Basic).
-The following derived classes in the namespace provide safe handles.
+:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.disposable/cs/Foo.cs":::
+:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.disposable/vb/Foo.vb":::
-| Class | Resources it holds |
-| - | - |
-|
| Files, memory mapped files, and pipes |
-| | Memory views |
-|
|Cryptography constructs |
-| | Registry keys |
-| | Wait handles |
+> [!TIP]
+>
+> - If your class has an field or property but doesn't *own* it, then the class doesn't need to implement . Typically a class creating and storing the child object also becomes the owner, but in some cases the ownership can be transferred to another type.
+> - There are cases when you might want to perform `null`-checking in a finalizer (which includes the `Dispose(false)` method invoked by a finalizer). One of the primary reasons is if you're unsure whether the instance got fully initialized (for example, an exception might be thrown in a constructor).
## Dispose() and Dispose(bool)
@@ -81,42 +75,42 @@ The body of the method consists of three blocks of code:
If the method call comes from a finalizer, only the code that frees unmanaged resources should execute. The implementer is responsible for ensuring that the false path doesn't interact with managed objects that may have been disposed. This is important because the order in which the garbage collector disposes managed objects during finalization is nondeterministic.
-## Cascade dispose calls
-
-If your class owns a field or property and its type implements , the containing class itself should also implement . A class that instantiates an implementation and stores it as an instance member is also responsible for its cleanup. This helps ensure that the referenced disposable types are given the opportunity to deterministically perform cleanup through the method. In the following example, the class is `sealed` (or `NotInheritable` in Visual Basic).
-
-:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.disposable/cs/Foo.cs":::
-:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.disposable/vb/Foo.vb":::
-
-> [!TIP]
->
-> - If your class has an field or property but doesn't *own* it, meaning the class doesn't create the object, then the class doesn't need to implement .
-> - There are cases when you may want to perform `null`-checking in a finalizer (which includes the `Dispose(false)` method invoked by a finalizer). One of the primary reasons is if you're unsure whether the instance got fully initialized (for example, an exception might be thrown in a constructor).
-
## Implement the dispose pattern
-All non-sealed classes (or Visual Basic classes not modified as `NotInheritable`) should be considered a potential base class, because they could be inherited. If you implement the dispose pattern for any potential base class, you must provide the following:
+All non-sealed classes (or Visual Basic classes not modified as `NotInheritable`) should be considered a potential base class, because they could be inherited. If you implement the dispose pattern for any potential base class, you must add the following methods to your class:
- A implementation that calls the `Dispose(bool)` method.
- A `Dispose(bool)` method that performs the actual cleanup.
-- Either a class derived from that wraps your unmanaged resource (recommended), or an override to the method. The class provides a finalizer, so you don't have to write one yourself.
+- If your class deals with unmanaged resources, either provide an override to the method or wrap the unmanaged resource in a .
> [!IMPORTANT]
-> It's possible for a base class to only reference managed objects and implement the dispose pattern. In these cases, a finalizer is unnecessary. A finalizer is only required if you directly reference unmanaged resources.
+> A finalizer (a override) is only required if you directly reference unmanaged resources. This is a highly advanced scenario that can be typically avoided:
+>
+> - **If your class references only managed objects**, it's still possible for the class to implement the dispose pattern. There's no need to implement a finalizer.
+> - **If you need to deal with unmanaged resources**, we strongly recommend wrapping the unmanaged handle into a . The provides a finalizer so you don't have to write one yourself. For more information, see the [Safe handles](#safe-handles) paragraph.
+
+### Base class with managed resources
-Here's a general example of implementing the dispose pattern for a base class that uses a safe handle.
+Here's a general example of implementing the dispose pattern for a base class that only owns managed resources.
:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base1.cs":::
:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base1.vb":::
> [!NOTE]
-> The previous example uses a object to illustrate the pattern; any object derived from could be used instead. Note that the example does not properly instantiate its object.
+> The previous example uses a **dummy** object to illustrate the pattern. Any could be used instead.
+
+### Base class with unmanaged resources
-Here's the general pattern for implementing the dispose pattern for a base class that overrides .
+Here's an example for implementing the dispose pattern for a base class that overrides in order to clean up unmanaged resources it owns. The example also demonstrates a way to implement `Dispose(bool)` in a thread-safe manner. Synchronization might be critical when dealing with unmanaged resources in a multi-threaded application. As mentioned earlier, this is an advanced scenario.
:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base2.cs":::
:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base2.vb":::
+> [!NOTE]
+>
+> - The previous example uses to allocate 10 bytes on the unmanaged heap in the constructor and free the buffer in `Dispose(bool)` by calling . This is a dummy allocation for illustrational purpose.
+> - Again, it's recommended to avoid implementing a finalizer. See [Implement the dispose pattern using a custom safe handle](#implement-the-dispose-pattern-using-a-custom-safe-handle) for an equivalent of the previous example that delegates non-deterministic finalization and synchronization to .
+
> [!TIP]
> In C#, you implement a finalization by providing a [finalizer](../../csharp/programming-guide/classes-and-structs/finalizers.md), not by overriding . In Visual Basic, you create a finalizer with `Protected Overrides Sub Finalize()`.
@@ -140,6 +134,39 @@ Here's the general pattern for implementing the dispose pattern for a derived cl
:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived2.cs":::
:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived2.vb":::
+## Safe handles
+
+Writing code for an object's finalizer is a complex task that can cause problems if not done correctly. Therefore, we recommend that you construct objects instead of implementing a finalizer.
+
+A is an abstract managed type that wraps an that identifies an unmanaged resource. On Windows it might identify a handle, and on Unix, a file descriptor. The `SafeHandle` provides all of the logic necessary to ensure that this resource is released once and only once, either when the `SafeHandle` is disposed of or when all references to the `SafeHandle` have been dropped and the `SafeHandle` instance is finalized.
+
+The is an abstract base class. Derived classes provide specific instances for different kinds of handle. These derived classes validate what values for the are considered invalid and how to actually free the handle. For example, derives from `SafeHandle` to wrap `IntPtrs` that identify open file handles and descriptors, and overrides its method to close it (via the `close` function on Unix or `CloseHandle` function on Windows). Most APIs in .NET libraries that create an unmanaged resource wrap it in a `SafeHandle` and return that `SafeHandle` to you as needed, rather than handing back the raw pointer. In situations where you interact with an unmanaged component and get an `IntPtr` for an unmanaged resource, you can create your own `SafeHandle` type to wrap it. As a result, few non-`SafeHandle` types need to implement finalizers. Most disposable pattern implementations only end up wrapping other managed resources, some of which might be `SafeHandle` objects.
+
+### Implement the dispose pattern using a custom safe handle
+
+The following code demonstrates how to handle unmanaged resources by implementing a .
+
+:::code language="csharp" source="../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/safe.cs":::
+:::code language="vb" source="../../../samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/safe.vb":::
+
+> [!NOTE]
+> The behavior of the `DisposableBaseWithSafeHandle` class is equivalent to the behavior of the [`DisposableBaseWithFinalizer` class in a previous example](#base-class-with-unmanaged-resources), however the approach demonstrated here is safer:
+>
+> - There is no need to implement a finalizer, because will take care of finalization.
+> - There is no need for synchronization to guarantee thread safety. Even though there is a race condition in the `Dispose` implementation of `DisposableBaseWithSafeHandle`, guarantees that will be called only once.
+
+### Built-in safe handles in .NET
+
+The following derived classes in the namespace provide safe handles.
+
+| Class | Resources it holds |
+| - | - |
+|
| Files, memory mapped files, and pipes |
+| | Memory views |
+|
| Cryptography constructs |
+| | Registry keys |
+| | Wait handles |
+
## See also
- [Disposal of services](../../core/extensions/dependency-injection-guidelines.md#disposal-of-services)
@@ -150,3 +177,4 @@ Here's the general pattern for implementing the dispose pattern for a derived cl
-
-
- [Define and consume classes and structs (C++/CLI)](/cpp/dotnet/how-to-define-and-consume-classes-and-structs-cpp-cli)
+- [The SafeHandle class](../../fundamentals/runtime-libraries/system-runtime-interopservices-safehandle.md)
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/Program.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/Program.cs
index 37a893aeb54fd..e182826520686 100644
--- a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/Program.cs
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/Program.cs
@@ -1,7 +1,10 @@
-static class Program
+Test();
+
+void Test()
{
- static void Main()
- {
- using var disposable = new BaseClassWithSafeHandle();
- }
+ using DisposableDerived a = new();
+ using DisposableDerivedWithFinalizer b = new();
+ b.Dispose();
+ using DisposableBaseWithSafeHandle c = new();
}
+
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base1.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base1.cs
index 9a68d1b29e500..182367f60ac73 100644
--- a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base1.cs
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base1.cs
@@ -1,14 +1,13 @@
-using Microsoft.Win32.SafeHandles;
-using System;
-using System.Runtime.InteropServices;
+using System;
+using System.IO;
-public class BaseClassWithSafeHandle : IDisposable
+public class DisposableBase : IDisposable
{
- // To detect redundant calls
- private bool _disposedValue;
+ // Detect redundant Dispose() calls.
+ private bool _isDisposed;
- // Instantiate a SafeHandle instance.
- private SafeHandle? _safeHandle = new SafeFileHandle(IntPtr.Zero, true);
+ // Instantiate a disposable object owned by this class.
+ private Stream? _managedResource = new MemoryStream();
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
@@ -20,15 +19,16 @@ public void Dispose()
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
- if (!_disposedValue)
+ if (!_isDisposed)
{
+ _isDisposed = true;
+
if (disposing)
{
- _safeHandle?.Dispose();
- _safeHandle = null;
+ // Dispose managed state.
+ _managedResource?.Dispose();
+ _managedResource = null;
}
-
- _disposedValue = true;
}
}
}
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base2.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base2.cs
index 4b45bdef29187..14c354fdb40bf 100644
--- a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base2.cs
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/base2.cs
@@ -1,11 +1,22 @@
using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Threading;
-public class BaseClassWithFinalizer : IDisposable
+public class DisposableBaseWithFinalizer : IDisposable
{
- // To detect redundant calls
- private bool _disposedValue;
+ // Detect redundant Dispose() calls in a thread-safe manner.
+ // _isDisposed == 0 means Dispose(bool) has not been called yet.
+ // _isDisposed == 1 means Dispose(bool) has been already called.
+ private int _isDisposed;
- ~BaseClassWithFinalizer() => Dispose(false);
+ // Instantiate a disposable object owned by this class.
+ private Stream? _managedResource = new MemoryStream();
+
+ // A pointer to 10 bytes allocated on the unmanaged heap.
+ private IntPtr _unmanagedResource = Marshal.AllocHGlobal(10);
+
+ ~DisposableBaseWithFinalizer() => Dispose(false);
// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
@@ -17,16 +28,17 @@ public void Dispose()
// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
- if (!_disposedValue)
+ // In case _isDisposed is 0, atomically set it to 1.
+ // Enter the branch only if the original value is 0.
+ if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) == 0)
{
if (disposing)
{
- // TODO: dispose managed state (managed objects)
+ _managedResource?.Dispose();
+ _managedResource = null;
}
- // TODO: free unmanaged resources (unmanaged objects) and override finalizer
- // TODO: set large fields to null
- _disposedValue = true;
+ Marshal.FreeHGlobal(_unmanagedResource);
}
}
}
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived1.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived1.cs
index 25794ca4c3147..51d40090193d2 100644
--- a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived1.cs
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived1.cs
@@ -1,27 +1,25 @@
-using Microsoft.Win32.SafeHandles;
-using System;
-using System.Runtime.InteropServices;
+using System.IO;
-public class DerivedClassWithSafeHandle : BaseClassWithSafeHandle
+public class DisposableDerived : DisposableBase
{
// To detect redundant calls
- private bool _disposedValue;
+ private bool _isDisposed;
- // Instantiate a SafeHandle instance.
- private SafeHandle? _safeHandle = new SafeFileHandle(IntPtr.Zero, true);
+ // Instantiate a disposable object owned by this class.
+ private Stream? _managedResource = new MemoryStream();
// Protected implementation of Dispose pattern.
protected override void Dispose(bool disposing)
{
- if (!_disposedValue)
+ if (!_isDisposed)
{
+ _isDisposed = true;
+
if (disposing)
{
- _safeHandle?.Dispose();
- _safeHandle = null;
+ _managedResource?.Dispose();
+ _managedResource = null;
}
-
- _disposedValue = true;
}
// Call base class implementation.
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived2.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived2.cs
index 0966b3e633a08..0326e96c65d3e 100644
--- a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived2.cs
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/derived2.cs
@@ -1,14 +1,20 @@
-public class DerivedClassWithFinalizer : BaseClassWithFinalizer
+using System.Threading;
+
+public class DisposableDerivedWithFinalizer : DisposableBaseWithFinalizer
{
- // To detect redundant calls
- private bool _disposedValue;
+ // Detect redundant Dispose() calls in a thread-safe manner.
+ // _isDisposed == 0 means Dispose(bool) has not been called yet.
+ // _isDisposed == 1 means Dispose(bool) has been already called.
+ private int _isDisposed;
- ~DerivedClassWithFinalizer() => Dispose(false);
+ ~DisposableDerivedWithFinalizer() => Dispose(false);
// Protected implementation of Dispose pattern.
protected override void Dispose(bool disposing)
{
- if (!_disposedValue)
+ // In case _isDisposed is 0, atomically set it to 1.
+ // Enter the branch only if the original value is 0.
+ if (Interlocked.CompareExchange(ref _isDisposed, 1, 0) == 0)
{
if (disposing)
{
@@ -17,7 +23,6 @@ protected override void Dispose(bool disposing)
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
- _disposedValue = true;
}
// Call the base class implementation.
diff --git a/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/safe.cs b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/safe.cs
new file mode 100644
index 0000000000000..9e681a3a3a53a
--- /dev/null
+++ b/samples/snippets/csharp/VS_Snippets_CLR_System/system.idisposable/cs/safe.cs
@@ -0,0 +1,61 @@
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+// Wraps the IntPtr allocated by Marshal.AllocHGlobal() into a SafeHandle.
+class LocalAllocHandle : SafeHandleZeroOrMinusOneIsInvalid
+{
+ private LocalAllocHandle() : base(ownsHandle: true) { }
+
+ // No need to implement a finalizer - SafeHandle's finalizer will call ReleaseHandle for you.
+ protected override bool ReleaseHandle()
+ {
+ Marshal.FreeHGlobal(handle);
+ return true;
+ }
+
+ // Allocate bytes with Marshal.AllocHGlobal() and wrap the result into a SafeHandle.
+ public static LocalAllocHandle Allocate(int numberOfBytes)
+ {
+ IntPtr nativeHandle = Marshal.AllocHGlobal(numberOfBytes);
+ LocalAllocHandle safeHandle = new LocalAllocHandle();
+ safeHandle.SetHandle(nativeHandle);
+ return safeHandle;
+ }
+}
+
+public class DisposableBaseWithSafeHandle : IDisposable
+{
+ // Detect redundant Dispose() calls.
+ private bool _isDisposed;
+
+ // Managed disposable objects owned by this class
+ private LocalAllocHandle? _safeHandle = LocalAllocHandle.Allocate(10);
+ private Stream? _otherUnmanagedResource = new MemoryStream();
+
+ // Public implementation of Dispose pattern callable by consumers.
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ // Protected implementation of Dispose pattern.
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!_isDisposed)
+ {
+ _isDisposed = true;
+
+ if (disposing)
+ {
+ // Dispose managed state.
+ _otherUnmanagedResource?.Dispose();
+ _safeHandle?.Dispose();
+ _otherUnmanagedResource = null;
+ _safeHandle = null;
+ }
+ }
+ }
+}
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/Program.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/Program.vb
index 841c53fa1991d..1ac27c8fd7cef 100644
--- a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/Program.vb
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/Program.vb
@@ -1,6 +1,13 @@
Module Program
Sub Main()
- Using disposable As New BaseClassWithSafeHandle
+ Using a As New DisposableDerived
+ End Using
+
+ Using b As New DisposableDerivedWithFinalizer
+ b.Dispose()
+ End Using
+
+ Using c As New DisposableBaseWithSafeHandle
End Using
End Sub
End Module
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base1.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base1.vb
index e0f548ed5b046..c35a2a80e8a03 100644
--- a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base1.vb
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base1.vb
@@ -1,32 +1,30 @@
-Imports Microsoft.Win32.SafeHandles
-Imports System.Runtime.InteropServices
+Imports System.IO
-Public Class BaseClassWithSafeHandle
+Public Class DisposableBase
Implements IDisposable
- ' To detect redundant calls
- Private _disposedValue As Boolean
+ ' Detect redundant Dispose() calls.
+ Private _isDisposed As Boolean
- ' Instantiate a SafeHandle instance.
- Private _safeHandle As SafeHandle = New SafeFileHandle(IntPtr.Zero, True)
+ ' Instantiate a disposable object owned by this class.
+ Private _managedResource As Stream = New MemoryStream()
' Public implementation of Dispose pattern callable by consumers.
- Public Sub Dispose() _
- Implements IDisposable.Dispose
+ Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
' Protected implementation of Dispose pattern.
- Protected Overridable Sub Dispose(ByVal disposing As Boolean)
- If Not _disposedValue Then
+ Protected Overridable Sub Dispose(disposing As Boolean)
+ If Not _isDisposed Then
+ _isDisposed = True
If disposing Then
- _safeHandle?.Dispose()
- _safeHandle = Nothing
+ ' Dispose managed state.
+ _managedResource?.Dispose()
+ _managedResource = Nothing
End If
-
- _disposedValue = True
End If
End Sub
End Class
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base2.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base2.vb
index 54fb833eb5cba..674b4ac999bdf 100644
--- a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base2.vb
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/base2.vb
@@ -1,31 +1,43 @@
-Public Class BaseClassWithFinalizer
+Imports System
+Imports System.IO
+Imports System.Runtime.InteropServices
+Imports System.Threading
+
+Public Class DisposableBaseWithFinalizer
Implements IDisposable
- ' To detect redundant calls
- Private _disposedValue As Boolean
+ ' Detect redundant Dispose() calls in a thread-safe manner.
+ ' _isDisposed == 0 means Dispose(bool) has not been called yet.
+ ' _isDisposed == 1 means Dispose(bool) has been already called.
+ Private _isDisposed As Integer
+
+ ' Instantiate a disposable object owned by this class.
+ Private _managedResource As Stream = New MemoryStream()
+
+ ' A pointer to 10 bytes allocated on the unmanaged heap.
+ Private _unmanagedResource As IntPtr = Marshal.AllocHGlobal(10)
Protected Overrides Sub Finalize()
Dispose(False)
End Sub
' Public implementation of Dispose pattern callable by consumers.
- Public Sub Dispose() _
- Implements IDisposable.Dispose
+ Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
' Protected implementation of Dispose pattern.
- Protected Overridable Sub Dispose(ByVal disposing As Boolean)
- If Not _disposedValue Then
-
+ Protected Overridable Sub Dispose(disposing As Boolean)
+ ' In case _isDisposed is 0, atomically set it to 1.
+ ' Enter the branch only if the original value is 0.
+ If Interlocked.CompareExchange(_isDisposed, 1, 0) = 0 Then
If disposing Then
- ' TODO: dispose managed state (managed objects)
+ _managedResource?.Dispose()
+ _managedResource = Nothing
End If
- ' TODO free unmanaged resources (unmanaged objects) And override finalizer
- ' TODO: set large fields to null
- _disposedValue = True
+ Marshal.FreeHGlobal(_unmanagedResource)
End If
End Sub
End Class
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived1.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived1.vb
index 83a005f785382..bff2a8aa89b3a 100644
--- a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived1.vb
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived1.vb
@@ -1,24 +1,23 @@
-Imports Microsoft.Win32.SafeHandles
-Imports System.Runtime.InteropServices
+Imports System.IO
-Public Class DerivedClassWithSafeHandle
- Inherits BaseClassWithSafeHandle
+Public Class DisposableDerived
+ Inherits DisposableBase
' To detect redundant calls
- Private _disposedValue As Boolean
+ Private _isDisposed As Boolean
- ' Instantiate a SafeHandle instance.
- Private _safeHandle As SafeHandle = New SafeFileHandle(IntPtr.Zero, True)
+ ' Instantiate a disposable object owned by this class.
+ Private _managedResource As Stream = New MemoryStream()
- Protected Overrides Sub Dispose(ByVal disposing As Boolean)
- If Not _disposedValue Then
+ ' Protected implementation of Dispose pattern.
+ Protected Overrides Sub Dispose(disposing As Boolean)
+ If Not _isDisposed Then
+ _isDisposed = True
If disposing Then
- _safeHandle?.Dispose()
- _safeHandle = Nothing
+ _managedResource?.Dispose()
+ _managedResource = Nothing
End If
-
- _disposedValue = True
End If
' Call base class implementation.
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived2.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived2.vb
index ed6e5b13b1ac1..662bc4a1db214 100644
--- a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived2.vb
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/derived2.vb
@@ -1,24 +1,28 @@
-Public Class DerivedClassWithFinalizer
- Inherits BaseClassWithFinalizer
+Imports System.Threading
- ' To detect redundant calls
- Private _disposedValue As Boolean
+Public Class DisposableDerivedWithFinalizer
+ Inherits DisposableBaseWithFinalizer
+
+ ' Detect redundant Dispose() calls in a thread-safe manner.
+ ' _isDisposed == 0 means Dispose(bool) has not been called yet.
+ ' _isDisposed == 1 means Dispose(bool) has been already called.
+ Private _isDisposed As Integer
Protected Overrides Sub Finalize()
Dispose(False)
End Sub
' Protected implementation of Dispose pattern.
- Protected Overrides Sub Dispose(ByVal disposing As Boolean)
- If Not _disposedValue Then
-
+ Protected Overrides Sub Dispose(disposing As Boolean)
+ ' In case _isDisposed is 0, atomically set it to 1.
+ ' Enter the branch only if the original value is 0.
+ If Interlocked.CompareExchange(_isDisposed, 1, 0) = 0 Then
If disposing Then
' TODO: dispose managed state (managed objects).
End If
- ' TODO free unmanaged resources (unmanaged objects) And override a finalizer below.
+ ' TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
' TODO: set large fields to null.
- _disposedValue = True
End If
' Call the base class implementation.
diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/safe.vb b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/safe.vb
new file mode 100644
index 0000000000000..ce4df58ea1509
--- /dev/null
+++ b/samples/snippets/visualbasic/VS_Snippets_CLR_System/system.idisposable/vb/safe.vb
@@ -0,0 +1,59 @@
+Imports System
+Imports System.IO
+Imports System.Runtime.InteropServices
+Imports Microsoft.Win32.SafeHandles
+
+' Wraps the IntPtr allocated by Marshal.AllocHGlobal() into a SafeHandle.
+Public Class LocalAllocHandle
+ Inherits SafeHandleZeroOrMinusOneIsInvalid
+
+ Private Sub New()
+ MyBase.New(True)
+ End Sub
+
+ ' No need to implement a finalizer - SafeHandle's finalizer will call ReleaseHandle for you.
+ Protected Overrides Function ReleaseHandle() As Boolean
+ Marshal.FreeHGlobal(handle)
+ Return True
+ End Function
+
+ ' Allocate bytes with Marshal.AllocHGlobal() and wrap the result into a SafeHandle.
+ Public Shared Function Allocate(numberOfBytes As Integer) As LocalAllocHandle
+ Dim nativeHandle As IntPtr = Marshal.AllocHGlobal(numberOfBytes)
+ Dim safeHandle As New LocalAllocHandle()
+ safeHandle.SetHandle(nativeHandle)
+ Return safeHandle
+ End Function
+End Class
+
+Public Class DisposableBaseWithSafeHandle
+ Implements IDisposable
+
+ ' Detect redundant Dispose() calls.
+ Private _isDisposed As Boolean
+
+ ' Managed disposable objects owned by this class
+ Private _safeHandle As LocalAllocHandle = LocalAllocHandle.Allocate(10)
+ Private _otherUnmanagedResource As Stream = New MemoryStream()
+
+ ' Public implementation of Dispose pattern callable by consumers.
+ Public Sub Dispose() Implements IDisposable.Dispose
+ Dispose(True)
+ GC.SuppressFinalize(Me)
+ End Sub
+
+ ' Protected implementation of Dispose pattern.
+ Protected Overridable Sub Dispose(disposing As Boolean)
+ If Not _isDisposed Then
+ _isDisposed = True
+
+ If disposing Then
+ ' Dispose managed state.
+ _otherUnmanagedResource?.Dispose()
+ _safeHandle?.Dispose()
+ _otherUnmanagedResource = Nothing
+ _safeHandle = Nothing
+ End If
+ End If
+ End Sub
+End Class