Просмотр исходного кода

Merge branch 'master' into merge/release/5.0-to-master

Sébastien Ros 5 лет назад
Родитель
Сommit
cdab3f203d
100 измененных файлов с 3111 добавлено и 1156 удалено
  1. 67 0
      .azure/pipelines/blazor-daily-tests.yml
  2. 76 16
      .azure/pipelines/ci.yml
  3. 5 4
      .azure/pipelines/helix-matrix.yml
  4. 9 1
      .azure/pipelines/jobs/default-build.yml
  5. 36 1
      .azure/pipelines/quarantined-pr.yml
  6. 4 3
      .azure/pipelines/quarantined-tests.yml
  7. 5 0
      .editorconfig
  8. 3 2
      .github/CODEOWNERS
  9. 1 1
      .github/ISSUE_TEMPLATE/bug_report.md
  10. 49 0
      .github/ISSUE_TEMPLATE/design_proposal.md
  11. 5 18
      .github/ISSUE_TEMPLATE/razor_tooling.md
  12. 4 4
      .github/workflows/runtime-sync.yml
  13. 213 50
      AspNetCore.sln
  14. 9 12
      Directory.Build.props
  15. 18 26
      Directory.Build.targets
  16. 3 0
      NuGet.config
  17. 24 0
      THIRD-PARTY-NOTICES.txt
  18. 11 9
      build.ps1
  19. 13 13
      build.sh
  20. 1 0
      dockerbuild.sh
  21. 1 0
      docs/APIReviewProcess.md
  22. 75 12
      docs/BuildErrors.md
  23. 194 119
      docs/BuildFromSource.md
  24. 0 62
      docs/PackageArchives.md
  25. 19 4
      docs/README.md
  26. 1 1
      docs/ReferenceResolution.md
  27. 1 1
      docs/TriageProcess.md
  28. 12 13
      docs/area-owners.md
  29. 1 1
      eng/AfterSolutionBuild.targets
  30. 12 7
      eng/Build.props
  31. 7 7
      eng/Dependencies.props
  32. 3 0
      eng/ProjectReferences.props
  33. 0 64
      eng/PublishSymbols.proj
  34. 0 4
      eng/Publishing.props
  35. 6 1
      eng/QuarantinedTests.BeforeArcade.props
  36. 41 41
      eng/SharedFramework.External.props
  37. 1 0
      eng/Signing.props
  38. 1 1
      eng/Tools.props
  39. 153 157
      eng/Version.Details.xml
  40. 185 173
      eng/Versions.props
  41. 1 1
      eng/Workarounds.props
  42. 2 21
      eng/Workarounds.targets
  43. 43 0
      eng/common/cross/armel/armel.jessie.patch
  44. 14 0
      eng/common/cross/build-rootfs.sh
  45. 11 0
      eng/common/cross/s390x/sources.list.bionic
  46. 9 2
      eng/common/cross/toolchain.cmake
  47. 47 6
      eng/common/performance/crossgen_perf.proj
  48. 3 1
      eng/common/performance/performance-setup.ps1
  49. 10 1
      eng/common/performance/performance-setup.sh
  50. 61 43
      eng/common/pipeline-logging-functions.ps1
  51. 25 1
      eng/common/pipeline-logging-functions.sh
  52. 3 3
      eng/common/post-build/post-build-utils.ps1
  53. 6 0
      eng/common/post-build/publish-using-darc.ps1
  54. 8 7
      eng/common/post-build/sourcelink-validation.ps1
  55. 52 24
      eng/common/post-build/symbols-validation.ps1
  56. 5 13
      eng/common/templates/job/job.yml
  57. 4 63
      eng/common/templates/post-build/post-build.yml
  58. 13 4
      eng/common/tools.ps1
  59. 20 7
      eng/common/tools.sh
  60. 2 2
      eng/helix/content/RunTests/ProcessUtil.cs
  61. 5 0
      eng/helix/content/RunTests/RunTestsOptions.cs
  62. 1 1
      eng/helix/content/RunTests/TestRunner.cs
  63. 8 4
      eng/helix/content/runtests.cmd
  64. 16 7
      eng/helix/content/runtests.sh
  65. 7 5
      eng/scripts/CodeCheck.ps1
  66. 19 14
      eng/scripts/ci-source-build.sh
  67. 1 1
      eng/targets/CSharp.Common.props
  68. 13 7
      eng/targets/Helix.Common.props
  69. 4 7
      eng/targets/Helix.targets
  70. 2 2
      eng/targets/Npm.Common.targets
  71. 1 1
      eng/targets/Packaging.targets
  72. 2 1
      eng/targets/ResolveReferences.targets
  73. 1 1
      eng/tools/BaselineGenerator/BaselineGenerator.csproj
  74. 76 38
      eng/tools/BaselineGenerator/Program.cs
  75. 1 1
      eng/tools/BaselineGenerator/README.md
  76. 0 1
      eng/tools/GenerateFiles/Directory.Build.props.in
  77. 68 19
      eng/tools/GenerateFiles/Directory.Build.targets.in
  78. 6 5
      eng/tools/GenerateFiles/GenerateFiles.csproj
  79. 4 0
      eng/tools/RepoTasks/.editorconfig
  80. 2 0
      eng/tools/RepoTasks/RepoTasks.csproj
  81. 1 1
      eng/tools/RepoTasks/RepoTasks.tasks
  82. 7 7
      global.json
  83. 2 2
      src/Analyzers/Analyzers/test/AnalyzerTestBase.cs
  84. 1 1
      src/Antiforgery/src/Internal/DefaultAntiforgery.cs
  85. 3 3
      src/Antiforgery/test/DefaultAntiforgeryTest.cs
  86. 11 0
      src/Caching/Caching.slnf
  87. 21 0
      src/Caching/README.md
  88. 25 0
      src/Caching/SqlServer/src/Columns.cs
  89. 327 0
      src/Caching/SqlServer/src/DatabaseOperations.cs
  90. 31 0
      src/Caching/SqlServer/src/IDatabaseOperations.cs
  91. 25 0
      src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj
  92. 204 0
      src/Caching/SqlServer/src/MonoDatabaseOperations.cs
  93. 46 0
      src/Caching/SqlServer/src/MonoSqlParameterCollectionExtensions.cs
  94. 21 0
      src/Caching/SqlServer/src/PlatformHelper.cs
  95. 27 0
      src/Caching/SqlServer/src/PublicAPI.Shipped.txt
  96. 1 0
      src/Caching/SqlServer/src/PublicAPI.Unshipped.txt
  97. 101 0
      src/Caching/SqlServer/src/SqlParameterCollectionExtensions.cs
  98. 97 0
      src/Caching/SqlServer/src/SqlQueries.cs
  99. 260 0
      src/Caching/SqlServer/src/SqlServerCache.cs
  100. 55 0
      src/Caching/SqlServer/src/SqlServerCacheOptions.cs

+ 67 - 0
.azure/pipelines/blazor-daily-tests.yml

@@ -0,0 +1,67 @@
+# Uses Scheduled Triggers, which aren't supported in YAML yet.
+# https://docs.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=vsts&tabs=yaml#scheduled
+
+# Daily Tests for Blazor
+# These use Sauce Labs resources, hence they run daily rather than per-commit.
+
+# We just need one Windows machine because all it does is trigger SauceLabs.
+variables:
+  - ${{ if ne(variables['System.TeamProject'], 'public') }}:
+      - group: DotNet-MSRC-Storage
+      - group: AzureDevOps-Artifact-Feeds-Pats
+  - name: SAUCE_CONNECT_DOWNLOAD_ON_INSTALL
+    value: true
+  - name: E2ETESTS_SauceTest
+    value: true
+  - name: E2ETESTS_Sauce__TunnelIdentifier
+    value: 'blazor-e2e-sc-proxy-tunnel'
+  - name: E2ETESTS_Sauce__HostName
+    value: 'sauce.local'
+
+jobs:
+- template: jobs/default-build.yml
+  parameters:
+    buildDirectory: src/Components
+    isTestingJob: true
+    agentOs: Windows
+    jobName: BlazorDailyTests
+    jobDisplayName: "Blazor Daily Tests"
+    afterBuild:
+
+    # macOS/Safari
+    - script: 'dotnet test --no-build --configuration Release --filter "StandaloneAppTest"'
+      workingDirectory: 'src/Components/test/E2ETest'
+      displayName: 'Run Blazor tests - macOS/Safari'
+      condition: succeededOrFailed()
+      env:
+        # Secrets need to be explicitly mapped to env variables.
+        E2ETESTS_Sauce__Username: '$(asplab-sauce-labs-username)'
+        E2ETESTS_Sauce__AccessKey: '$(asplab-sauce-labs-access-key)'
+        # Set platform/browser configuration.
+        E2ETESTS_Sauce__TestName: 'Blazor Daily Tests - macOS/Safari'
+        E2ETESTS_Sauce__PlatformName: 'macOS 10.14'
+        E2ETESTS_Sauce__BrowserName: 'Safari'
+        # Need to explicitly set version here because some older versions don't support timeouts in Safari.
+        E2ETESTS_Sauce__SeleniumVersion: '3.4.0'
+
+    # Android/Chrome
+    - script: 'dotnet test --no-build --configuration Release --filter "StandaloneAppTest"'
+      workingDirectory: 'src/Components/test/E2ETest'
+      displayName: 'Run Blazor tests - Android/Chrome'
+      condition: succeededOrFailed()
+      env:
+        # Secrets need to be explicitly mapped to env variables.
+        E2ETESTS_Sauce__Username: '$(asplab-sauce-labs-username)'
+        E2ETESTS_Sauce__AccessKey: '$(asplab-sauce-labs-access-key)'
+        # Set platform/browser configuration.
+        E2ETESTS_Sauce__TestName: 'Blazor Daily Tests - Android/Chrome'
+        E2ETESTS_Sauce__PlatformName: 'Android'
+        E2ETESTS_Sauce__PlatformVersion: '10.0'
+        E2ETESTS_Sauce__BrowserName: 'Chrome'
+        E2ETESTS_Sauce__DeviceName: 'Android GoogleAPI Emulator'
+        E2ETESTS_Sauce__DeviceOrientation: 'portrait'
+        E2ETESTS_Sauce__AppiumVersion: '1.9.1'
+    artifacts:
+    - name: Windows_Logs
+      path: artifacts/log/
+      publishOnError: true

+ 76 - 16
.azure/pipelines/ci.yml

@@ -7,10 +7,21 @@ trigger:
   batch: true
   branches:
     include:
-    - blazor-wasm
     - master
     - release/*
     - internal/release/*
+  paths:
+    exclude:
+    - .github/*
+    - .vscode/*
+    # Exclude only a few specific Markdown files because some of them ship.
+    - docs/*
+    - CODE-OF-CONDUCT.md
+    - CONTRIBUTING.md
+    - LICENSE.TXT
+    - README.md
+    - SECURITY.md
+    # Do not ignore the THIRD-PARTY-NOTICES.TXT file because it ships.
 
 # Run PR validation on all branches
 pr:
@@ -18,6 +29,17 @@ pr:
   branches:
     include:
     - '*'
+  paths:
+    exclude:
+    - .github/*
+    - .vscode/*
+    - '**/*.md'
+    - CODE-OF-CONDUCT.md
+    - CONTRIBUTING.md
+    - LICENSE.TXT
+    - README.md
+    - SECURITY.md
+    - THIRD-PARTY-NOTICES.TXT
 
 variables:
 - name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
@@ -33,12 +55,13 @@ variables:
 - name: _DotNetValidationArtifactsCategory
   value: .NETCORE
 - name: PostBuildSign
-  value: false
+  value: true
 - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
   - name: _BuildArgs
     value: /p:TeamName=$(_TeamName)
            /p:OfficialBuildId=$(Build.BuildNumber)
            /p:SkipTestBuild=true
+           /p:PostBuildSign=$(PostBuildSign)
   # DotNet-Blob-Feed provides: dotnetfeed-storage-access-key-1
   # Publish-Build-Assets provides: MaestroAccessToken, BotAccount-dotnet-maestro-bot-PAT
   - group: DotNet-Blob-Feed
@@ -67,7 +90,7 @@ variables:
     value: -ExcludeCIBinaryLog
 - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}:
   - name: _BuildArgs
-    value: '/p:SkipTestBuild=true'
+    value: '/p:SkipTestBuild=true /p:PostBuildSign=$(PostBuildSign)'
   - name: _PublishArgs
     value: ''
   # Write binary logs for all main Windows build steps except the x86 one in public and PR builds.
@@ -95,13 +118,15 @@ variables:
 - ${{ if eq(variables['System.TeamProject'], 'internal') }}:
   - group: DotNet-MSRC-Storage
   - name: _InternalRuntimeDownloadArgs
-    value: -DotNetRuntimeSourceFeed https://dotnetclimsrc.blob.core.windows.net/dotnet -DotNetRuntimeSourceFeedKey
-           $(dotnetclimsrc-read-sas-token-base64) /p:DotNetAssetRootAccessTokenSuffix='$(dotnetclimsrc-read-sas-token-base64)'
-  # The code signing doesn't use the aspnet build scripts, so the msbuild parameters have
-  # to be passed directly. This is awkward, since we pass the same info above, but we have
-  # to have it in two different forms
+    value: -RuntimeSourceFeed https://dotnetclimsrc.blob.core.windows.net/dotnet
+           -RuntimeSourceFeedKey $(dotnetclimsrc-read-sas-token-base64)
+           /p:DotNetAssetRootAccessTokenSuffix='$(dotnetclimsrc-read-sas-token-base64)'
+  # The code signing doesn't use the aspnet build scripts, so the msbuild parameters have to be passed directly. This
+  # is awkward but necessary because the eng/common/ build scripts don't add the msbuild properties automatically.
   - name: _InternalRuntimeDownloadCodeSignArgs
-    value: /p:DotNetRuntimeSourceFeed=https://dotnetclimsrc.blob.core.windows.net/dotnet /p:DotNetRuntimeSourceFeedKey=$(dotnetclimsrc-read-sas-token-base64)
+    value: $(_InternalRuntimeDownloadArgs)
+           /p:DotNetRuntimeSourceFeed=https://dotnetclimsrc.blob.core.windows.net/dotnet
+           /p:DotNetRuntimeSourceFeedKey=$(dotnetclimsrc-read-sas-token-base64)
   - group: DotNet-HelixApi-Access
   - name: _UseHelixOpenQueues
     value: 'false'
@@ -326,11 +351,43 @@ stages:
             publishFeedCredentials: 'DevDiv - VS package feed'
 
 
-  # Build MacOS
+  # Build MacOS arm64
+  - template: jobs/default-build.yml
+    parameters:
+      jobName: MacOs_arm64_build
+      jobDisplayName: "Build: macOS arm64"
+      agentOs: macOs
+      buildArgs:
+        --arch arm64
+        --pack
+        --all
+        --no-build-nodejs
+        --no-build-java
+        -p:OnlyPackPlatformSpecificPackages=true
+        -p:AssetManifestFileName=aspnetcore-MacOS_arm64.xml
+        $(_BuildArgs)
+        $(_PublishArgs)
+        $(_InternalRuntimeDownloadArgs)
+      installNodeJs: false
+      installJdk: false
+      artifacts:
+      - name: MacOS_arm64_Logs
+        path: artifacts/log/
+        publishOnError: true
+        includeForks: true
+      - name: MacOS_arm64_Packages
+        path: artifacts/packages/
+
+  - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+    - template: jobs/codesign-xplat.yml
+      parameters:
+        inputName: MacOS_arm64
+
+  # Build MacOS x64
   - template: jobs/default-build.yml
     parameters:
       jobName: MacOs_x64_build
-      jobDisplayName: "Build: macOS"
+      jobDisplayName: "Build: macOS x64"
       agentOs: macOs
       buildArgs:
         --pack
@@ -375,7 +432,6 @@ stages:
             -p:OnlyPackPlatformSpecificPackages=true
             -p:AssetManifestFileName=aspnetcore-Linux_x64.xml
             $(_BuildArgs)
-            $(_PublishArgs)
             $(_InternalRuntimeDownloadArgs)
         displayName: Run build.sh
       - script: |
@@ -405,7 +461,7 @@ stages:
             -p:OnlyPackPlatformSpecificPackages=true \
             -p:BuildRuntimeArchive=false \
             -p:LinuxInstallerType=rpm \
-            -p:AssetManifestFileName=aspnetcore-Linux_x64-installers.xml \
+            -p:AssetManifestFileName=aspnetcore-Linux_x64.xml \
             $(_BuildArgs) \
             $(_PublishArgs) \
             $(_InternalRuntimeDownloadArgs)
@@ -555,9 +611,11 @@ stages:
         includeForks: true
       - name: Linux_musl_arm_Packages
         path: artifacts/packages/
-  - template: jobs/codesign-xplat.yml
-    parameters:
-      inputName: Linux_musl_arm
+
+  - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+    - template: jobs/codesign-xplat.yml
+      parameters:
+        inputName: Linux_musl_arm
 
   # Build Linux Musl ARM64
   - template: jobs/default-build.yml
@@ -633,6 +691,7 @@ stages:
         jobDisplayName: "Test: Templates - Windows Server 2016 x64"
         agentOs: Windows
         isTestingJob: true
+        testRunTitle: Templates-$(AgentOsName)-$(BuildConfiguration)
         steps:
         - script: ./build.cmd -ci -nobl -all -pack $(_InternalRuntimeDownloadArgs)
           displayName: Build Repo
@@ -787,6 +846,7 @@ stages:
           - Windows_arm_build
           - Windows_arm64_build
           - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+            - CodeSign_Xplat_MacOS_arm64
             - CodeSign_Xplat_MacOS_x64
             - CodeSign_Xplat_Linux_x64
             - CodeSign_Xplat_Linux_arm

+ 5 - 4
.azure/pipelines/helix-matrix.yml

@@ -32,7 +32,7 @@ jobs:
     timeoutInMinutes: 480
     steps:
     # Build the shared framework
-    - script: ./build.cmd -ci -nobl -all -pack -arch x64 /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
+    - script: ./build.cmd -ci -nobl -all -pack -arch x64
               /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
       displayName: Build shared fx
     - script: ./build.cmd -ci -nobl -noBuildRepoTasks -restore -noBuild -noBuildNative -projects src/Grpc/**/*.csproj
@@ -58,11 +58,12 @@ jobs:
     agentOs: Linux
     timeoutInMinutes: 480
     steps:
-    - script: ./restore.sh --ci --nobl --arch arm64
-      displayName: Restore
+    - script: ./build.sh --ci --nobl --pack --arch arm64
+              /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
+      displayName: Build shared Fx
     - script: ./build.sh --ci --nobl --arch arm64 --noBuildRepoTasks --no-build-nodejs --no-restore --test --all
               --projects $(Build.SourcesDirectory)/eng/helix/helix.proj /p:IsHelixJob=true /p:IsHelixDaily=true
-              /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
+              /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
       displayName: Run build.sh helix arm64 target
       env:
         HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues

+ 9 - 1
.azure/pipelines/jobs/default-build.yml

@@ -60,6 +60,7 @@ parameters:
   installNodeJs: true
   installJdk: true
   timeoutInMinutes: 180
+  testRunTitle: $(AgentOsName)-$(BuildConfiguration)
   useHostedUbuntu: true
   skipComponentGovernanceDetection: false
 
@@ -83,6 +84,8 @@ jobs:
       enablePublishBuildAssets: true
       enablePublishUsingPipelines: ${{ variables._PublishUsingPipelines }}
     enablePublishTestResults: ${{ eq(parameters.isTestingJob, 'true') }} # publish test results to AzDO (populates AzDO Tests tab)
+    mergeTestResults: true
+    testRunTitle: ${{ parameters.testRunTitle }}
     enableTelemetry: true
     helixRepo: dotnet/aspnetcore
     helixType: build.product/
@@ -92,7 +95,7 @@ jobs:
     # See https://github.com/dotnet/arcade/blob/master/Documentation/ChoosingAMachinePool.md
     pool:
       ${{ if eq(parameters.agentOs, 'macOS') }}:
-        vmImage: macOS-10.14
+        vmImage: macOS-10.15
       ${{ if eq(parameters.agentOs, 'Linux') }}:
         ${{ if eq(parameters.useHostedUbuntu, true) }}:
           vmImage: ubuntu-16.04
@@ -143,6 +146,9 @@ jobs:
     - ${{ if ne(parameters.agentOs, 'Windows') }}:
       - script: df -h
         displayName: Disk size
+    - ${{ if eq(parameters.agentOs, 'macOS') }}:
+      - script: sudo xcode-select -s /Applications/Xcode_12.2.app/Contents/Developer
+        displayName: Use XCode 12.2
     - checkout: self
       clean: true
     - ${{ if and(eq(parameters.agentOs, 'Windows'), eq(parameters.isTestingJob, true)) }}:
@@ -281,5 +287,7 @@ jobs:
         inputs:
           testRunner: junit
           testResultsFiles: '**/artifacts/log/**/*.junit.xml'
+          testRunTitle: $(AgentOsName)-$(BuildConfiguration)-js
+          mergeTestResults: true
           buildConfiguration: $(BuildConfiguration)
           buildPlatform: $(AgentOsName)

+ 36 - 1
.azure/pipelines/quarantined-pr.yml

@@ -1,17 +1,46 @@
-# We want to run quarantined tests on master as well as on PRs
+#
+# See https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema for details on this file.
+#
+
+# Configure which branches trigger builds
+# We want to run quarantined tests on release/5.0 and master as well as on PRs
 trigger:
   batch: true
   branches:
     include:
     - master
     - release/5.0
+  paths:
+    exclude:
+    - .github/*
+    - .vscode/*
+    # Exclude only a few specific Markdown files because some of them ship.
+    - docs/*
+    - CODE-OF-CONDUCT.md
+    - CONTRIBUTING.md
+    - LICENSE.TXT
+    - README.md
+    - SECURITY.md
+    # Do not ignore the THIRD-PARTY-NOTICES.TXT file because it ships.
 
+# Run PR validation on branches that include Helix tests
 pr:
   autoCancel: true
   branches:
     include:
     - master
     - release/5.0
+  paths:
+    exclude:
+    - .github/*
+    - .vscode/*
+    - '**/*.md'
+    - CODE-OF-CONDUCT.md
+    - CONTRIBUTING.md
+    - LICENSE.TXT
+    - README.md
+    - SECURITY.md
+    - THIRD-PARTY-NOTICES.TXT
 
 schedules:
 - cron: "0 */4 * * *"
@@ -81,6 +110,8 @@ jobs:
         testResultsFormat: 'xUnit'
         testResultsFiles: '*.xml'
         searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
+        testRunTitle: Quarantine-$(AgentOsName)-$(BuildConfiguration)-xunit
+        mergeTestResults: true
       condition: always()
     artifacts:
     - name: Windows_Quarantined_Test_Logs
@@ -114,6 +145,8 @@ jobs:
         testResultsFormat: 'xUnit'
         testResultsFiles: '*.xml'
         searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
+        testRunTitle: Quarantine-$(AgentOsName)-$(BuildConfiguration)-xunit
+        mergeTestResults: true
       condition: always()
     artifacts:
     - name: MacOS_Quarantined_Test_Logs
@@ -148,6 +181,8 @@ jobs:
         testResultsFormat: 'xUnit'
         testResultsFiles: '*.xml'
         searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)/Quarantined'
+        testRunTitle: Quarantine-$(AgentOsName)-$(BuildConfiguration)-xunit
+        mergeTestResults: true
       condition: always()
     artifacts:
     - name: Linux_Quarantined_Test_Logs

+ 4 - 3
.azure/pipelines/quarantined-tests.yml

@@ -56,11 +56,12 @@ jobs:
     agentOs: Linux
     timeoutInMinutes: 480
     steps:
-    - script: ./restore.sh --ci --nobl --arch arm64
-      displayName: Restore
+    - script: ./build.sh --ci --nobl --pack --arch arm64
+              /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
+      displayName: Build shared Fx
     - script: ./build.sh --ci --nobl  --arch arm64 --noBuildRepoTasks --no-build-nodejs --no-restore --test --all
               --projects $(Build.SourcesDirectory)/eng/helix/helix.proj /p:IsHelixJob=true /p:IsHelixDaily=true
-              /p:RunQuarantinedTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
+              /p:RunQuarantinedTests=true /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log
       displayName: Run build.sh helix arm64 target
       continueOnError: true
       env:

+ 5 - 0
.editorconfig

@@ -42,3 +42,8 @@ end_of_line = lf
 
 [*.{razor,cshtml}]
 charset = utf-8-bom
+
+[*.cs]
+dotnet_diagnostic.CA1304.severity = error
+dotnet_diagnostic.CA1305.severity = error
+dotnet_diagnostic.CA1310.severity = error

+ 3 - 2
.github/CODEOWNERS

@@ -4,11 +4,12 @@
 /global.json                    @aspnet/build
 /.azure/                        @aspnet/build
 /.config/                       @aspnet/build
-/build/                         @aspnet/build
 /eng/                           @aspnet/build
 /eng/common/                    @dotnet-maestro-bot
 /eng/Versions.props             @dotnet-maestro-bot @dougbu
 /eng/Version.Details.xml        @dotnet-maestro-bot @dougbu
+/src/**/PublicAPI.Unshipped.txt @dotnet/aspnet-api-review
+/src/**/PublicAPI.Shipped.txt   @dotnet/aspnet-api-review
 /src/Components/                @SteveSandersonMS @dotnet/aspnet-blazor-eng
 /src/DefaultBuilder/            @tratcher
 /src/Hosting/                   @tratcher
@@ -17,7 +18,7 @@
 /src/Middleware/                @tratcher
 /src/Middleware/HttpsPolicy/    @jkotalik
 /src/Middleware/Rewrite/        @jkotalik
-# /src/ProjectTemplates/        @ryanbrandenburg
+/src/Mvc/                       @pranavkm @javiercn
 /src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/  @dotnet/aspnet-blazor-eng
 /src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/  @dotnet/aspnet-blazor-eng
 /src/Security/                  @tratcher

+ 1 - 1
.github/ISSUE_TEMPLATE/bug_report.md

@@ -35,4 +35,4 @@ Include the exception you get when facing this issue
 ### Further technical details
 - ASP.NET Core version
 - Include the output of `dotnet --info`
-- The IDE (VS / VS Code/ VS4Mac) you're running on, and it's version
+- The IDE (VS / VS Code/ VS4Mac) you're running on, and its version

+ 49 - 0
.github/ISSUE_TEMPLATE/design_proposal.md

@@ -0,0 +1,49 @@
+---
+name: 🤔 Design proposal
+about: Collaborate on a design for a feature/fix or other change
+labels: design-proposal
+---
+
+<!--
+This template is useful to build consensus about whether work should be done, and if so, the high-level shape of how it should be approached. Use this before fixating on a particular implementation.
+-->
+
+## Summary
+
+1-2 sentences. Say what this is about.
+
+## Motivation and goals
+
+1-2 paragraphs, or a bullet-pointed list. What existing pain points does this solve? What evidence shows it's valuable to solve this?
+
+## In scope
+
+A list of major scenarios, perhaps in priority order.
+
+## Out of scope
+
+Scenarios you explicitly want to exclude.
+
+## Risks / unknowns
+
+How might developers misinterpret/misuse this? How might implementing it restrict us from other enhancements in the future? Also list any perf/security/correctness concerns.
+
+## Examples
+
+Give brief examples of possible developer experiences (e.g., code they would write).
+
+Don't be deeply concerned with how it would be implemented yet. Your examples could even be from other technology stacks.
+
+<!--
+# Detailed design
+
+It's often best not to fill this out until you get basic consensus about the above. When you do, consider adding an implementation proposal with the following headings:
+
+Detailed design
+Drawbacks
+Considered alternatives
+Open questions
+References
+
+If there's one clear design you have consensus on, you could do that directly in a PR.
+-->

+ 5 - 18
.github/ISSUE_TEMPLATE/razor_tooling.md

@@ -34,26 +34,13 @@ We will close this issue if:
 
 Please collect the data below before reporting your issue to aid us in diagnosing the root cause.
 
-#### Activity log
+#### Activity log (only needed if VS crashes)
 [Here](https://docs.microsoft.com/en-us/visualstudio/extensibility/how-to-use-the-activity-log?view=vs-2019#to-examine-the-activity-log) are the instructions on how to generate/acquire one. Note that GitHub does not generally allow .xml files to be uploaded with issues.
 
-#### Razor Language Server Client log
-<!-- In Visual Studio's `Output` window, the drop-down contains a `Razor Language Server Client` item. Include that below. -->
-<details>
-<summary>Razor Language Server Client Log Output</summary>
-
-Paste log output here
-
-</details>
-
-#### HTML Language Server Client log
-<!-- In Visual Studio's `Output` window, the drop-down contains a `HtmlyLanguageClient` item. Include that below. -->
-<details>
-<summary>HTML Language Server Client Log Output</summary>
-
-Paste log output here
-
-</details>
+#### Language Server logs
+1. Run Visual Studio with the [/Log](https://docs.microsoft.com/en-us/visualstudio/ide/reference/log-devenv-exe?view=vs-2019) command line switch
+2. Reproduce the issue
+3. Provide the logs located at `%Temp%\VisualStudio\LSP`
 
 ### Further technical details
 - VS version (Help => About Microsoft Visual Studio, i.e. 16.8.0 Preview 1 30313.27...). If in Codespaces there will be two versions (server and client), please provide both.

+ 4 - 4
.github/workflows/runtime-sync.yml

@@ -21,14 +21,14 @@ jobs:
         # Test this script using changes in a fork 
         repository: 'dotnet/aspnetcore'
         path: aspnetcore
-        ref: release/5.0
+        ref: master
     - name: Checkout runtime
       uses: actions/[email protected]
       with:
         # Test this script using changes in a fork 
         repository: 'dotnet/runtime'
         path: runtime
-        ref: release/5.0
+        ref: master
     - name: Copy
       shell: cmd
       working-directory: .\runtime\src\libraries\Common\src\System\Net\Http\aspnetcore\
@@ -59,7 +59,7 @@ jobs:
     - name: Send PR
       if: steps.check.outputs.changed == 'true'
       # https://github.com/marketplace/actions/create-pull-request
-      uses: peter-evans/create-pull-request@v2
+      uses: peter-evans/create-pull-request@v3
       with:
         token: ${{ secrets.GITHUB_TOKEN }}
         path: .\aspnetcore
@@ -67,6 +67,6 @@ jobs:
         title: 'Sync shared code from runtime'
         body: 'This PR was automatically generated to sync shared code changes from runtime. Fixes #18943'
         labels: area-servers
-        base: release/5.0
+        base: master
         branch: github-action/sync-runtime
         branch-suffix: timestamp

+ 213 - 50
AspNetCore.sln

@@ -861,18 +861,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebSoc
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching.Microbenchmarks", "src\Middleware\perf\ResponseCaching.Microbenchmarks\Microsoft.AspNetCore.ResponseCaching.Microbenchmarks.csproj", "{8A745E35-8098-4EB4-AC55-587B9F0DC4BE}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MusicStore", "MusicStore", "{884AED21-7931-42A3-B08A-E58F7B0D6E7F}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{8DA88110-5A13-41A9-9F9D-674D921EB442}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore", "src\MusicStore\samples\MusicStore\MusicStore.csproj", "{4BCF2228-159D-4547-8D54-CDD2252D076A}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{2D347127-3B13-47B1-84EC-770A9C1E11B0}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore.Test", "src\MusicStore\test\MusicStore.Test\MusicStore.Test.csproj", "{A7802482-55BA-4D95-BE79-8A601131F527}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusicStore.E2ETests", "src\MusicStore\test\MusicStore.E2ETests\MusicStore.E2ETests.csproj", "{81947277-035F-41F6-A1D4-8EA362CB46D2}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MicrosoftAccount", "MicrosoftAccount", "{8C4006DF-FF48-46B6-A124-10B1EEAA266E}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.MicrosoftAccount", "src\Security\Authentication\MicrosoftAccount\src\Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj", "{F5C54062-B19C-4291-A816-F1B5A167369A}"
@@ -1519,6 +1511,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Loggin
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Logging.AzureAppServices.Tests", "src\Logging.AzureAppServices\test\Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj", "{43E3B132-2486-44A3-92C6-39E39724FAFD}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{7B739F28-21DE-435D-9EA6-579064932350}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RoutingWebSite", "src\Http\Routing\test\testassets\RoutingWebSite\RoutingWebSite.csproj", "{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RoutingSandbox", "src\Http\Routing\test\testassets\RoutingSandbox\RoutingSandbox.csproj", "{0EBEE047-CBAD-4A69-8095-E3961B863446}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Benchmarks", "src\Http\Routing\test\testassets\Benchmarks\Benchmarks.csproj", "{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}"
+EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SiteExtensions", "SiteExtensions", "{DFC4F588-B4B4-484B-AB93-B36721374AD3}"
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LoggingAggregate", "LoggingAggregate", "{48FF1D87-5066-4294-B802-2D1B478C6EB6}"
@@ -1541,6 +1541,36 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HostingStartup", "src\SiteE
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomBasePathApp", "src\Components\WebAssembly\testassets\CustomBasePathApp\CustomBasePathApp.csproj", "{E2461809-D2EA-436D-B5C3-8A9EE0A283B8}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IgnitorSample", "src\Components\Samples\IgnitorSample\IgnitorSample.csproj", "{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Tests.Utils", "src\SignalR\common\testassets\Tests.Utils\Microsoft.AspNetCore.SignalR.Tests.Utils.csproj", "{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{BB3D6EDD-AE71-4D25-B61B-7EBF7A1BA1D1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Analyzer.Testing", "src\Analyzers\Microsoft.AspNetCore.Analyzer.Testing\src\Microsoft.AspNetCore.Analyzer.Testing.csproj", "{399EF81E-C3B5-4D86-8BF1-DC7926252A63}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Caching", "Caching", "{0F39820F-F4A5-41C6-9809-D79B68F032EF}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HttpClientFactory", "HttpClientFactory", "{8DFA596B-BD00-404E-9445-BCFAC65BDC34}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http.Polly", "src\HttpClientFactory\Polly\src\Microsoft.Extensions.Http.Polly.csproj", "{4FB95E16-918B-49C1-9F65-49D07CDE072C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http.Polly.Tests", "src\HttpClientFactory\Polly\test\Microsoft.Extensions.Http.Polly.Tests.csproj", "{8001580F-B702-404B-A0FD-13538DDB9672}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SqlServer", "SqlServer", "{43ED0D49-E29A-4B12-8D10-531E006038E5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StackExchangeRedis", "StackExchangeRedis", "{A7B8F295-AD6E-42C1-A215-17337033EBE9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Caching.SqlServer", "src\Caching\SqlServer\src\Microsoft.Extensions.Caching.SqlServer.csproj", "{A19F94D3-0C6A-429D-811A-7A750AAD122A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Caching.SqlServer.Tests", "src\Caching\SqlServer\test\Microsoft.Extensions.Caching.SqlServer.Tests.csproj", "{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Caching.StackExchangeRedis", "src\Caching\StackExchangeRedis\src\Microsoft.Extensions.Caching.StackExchangeRedis.csproj", "{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Caching.StackExchangeRedis.Tests", "src\Caching\StackExchangeRedis\test\Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj", "{14DBB385-A1B1-49B2-A737-4DF90E127E5A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IStartupInjectionAssemblyName", "src\Hosting\test\testassets\IStartupInjectionAssemblyName\IStartupInjectionAssemblyName.csproj", "{5FD94164-7D13-4618-93AD-7346B0EA0CDD}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -4431,42 +4461,6 @@ Global
 		{8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Release|x64.Build.0 = Release|Any CPU
 		{8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Release|x86.ActiveCfg = Release|Any CPU
 		{8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Release|x86.Build.0 = Release|Any CPU
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|Any CPU.ActiveCfg = Debug|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|Any CPU.Build.0 = Debug|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|x64.ActiveCfg = Debug|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|x64.Build.0 = Debug|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|x86.ActiveCfg = Debug|x86
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Debug|x86.Build.0 = Debug|x86
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|Any CPU.ActiveCfg = Release|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|Any CPU.Build.0 = Release|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|x64.ActiveCfg = Release|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|x64.Build.0 = Release|x64
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|x86.ActiveCfg = Release|x86
-		{4BCF2228-159D-4547-8D54-CDD2252D076A}.Release|x86.Build.0 = Release|x86
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|x64.Build.0 = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Debug|x86.Build.0 = Debug|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|x64.ActiveCfg = Release|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|x64.Build.0 = Release|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|x86.ActiveCfg = Release|Any CPU
-		{A7802482-55BA-4D95-BE79-8A601131F527}.Release|x86.Build.0 = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|x64.Build.0 = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Debug|x86.Build.0 = Debug|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|x64.ActiveCfg = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|x64.Build.0 = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|x86.ActiveCfg = Release|Any CPU
-		{81947277-035F-41F6-A1D4-8EA362CB46D2}.Release|x86.Build.0 = Release|Any CPU
 		{F5C54062-B19C-4291-A816-F1B5A167369A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{F5C54062-B19C-4291-A816-F1B5A167369A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{F5C54062-B19C-4291-A816-F1B5A167369A}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -7297,6 +7291,42 @@ Global
 		{43E3B132-2486-44A3-92C6-39E39724FAFD}.Release|x64.Build.0 = Release|Any CPU
 		{43E3B132-2486-44A3-92C6-39E39724FAFD}.Release|x86.ActiveCfg = Release|Any CPU
 		{43E3B132-2486-44A3-92C6-39E39724FAFD}.Release|x86.Build.0 = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|x64.Build.0 = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Debug|x86.Build.0 = Debug|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|x64.ActiveCfg = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|x64.Build.0 = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|x86.ActiveCfg = Release|Any CPU
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C}.Release|x86.Build.0 = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|x64.Build.0 = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Debug|x86.Build.0 = Debug|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|x64.ActiveCfg = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|x64.Build.0 = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|x86.ActiveCfg = Release|Any CPU
+		{0EBEE047-CBAD-4A69-8095-E3961B863446}.Release|x86.Build.0 = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|x64.Build.0 = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Debug|x86.Build.0 = Debug|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|x64.ActiveCfg = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|x64.Build.0 = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|x86.ActiveCfg = Release|Any CPU
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB}.Release|x86.Build.0 = Release|Any CPU
 		{563A3FFA-32DA-4ADA-891C-E00897BD919E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{563A3FFA-32DA-4ADA-891C-E00897BD919E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{563A3FFA-32DA-4ADA-891C-E00897BD919E}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -7381,6 +7411,126 @@ Global
 		{E2461809-D2EA-436D-B5C3-8A9EE0A283B8}.Release|x64.Build.0 = Release|Any CPU
 		{E2461809-D2EA-436D-B5C3-8A9EE0A283B8}.Release|x86.ActiveCfg = Release|Any CPU
 		{E2461809-D2EA-436D-B5C3-8A9EE0A283B8}.Release|x86.Build.0 = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|x64.Build.0 = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Debug|x86.Build.0 = Debug|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|x64.ActiveCfg = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|x64.Build.0 = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|x86.ActiveCfg = Release|Any CPU
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1}.Release|x86.Build.0 = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|x64.Build.0 = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Debug|x86.Build.0 = Debug|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|x64.ActiveCfg = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|x64.Build.0 = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|x86.ActiveCfg = Release|Any CPU
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404}.Release|x86.Build.0 = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|x64.Build.0 = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Debug|x86.Build.0 = Debug|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|Any CPU.Build.0 = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|x64.ActiveCfg = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|x64.Build.0 = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|x86.ActiveCfg = Release|Any CPU
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63}.Release|x86.Build.0 = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|x64.Build.0 = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Debug|x86.Build.0 = Debug|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|x64.ActiveCfg = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|x64.Build.0 = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|x86.ActiveCfg = Release|Any CPU
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C}.Release|x86.Build.0 = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|x64.Build.0 = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Debug|x86.Build.0 = Debug|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|x64.ActiveCfg = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|x64.Build.0 = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|x86.ActiveCfg = Release|Any CPU
+		{8001580F-B702-404B-A0FD-13538DDB9672}.Release|x86.Build.0 = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|x64.Build.0 = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Debug|x86.Build.0 = Debug|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|x64.ActiveCfg = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|x64.Build.0 = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|x86.ActiveCfg = Release|Any CPU
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A}.Release|x86.Build.0 = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|x64.Build.0 = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Debug|x86.Build.0 = Debug|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|x64.ActiveCfg = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|x64.Build.0 = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|x86.ActiveCfg = Release|Any CPU
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7}.Release|x86.Build.0 = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|x64.Build.0 = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Debug|x86.Build.0 = Debug|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|x64.ActiveCfg = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|x64.Build.0 = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|x86.ActiveCfg = Release|Any CPU
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D}.Release|x86.Build.0 = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|x64.Build.0 = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Debug|x86.Build.0 = Debug|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|x64.ActiveCfg = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|x64.Build.0 = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|x86.ActiveCfg = Release|Any CPU
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A}.Release|x86.Build.0 = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|x64.Build.0 = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Debug|x86.Build.0 = Debug|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|x64.ActiveCfg = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|x64.Build.0 = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|x86.ActiveCfg = Release|Any CPU
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -7813,12 +7963,6 @@ Global
 		{EE65018D-FA12-461D-B2C5-44CA6E385530} = {E5963C9F-20A6-4385-B364-814D2581FADF}
 		{A8E1962B-688E-44B3-81F3-BBB9891534CE} = {EE65018D-FA12-461D-B2C5-44CA6E385530}
 		{8A745E35-8098-4EB4-AC55-587B9F0DC4BE} = {EE65018D-FA12-461D-B2C5-44CA6E385530}
-		{884AED21-7931-42A3-B08A-E58F7B0D6E7F} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
-		{8DA88110-5A13-41A9-9F9D-674D921EB442} = {884AED21-7931-42A3-B08A-E58F7B0D6E7F}
-		{4BCF2228-159D-4547-8D54-CDD2252D076A} = {8DA88110-5A13-41A9-9F9D-674D921EB442}
-		{2D347127-3B13-47B1-84EC-770A9C1E11B0} = {884AED21-7931-42A3-B08A-E58F7B0D6E7F}
-		{A7802482-55BA-4D95-BE79-8A601131F527} = {2D347127-3B13-47B1-84EC-770A9C1E11B0}
-		{81947277-035F-41F6-A1D4-8EA362CB46D2} = {2D347127-3B13-47B1-84EC-770A9C1E11B0}
 		{8C4006DF-FF48-46B6-A124-10B1EEAA266E} = {822D1519-77F0-484A-B9AB-F694C2CC25F1}
 		{F5C54062-B19C-4291-A816-F1B5A167369A} = {8C4006DF-FF48-46B6-A124-10B1EEAA266E}
 		{056535BC-3E30-49E2-BE3B-630C62E641A5} = {1A0EFF9F-E699-4303-AE50-BFAF9804EEB6}
@@ -8142,6 +8286,10 @@ Global
 		{3EAB9890-2C01-444C-ACA0-D77B29CDE08B} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
 		{3E29454A-C4DC-44B7-AF0A-A782AD2E73BC} = {3EAB9890-2C01-444C-ACA0-D77B29CDE08B}
 		{43E3B132-2486-44A3-92C6-39E39724FAFD} = {3EAB9890-2C01-444C-ACA0-D77B29CDE08B}
+		{7B739F28-21DE-435D-9EA6-579064932350} = {17DD5861-0635-46D0-84BA-6B163150AA4F}
+		{F502ED22-EB37-4EF8-BFA0-3EFB3E2BE20C} = {7B739F28-21DE-435D-9EA6-579064932350}
+		{0EBEE047-CBAD-4A69-8095-E3961B863446} = {7B739F28-21DE-435D-9EA6-579064932350}
+		{B4F76DF0-1638-42DA-B46A-30DC16AECEAB} = {7B739F28-21DE-435D-9EA6-579064932350}
 		{DFC4F588-B4B4-484B-AB93-B36721374AD3} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
 		{48FF1D87-5066-4294-B802-2D1B478C6EB6} = {DFC4F588-B4B4-484B-AB93-B36721374AD3}
 		{563A3FFA-32DA-4ADA-891C-E00897BD919E} = {48FF1D87-5066-4294-B802-2D1B478C6EB6}
@@ -8153,6 +8301,21 @@ Global
 		{E83B0BCC-A8E0-4FBD-BE51-9A533C9CB972} = {DFC4F588-B4B4-484B-AB93-B36721374AD3}
 		{5D6F99C5-D292-4459-B8BD-8E4AD42E1B21} = {E83B0BCC-A8E0-4FBD-BE51-9A533C9CB972}
 		{E2461809-D2EA-436D-B5C3-8A9EE0A283B8} = {7D2B0799-A634-42AC-AE77-5D167BA51389}
+		{CAFD1885-B87B-4A7A-8BE6-86B0C238C2B1} = {5FE1FBC1-8CE3-4355-9866-44FE1307C5F1}
+		{C1CDD339-B51B-42BE-99F2-F39A4EC0D404} = {BB3D6EDD-AE71-4D25-B61B-7EBF7A1BA1D1}
+		{BB3D6EDD-AE71-4D25-B61B-7EBF7A1BA1D1} = {1A304CA0-7795-4684-88E5-E66402966927}
+		{399EF81E-C3B5-4D86-8BF1-DC7926252A63} = {05A169C7-4F20-4516-B10A-B13C5649D346}
+		{0F39820F-F4A5-41C6-9809-D79B68F032EF} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
+		{8DFA596B-BD00-404E-9445-BCFAC65BDC34} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
+		{4FB95E16-918B-49C1-9F65-49D07CDE072C} = {8DFA596B-BD00-404E-9445-BCFAC65BDC34}
+		{8001580F-B702-404B-A0FD-13538DDB9672} = {8DFA596B-BD00-404E-9445-BCFAC65BDC34}
+		{43ED0D49-E29A-4B12-8D10-531E006038E5} = {0F39820F-F4A5-41C6-9809-D79B68F032EF}
+		{A7B8F295-AD6E-42C1-A215-17337033EBE9} = {0F39820F-F4A5-41C6-9809-D79B68F032EF}
+		{A19F94D3-0C6A-429D-811A-7A750AAD122A} = {43ED0D49-E29A-4B12-8D10-531E006038E5}
+		{20CA28CC-FCDB-49F3-8452-5036E0BADCA7} = {43ED0D49-E29A-4B12-8D10-531E006038E5}
+		{3CC4AA4E-F7E6-4BAE-B2B7-BCEC9509F68D} = {A7B8F295-AD6E-42C1-A215-17337033EBE9}
+		{14DBB385-A1B1-49B2-A737-4DF90E127E5A} = {A7B8F295-AD6E-42C1-A215-17337033EBE9}
+		{5FD94164-7D13-4618-93AD-7346B0EA0CDD} = {C1409A8F-555A-4A88-B803-C6D3E8B6C3B0}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {3E8720B3-DBDD-498C-B383-2CC32A054E8F}

+ 9 - 12
Directory.Build.props

@@ -21,8 +21,7 @@
           $(MSBuildProjectName.EndsWith('.Test')) OR
           $(MSBuildProjectName.EndsWith('.FunctionalTest')) ) ">true</IsUnitTestProject>
     <IsTestAssetProject Condition=" $(RepoRelativeProjectDir.Contains('testassets')) ">true</IsTestAssetProject>
-    <IsSampleProject Condition=" $(RepoRelativeProjectDir.Contains('sample')) OR
-        $(RepoRelativeProjectDir.Contains('Sample')) ">true</IsSampleProject>
+    <IsSampleProject Condition=" $(RepoRelativeProjectDir.ToUpperInvariant().Contains('SAMPLE')) ">true</IsSampleProject>
     <IsAnalyzersProject Condition="$(MSBuildProjectName.EndsWith('.Analyzers'))">true</IsAnalyzersProject>
     <IsShipping Condition=" '$(IsSampleProject)' == 'true' OR
         '$(IsTestAssetProject)' == 'true' OR
@@ -96,20 +95,16 @@
     <NuspecBasePath>$(MSBuildProjectDirectory)</NuspecBasePath>
 
     <IncludeSymbols>true</IncludeSymbols>
-
-    <!--
-      Also update the DefaultNetCoreTargetFramework defined at src/Razor/test/testassets/Directory.Build.props and
-      the packages referenced in Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj when this changes.
-    -->
-    <DefaultNetCoreTargetFramework>net5.0</DefaultNetCoreTargetFramework>
     <DefaultNetFxTargetFramework>net461</DefaultNetFxTargetFramework>
   </PropertyGroup>
 
   <!-- Warnings and errors -->
   <PropertyGroup>
-    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
-    <!-- Don't make missing XML docs a fatal build error, but still surface so we have visibility into undocumented APIs. -->
-    <WarningsNotAsErrors>$(WarningsNotAsErrors);CS1591</WarningsNotAsErrors>
+    <!-- Ensure API docs are available. -->
+    <NoWarn>$(NoWarn.Replace('1591', ''))</NoWarn>
+
+    <!-- For local builds, don't make missing XML docs a fatal build error, but still surface so we have visibility into undocumented APIs. -->
+    <WarningsNotAsErrors Condition=" '$(ContinuousIntegrationBuild)' != 'true' ">$(WarningsNotAsErrors);CS1591</WarningsNotAsErrors>
 
     <!-- xUnit1004 = warns about skipped tests. Make this a non-fatal build warning. -->
     <WarningsNotAsErrors>$(WarningsNotAsErrors);xUnit1004</WarningsNotAsErrors>
@@ -143,7 +138,7 @@
     <IsTargetingPackBuilding Condition=" '$(IsTargetingPackBuilding)' == '' ">true</IsTargetingPackBuilding>
 
     <!--
-      Archives and installers using this prefix are intended for internal-use only.
+      Archives and installers using this prefix are intended for internal use only.
       For example, this .zip is used to handoff bits to partner teams who then incorporate our shared frameworks
       into their own installers.
     -->
@@ -161,6 +156,7 @@
       win-arm;
       win-arm64;
       osx-x64;
+      osx-arm64;
       linux-musl-x64;
       linux-musl-arm;
       linux-musl-arm64;
@@ -219,6 +215,7 @@
   </PropertyGroup>
 
   <Import Project="eng\Workarounds.props" />
+  <Import Project="artifacts\bin\GenerateFiles\Directory.Build.props" Condition=" '$(MSBuildProjectName)' != 'GenerateFiles' " />
   <Import Project="eng\Dependencies.props" />
   <Import Project="eng\ProjectReferences.props" />
   <Import Project="eng\SharedFramework.Local.props" />

+ 18 - 26
Directory.Build.targets

@@ -18,6 +18,11 @@
          '$(IsSpecificationTestProject)' == 'true')">true</ExcludeFromBuild>
   </PropertyGroup>
 
+  <PropertyGroup>
+    <!-- Ignore API doc requirements for test assets -->
+    <NoWarn Condition="'$(IsTestAssetProject)' == 'true' or '$(IsSampleProject)' == 'true' or '$(IsBenchmarkProject)' == 'true'">$(NoWarn);CS1591</NoWarn>
+  </PropertyGroup>
+
   <PropertyGroup Label="Resx settings">
     <GenerateResxSource Condition="$(GenerateResxSource) == ''">true</GenerateResxSource>
     <GenerateResxSourceEmitFormatMethods Condition="$(GenerateResxSourceEmitFormatMethods) == ''">true</GenerateResxSourceEmitFormatMethods>
@@ -32,8 +37,8 @@
     <PackageBrandingVersion>$(VersionPrefix)</PackageBrandingVersion>
     <PackageBrandingVersion Condition=" '$(VersionSuffix)' != '' ">$(PackageBrandingVersion) $(BrandingVersionSuffix.Trim())</PackageBrandingVersion>
 
-    <SiteExtensionPackageVersion>$(VersionPrefix)</SiteExtensionPackageVersion>
-    <SiteExtensionPackageVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionPrefix)-$(VersionSuffix.Replace('.','-'))</SiteExtensionPackageVersion>
+    <SiteExtensionVersion>$(VersionPrefix)</SiteExtensionVersion>
+    <SiteExtensionVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionPrefix)-$(VersionSuffix.Replace('.','-'))</SiteExtensionVersion>
 
     <PackageVersion Condition=" '$(PackageVersion)' == '' ">$(Version)</PackageVersion>
 
@@ -44,7 +49,7 @@
     <TargetingPackVersion>$(SharedFxVersion)</TargetingPackVersion>
     <TargetingPackVersion Condition=" ! $(IsTargetingPackBuilding) ">$(TargetingPackVersionPrefix)</TargetingPackVersion>
 
-    <PackageVersion Condition=" '$(NoSemVer20)' == 'true' ">$(SiteExtensionPackageVersion)</PackageVersion>
+    <PackageVersion Condition=" '$(NoSemVer20)' == 'true' ">$(SiteExtensionVersion)</PackageVersion>
   </PropertyGroup>
 
   <PropertyGroup>
@@ -146,34 +151,20 @@
 
   <PropertyGroup>
     <KnownAppHostPackOrFrameworkReferenceTfm>$(DefaultNetCoreTargetFramework)</KnownAppHostPackOrFrameworkReferenceTfm>
-    <KnownAppHostPackOrFrameworkReferenceTfm Condition=" '$(TargetFrameworkIdentifier)' == '$(NETCoreAppFrameworkIdentifier)' AND
-      $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '5.0')) ">netcoreapp$(TargetFrameworkVersion.TrimStart('vV'))</KnownAppHostPackOrFrameworkReferenceTfm>
+    <_DefaultTargetFrameworkIdentifier>$([MSBuild]::GetTargetFrameworkIdentifier('$(DefaultNetCoreTargetFramework)'))</_DefaultTargetFrameworkIdentifier>
+    <_DefaultTargetFrameworkVersionNoV>$([MSBuild]::GetTargetFrameworkVersion('$(DefaultNetCoreTargetFramework)', 2))</_DefaultTargetFrameworkVersionNoV>
+    <KnownAppHostPackOrFrameworkReferenceTfm Condition=" '$(_DefaultTargetFrameworkIdentifier)' == '$(NETCoreAppFrameworkIdentifier)' AND
+      $([MSBuild]::VersionGreaterThanOrEquals('$(_DefaultTargetFrameworkVersionNoV)', '5.0')) ">netcoreapp$(_DefaultTargetFrameworkVersionNoV)</KnownAppHostPackOrFrameworkReferenceTfm>
+
+    <!-- Do not update the Microsoft.AspNetCore.App KnownFrameworkReference item unless requested. -->
+    <UpdateAspNetCoreKnownFramework>false</UpdateAspNetCoreKnownFramework>
+    <UpdateAspNetCoreKnownFramework Condition=" '$(UseAspNetCoreSharedRuntime)' == 'true' AND
+      '$(DoNotApplyWorkaroundsToMicrosoftAspNetCoreApp)' != 'true' ">true</UpdateAspNetCoreKnownFramework>
   </PropertyGroup>
 
   <ItemGroup>
-    <KnownFrameworkReference Update="Microsoft.NETCore.App">
-      <!-- Always update the 'latest version', whether the repo is servicing or not. -->
-      <LatestRuntimeFrameworkVersion Condition="'%(TargetFramework)' == '$(KnownAppHostPackOrFrameworkReferenceTfm)'">$(MicrosoftNETCoreAppRuntimeVersion)</LatestRuntimeFrameworkVersion>
-      <!-- Only update the default runtime version for preview builds. -->
-      <DefaultRuntimeFrameworkVersion Condition="'%(TargetFramework)' == '$(KnownAppHostPackOrFrameworkReferenceTfm)' and '$(IsServicingBuild)' != 'true'">$(MicrosoftNETCoreAppRuntimeVersion)</DefaultRuntimeFrameworkVersion>
-      <!-- Only update the targeting pack version for preview builds. -->
-      <TargetingPackVersion Condition="'%(TargetFramework)' == '$(KnownAppHostPackOrFrameworkReferenceTfm)' and '$(IsServicingBuild)' != 'true'">$(MicrosoftNETCoreAppRefPackageVersion)</TargetingPackVersion>
-    </KnownFrameworkReference>
-
     <KnownFrameworkReference Condition="'$(UseAspNetCoreSharedRuntime)' != 'true'" Remove="Microsoft.AspNetCore.App" />
     <KnownFrameworkReference Remove="Microsoft.WindowsDesktop.App" />
-
-    <KnownFrameworkReference Condition="'$(UseAspNetCoreSharedRuntime)' == 'true' AND '$(DoNotApplyWorkaroundsToMicrosoftAspNetCoreApp)' != 'true'" Update="Microsoft.AspNetCore.App">
-      <LatestRuntimeFrameworkVersion>$(SharedFxVersion)</LatestRuntimeFrameworkVersion>
-      <DefaultRuntimeFrameworkVersion Condition="'$(IsServicingBuild)' != 'true'">$(SharedFxVersion)</DefaultRuntimeFrameworkVersion>
-      <TargetingPackVersion Condition="'$(IsServicingBuild)' != 'true'">$(TargetingPackVersion)</TargetingPackVersion>
-    </KnownFrameworkReference>
-
-    <!-- Track compiler separately from Arcade.-->
-    <PackageReference Include="Microsoft.Net.Compilers.Toolset"
-        Version="$(MicrosoftNetCompilersToolsetPackageVersion)"
-        PrivateAssets="all"
-        IsImplicitlyDefined="true" />
   </ItemGroup>
 
   <PropertyGroup Condition=" '$(CopySymbolsToArtifacts)' == 'true' AND '$(TargetFramework)' != '' ">
@@ -190,6 +181,7 @@
   </Target>
 
   <Import Project="eng\Workarounds.targets" />
+  <Import Project="artifacts\bin\GenerateFiles\Directory.Build.targets" Condition=" '$(MSBuildProjectName)' != 'GenerateFiles' " />
   <Import Project="eng\targets\ResolveIisReferences.targets" Condition=" '$(MSBuildProjectExtension)' != '.vcxproj' " />
   <Import Project="eng\targets\Cpp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.vcxproj'" />
   <Import Project="eng\targets\CSharp.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.csproj'" />

+ 3 - 0
NuGet.config

@@ -6,6 +6,9 @@
     <add key="dotnet-tools" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" />
     <add key="dotnet5" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json" />
     <add key="dotnet5-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json" />
+    <add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
+    <add key="dotnet6-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-transport/nuget/v3/index.json" />
+    <add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
     <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
     <!-- Used for the SiteExtension 3.1 bits that are included in the 5.0 build -->
     <add key="dotnet31-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3.1-transport/nuget/v3/index.json" />

+ 24 - 0
THIRD-PARTY-NOTICES.txt

@@ -319,3 +319,27 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
+
+License notice for Newtonsoft.Json
+===================================
+
+The MIT License (MIT)
+
+Copyright (c) 2007 James Newton-King
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 11 - 9
build.ps1

@@ -81,11 +81,11 @@ MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
 .PARAMETER MSBuildArguments
 Additional MSBuild arguments to be passed through.
 
-.PARAMETER DotNetRuntimeSourceFeed
-Additional feed that can be used when downloading .NET runtimes
+.PARAMETER RuntimeSourceFeed
+Additional feed that can be used when downloading .NET runtimes and SDKs
 
-.PARAMETER DotNetRuntimeSourceFeedKey
-Key for feed that can be used when downloading .NET runtimes
+.PARAMETER RuntimeSourceFeedKey
+Key for feed that can be used when downloading .NET runtimes and SDKs
 
 .EXAMPLE
 Building both native and managed projects.
@@ -174,8 +174,10 @@ param(
 
     # Optional arguments that enable downloading an internal
     # runtime or runtime from a non-default location
-    [string]$DotNetRuntimeSourceFeed,
-    [string]$DotNetRuntimeSourceFeedKey,
+    [Alias('DotNetRuntimeSourceFeed')]
+    [string]$RuntimeSourceFeed,
+    [Alias('DotNetRuntimeSourceFeedKey')]
+    [string]$RuntimeSourceFeedKey,
 
     # Capture the rest
     [Parameter(ValueFromRemainingArguments = $true)]
@@ -257,9 +259,9 @@ if (-not $Configuration) {
 $MSBuildArguments += "/p:Configuration=$Configuration"
 
 [string[]]$ToolsetBuildArguments = @()
-if ($DotNetRuntimeSourceFeed -or $DotNetRuntimeSourceFeedKey) {
-    $runtimeFeedArg = "/p:DotNetRuntimeSourceFeed=$DotNetRuntimeSourceFeed"
-    $runtimeFeedKeyArg = "/p:DotNetRuntimeSourceFeedKey=$DotNetRuntimeSourceFeedKey"
+if ($RuntimeSourceFeed -or $RuntimeSourceFeedKey) {
+    $runtimeFeedArg = "/p:DotNetRuntimeSourceFeed=$RuntimeSourceFeed"
+    $runtimeFeedKeyArg = "/p:DotNetRuntimeSourceFeedKey=$RuntimeSourceFeedKey"
     $MSBuildArguments += $runtimeFeedArg
     $MSBuildArguments += $runtimeFeedKeyArg
     $ToolsetBuildArguments += $runtimeFeedArg

+ 13 - 13
build.sh

@@ -30,8 +30,8 @@ build_installers=''
 build_projects=''
 target_arch='x64'
 configuration=''
-dotnet_runtime_source_feed=''
-dotnet_runtime_source_feed_key=''
+runtime_source_feed=''
+runtime_source_feed_key=''
 
 if [ "$(uname)" = "Darwin" ]; then
     target_os_name='osx'
@@ -77,8 +77,8 @@ Options:
     --excludeCIBinarylog              Don't output binary log by default in CI builds (short: -nobl).
     --verbosity|-v                    MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
 
-    --dotnet-runtime-source-feed      Additional feed that can be used when downloading .NET runtimes
-    --dotnet-runtime-source-feed-key  Key for feed that can be used when downloading .NET runtimes
+    --runtime-source-feed             Additional feed that can be used when downloading .NET runtimes and SDKs
+    --runtime-source-feed-key         Key for feed that can be used when downloading .NET runtimes and SDKs
 
 Description:
     This build script installs required tools and runs an MSBuild command on this repository
@@ -209,15 +209,15 @@ while [[ $# -gt 0 ]]; do
         -excludeCIBinarylog|-nobl)
             exclude_ci_binary_log=true
             ;;
-        -dotnet-runtime-source-feed|-dotnetruntimesourcefeed)
+        -dotnet-runtime-source-feed|-dotnetruntimesourcefeed|-runtime-source-feed|-runtimesourcefeed)
             shift
-            [ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed" && __usage
-            dotnet_runtime_source_feed="${1:-}"
+            [ -z "${1:-}" ] && __error "Missing value for parameter --runtime-source-feed" && __usage
+            runtime_source_feed="${1:-}"
             ;;
-        -dotnet-runtime-source-feed-key|-dotnetruntimesourcefeedkey)
+        -dotnet-runtime-source-feed-key|-dotnetruntimesourcefeedkey|-runtime-source-feed-key|-runtimesourcefeedkey)
             shift
-            [ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed-key" && __usage
-            dotnet_runtime_source_feed_key="${1:-}"
+            [ -z "${1:-}" ] && __error "Missing value for parameter --runtime-source-feed-key" && __usage
+            runtime_source_feed_key="${1:-}"
             ;;
         *)
             msbuild_args[${#msbuild_args[*]}]="$1"
@@ -290,9 +290,9 @@ msbuild_args[${#msbuild_args[*]}]="-p:Configuration=$configuration"
 
 # Set up additional runtime args
 toolset_build_args=()
-if [ ! -z "$dotnet_runtime_source_feed$dotnet_runtime_source_feed_key" ]; then
-    runtimeFeedArg="/p:DotNetRuntimeSourceFeed=$dotnet_runtime_source_feed"
-    runtimeFeedKeyArg="/p:DotNetRuntimeSourceFeedKey=$dotnet_runtime_source_feed_key"
+if [ ! -z "$runtime_source_feed$runtime_source_feed_key" ]; then
+    runtimeFeedArg="/p:DotNetRuntimeSourceFeed=$runtime_source_feed"
+    runtimeFeedKeyArg="/p:DotNetRuntimeSourceFeedKey=$runtime_source_feed_key"
     msbuild_args[${#msbuild_args[*]}]=$runtimeFeedArg
     msbuild_args[${#msbuild_args[*]}]=$runtimeFeedKeyArg
     toolset_build_args[${#toolset_build_args[*]}]=$runtimeFeedArg

+ 1 - 0
dockerbuild.sh

@@ -136,6 +136,7 @@ docker run \
     -e BUILD_BUILDID \
     -e SYSTEM_TEAMPROJECT \
     -e BUILD_BUILDNUMBER \
+    -e BUILD_REPOSITORY_NAME \
     -e BUILD_REPOSITORY_URI \
     -e BUILD_REPOSITORY_NAME \
     -e BUILD_SOURCEVERSION \

+ 1 - 0
docs/APIReviewProcess.md

@@ -4,6 +4,7 @@ Starting in 5.0, certain areas within the dotnet/aspnetcore and dotnet/extension
 API changes to the following areas are required to go follow this process:
 
 * area-azure
+* area-blazor
 * area-hosting
 * area-installers
 * area-middleware

+ 75 - 12
docs/BuildErrors.md

@@ -1,33 +1,96 @@
-Build Errors
-------------
+# Build Errors
 
 This document is for common build errors and how to resolve them.
 
-### Warning BUILD001
+## Warning BUILD001
 
-> warning BUILD001: Package references changed since the last release...
+> warning BUILD001: Reference to '&hellip;' was removed since the last stable release of this package. &hellip;
 
 This warning indicates a breaking change might have been made to a package or assembly due to the removal of a reference which was used
-in a previous release of this assembly. See <./ReferenceResolution.md> for how to suppress.
+in a previous release of this assembly. See [ReferenceResolution](./ReferenceResolution.md) for how to suppress.
 
-### Error BUILD002
+## Error BUILD002
 
-> error BUILD002: Package references changed since the last release...
+> error BUILD002: Package references changed since the last release&hellip;
 
-Similar to BUILD001, but this error is not suppressable. This error only appears in servicing builds, which should not change references between assemblies or packages.
+Similar to BUILD001, but this error is not suppressible. This error only appears in servicing builds, which should not change references between assemblies or packages.
 
-### Error BUILD003
+## Error BUILD003
 
 > error BUILD003: Multiple project files named 'Banana.csproj' exist. Project files should have a unique name to avoid conflicts in build output.
 
-This repo uses a common output directory (artifacts/bin/$(ProjectName) and artifacts/obj/$(ProjectName)). To avoid confllicts in build output, each
+This repo uses a common output directory (artifacts/bin/$(ProjectName) and artifacts/obj/$(ProjectName)). To avoid conflicts in build output, each
 project file should have a unique name.
 
-### Error MSB4236 / Unable to locate the .NET Core SDK
-  
+## Error CS0006
+
+Opening solution filters and building may produce an error code CS0006 with a message such as
+
+> Error CS0006 Metadata file '&hellip;\AspNetCore\artifacts\bin\Microsoft.AspNetCore.Metadata\Debug\netstandard2.0\Microsoft.AspNetCore.Metadata.dll' could not be found
+
+The cause of this problem is that the solution filter you are using does not include the project that produces this .dll. This most often occurs after we have added new projects to the repo, but failed to update our .sln/slnf files to include the new project. In some cases, it is sometimes the intended behavior of the .slnf which has been crafted to only include a subset of projects.
+
+### You can fix this in one of three ways
+
+1. Build the project on command line. In most cases, running `build.cmd` on command line solves this problem.
+2. If the project is missing from the .sln file entirely, you can use `dotnet sln add` to add it, or else right click on the solution/folder in Visual Studio and choose Add->Existing Project, and adding it.
+3. If it is present in the .sln, but not the .slnf, you can update the solution filter to include the missing project. You can either do this one by right-clicking on project in Visual Studio and choosing to load it's direct dependencies, and then saving.  Alternatively, you can hand edit the .slnf file - it's a fairly simple json format.
+
+## Error MSB4019: The imported project "&hellip;\artifacts\bin\GenerateFiles\Directory.Build.props" was not found
+
+You have likely attempted to use `dotnet` to build a project in the repo without first generating the required files.
+Prior to building without `.\build.cmd` or `./build.sh` at least the following **must** be executed:
+
+```powershell
+.\build.cmd -noBuildNative -noBuildManaged
+```
+
+or
+
+```bash
+./build.sh --no-build-managed
+```
+
+## Error MSB4236: Unable to locate the .NET Core SDK
+
 Executing `.\restore.cmd` or `.\build.cmd` may produce these errors:
 
 > error : Unable to locate the .NET Core SDK. Check that it is installed and that the version specified in global.json (if any) matches the installed version.
 > error MSB4236: The SDK 'Microsoft.NET.Sdk' specified could not be found.
 
 In most cases, this is because the option _Use previews of the .NET Core SDK_ in VS2019 is not checked. Start Visual Studio, go to _Tools > Options_ and check _Use previews of the .NET Core SDK_ under _Environment > Preview Features_.
+
+## Error: HTTP Error 500.33 - ANCM Request Handler Load Failure
+
+The [ASP.NET Core Module](https://docs.microsoft.com/aspnet/core/host-and-deploy/aspnet-core-module) (ANCM) for IIS is not supported when running projects in this repository.
+
+After using `startvs.cmd` to open a solution in Visual Studio, the Kestrel web host option must be used (name of the project) and not IIS Express.
+
+Example of running the `MvcSandbox` project:
+
+`.\startvs.cmd .\src\Mvc\Mvc.sln`
+
+![Web host options in Visual Studio](./vs-iis-express-aspnet-core-mvc-sandbox.jpg)
+
+## Error: Unable to load the service index for &hellip;
+
+When attempting to restore servicing tags e.g. `v3.1.7`,  the NuGet.config file may contain internal feeds that are not accessible. This will result in errors such as
+
+> &hellip;\aspnetcore\.dotnet\sdk\3.1.103\NuGet.targets(123,5): error : Unable to load the service index for source https://pkgs.dev.azure.com/dnceng/_packaging/darc-int-dotnet-extensions-784b0ffa/nuget/v3/index.json. [&hellip;\Temp\1gsd3rdo.srb\restore.csproj] [&hellip;\.nuget\packages\microsoft.dotnet.arcade.sdk\1.0.0-beta.20213.4\tools\Tools.proj]
+
+The `darc-int-...` feeds in NuGet.config are used only when building internally and are not needed after the tags are created. Delete all such entries in the file and retry.
+
+## Warning: Requested Microsoft.AspNetCore.App v&hellip; does not exist
+
+You have likely attempted to build projects or execute tests which require the just-build Microsoft.AspNetCore.App
+shared framework. Execute the following to ensure that exists within the `$(DOTNET_ROOT)` folder:
+
+```powershell
+.\build.cmd -projects src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj
+```
+
+or
+
+```bash
+./build.sh --projects "$PWD/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj"
+```

+ 194 - 119
docs/BuildFromSource.md

@@ -1,159 +1,209 @@
 # Build ASP.NET Core from Source
 
-Building ASP.NET Core from source allows you to tweak and customize ASP.NET Core, and to contribute your improvements back to the project.
+This document outlines how to build the source in the aspnetcore repo locally for development purposes.
 
-See <https://github.com/dotnet/aspnetcore/labels/area-infrastructure> for known issues and to track ongoing work.
+For more info on issues related to build infrastructure and ongoing work, see <https://github.com/dotnet/aspnetcore/labels/area-infrastructure>.
 
-## Clone the source code
+## Step 0: Getting started
 
-ASP.NET Core uses git submodules to include the source from a few other projects.
+This tutorial assumes that you are familiar with:
 
-For a new copy of the project, run:
+- Git
+- Command line fundamentals in your operating system of choice
 
-```ps1
+## Step 1: Clone the source code
+
+ASP.NET Core uses git submodules to include the source from a few other projects. In order to pull the sources of the these submodules when cloning the repo, be sure to pass the `--recursive` flag to the `git clone` command.
+
+```powershell
 git clone --recursive https://github.com/dotnet/aspnetcore
 ```
 
-To update an existing copy, run:
+If you've already cloned the aspnetcore repo without fetching subdmoule sources, you can fetch them after cloning by running the following command.
 
-```ps1
+```powershell
 git submodule update --init --recursive
 ```
 
-## Install pre-requisites
+> :bulb: Some ISPs have been know to use web filtering software that has caused issues with git repository cloning, if you experience issues cloning this repo please review <https://help.github.com/en/github/authenticating-to-github/using-ssh-over-the-https-port>.
 
-### Windows
+## Step 2: Install pre-requisites
 
-Building ASP.NET Core on Windows requires:
+Developing in the aspnetcore repo requires some additional tools to build the source code and run integration tests.
 
-* Windows 10, version 1803 or newer
-* At least 10 GB of disk space and a good internet connection (our build scripts download a lot of tools and dependencies)
-* Visual Studio 2019. <https://visualstudio.com>
-  * To install the exact required components, run [eng/scripts/InstallVisualStudio.ps1](/eng/scripts/InstallVisualStudio.ps1).
+### On Windows
 
-    ```ps1
-    PS> ./eng/scripts/InstallVisualStudio.ps1
-    ```
+Building ASP.NET Core on Windows (10, version 1803 or newer) requires that you have the following tooling installed.
 
-    However, any Visual Studio 2019 instance that meets the requirements should be fine. See [global.json](/global.json)
-    and [eng/scripts/vs.json](/eng/scripts/vs.json) for those requirements. By default, the script will install Visual Studio Enterprise Edition, however you can use a different edition by passing the `-Edition` flag.
-* Git. <https://git-scm.org>
-* NodeJS. LTS version of 10.14.2 or newer <https://nodejs.org>.
-* Install yarn globally (`npm install -g yarn`)
-* Java Development Kit 11 or newer. Either:
-  * OpenJDK <https://jdk.java.net/>
-  * Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
-  * To install a version of the JDK that will only be used by this repo, run [eng/scripts/InstallJdk.ps1](/eng/scripts/InstallJdk.ps1)
+> :bulb: Be sure you have least 10 GB of disk space and a good Internet connection. The build scripts will download several tools and dependencies onto your machine.
 
-    ```ps1
-    PS> ./eng/scripts/InstallJdk.ps1
-    ```
+#### [Visual Studio 2019](https://visualstudio.com)
 
-    However, the build should find any JDK 11 or newer installation on the machine.
-   * Set the `JAVA_HOME` environment variable with the path of the java installation directory if your installation did not do that automatically. (Gradle needs this for execution.)
-      * This will be `RepoRoot/.tools/jdk/win-x64/` if you used the `InstallJdk.ps1` script
-      * This will be `C:/Program FIles/Java/jdk<version>/` if you installed the JDK globally
-* Chrome - Selenium-based tests require a version of Chrome to be installed. Download and install it from <https://www.google.com/chrome>
+Visual Studio 2019 (16.8) is required to build the repo locally. If you don't have visual studio installed you can run [eng/scripts/InstallVisualStudio.ps1](/eng/scripts/InstallVisualStudio.ps1) to install the exact required dependencies.
 
-### macOS/Linux
+> :bulb: By default, the script will install Visual Studio Enterprise Edition, however you can use a different edition by passing the `-Edition` flag.
+> :bulb: To install Visual Studio from the preview channel, you can use the `-Channel` flag to set the channel (`-Channel Preview`).
+> :bulb: Even if you have installed Visual Studio, we still recommend using this script to install again to avoid errors due to missing components.
 
-Building ASP.NET Core on macOS or Linux requires:
+```powershell
+./eng/scripts/InstallVisualStudio.ps1  [-Edition {Enterprise|Community|Professional}] [-Channel {Release|Preview}]
+```
 
-* If using macOS, you need macOS Sierra or newer.
-* If using Linux, you need a machine with all .NET Core Linux prerequisites: <https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites>
-* At least 10 GB of disk space and a good internet connection (our build scripts download a lot of tools and dependencies)
-* curl <https://curl.haxx.se> or Wget <https://www.gnu.org/software/wget>
-* Git <https://git-scm.org>
-* NodeJS. LTS version of 10.14.2 or newer <https://nodejs.org>
-* Java Development Kit 11 or newer. Either:
-  * OpenJDK <https://jdk.java.net/>
-  * Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
+> :bulb: To execute the setup script or other PowerShell scripts in the repo, you may need to update the execution policy on your machine.
+> You can do so by running the `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` command
+> in PowerShell. For more information on execution policies, you can read the [execution policy docs](https://docs.microsoft.com/powershell/module/microsoft.powershell.security/set-executionpolicy).
 
-**NOTE** some ISPs have been know to use web filtering software that has caused issues with git repository cloning, if you experience issues cloning this repo please review <https://help.github.com/en/github/authenticating-to-github/using-ssh-over-the-https-port>
+The  [global.json](/global.json) file specifies the minimum requirements needed to build using `msbuild`. The [eng/scripts/vs.json](/eng/scripts/vs.json) file provides a description of the components needed to build within VS. If you plan on developing in Visual Studio, you will need to have these components installed.
 
-## Building in Visual Studio
+> :bulb: The `InstallVisualStudio.ps1` script mentioned above reads from the `vs.json` file to determine what components to install.
 
-Before opening our .sln/.slnf files in Visual Studio or VS Code, you need to perform the following actions.
+#### [Git](https://git-scm.org) on Windows
 
-1. Executing the following on command-line:
+If you're reading this, you probably already have Git installed to support cloning the repo as outlined in Step 1.
 
-   ```ps1
-   .\restore.cmd
-   ```
+#### [NodeJS](https://nodejs.org) on Windows
 
-   This will download the required tools and build the entire repository once. At that point, you should be able
-   to open the .sln file or one of the project specific .slnf files to work on the projects you care about.
+Building the repo requires version 10.14.2 or newer of Node. You can find installation executables for Node at <https://nodejs.org>.
 
-   > :bulb: Pro tip: you will also want to run this command after pulling large sets of changes. On the master
-   > branch, we regularly update the versions of .NET Core SDK required to build the repo.
-   > You will need to restart Visual Studio every time we update the .NET Core SDK.
-   > To allow executing the setup script, you may need to update the execution policy on your machine.
-   You can do so by running the `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` command
-   in PowerShell. For more information on execution policies, you can read the [execution policy docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy).
+#### [Yarn](https://yarnpkg.com/) on Windows
 
-2. Use the `startvs.cmd` script to open Visual Studio .sln/.slnf files. This script first sets the required
-environment variables.
+NodeJS installs the Node package manager (npm) by default. This repo depends on Yarn, an alternate package manager for the Node ecosystem. You can install Yarn from the command line using the following command.
 
-### Solution files
+```powershell
+npm install -g yarn
+```
 
-We have a single .sln file for all of ASP.NET Core, but most people don't work with it directly because Visual Studio
-doesn't currently handle projects of this scale very well.
+#### Java Development Kit on Windows
 
-Instead, we have many Solution Filter (.slnf) files which include a sub-set of projects. See the Visual Studio
-documentation [here](https://docs.microsoft.com/en-us/visualstudio/ide/filtered-solutions?view=vs-2019) for more
-information about Solution Filters.
+This repo contains some Java source code that depends on an install of the JDK v11 or newer. The JDK can be installed from either:
 
-These principles guide how we create and manage .slnf files:
+- OpenJDK <https://jdk.java.net/>
+- Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
 
-1. Solution files are not used by CI or command line build scripts. They are meant for use by developers only.
-2. Solution files group together projects which are frequently edited at the same time.
-3. Can't find a solution that has the projects you care about? Feel free to make a PR to add a new .slnf file.
+Alternatively, you can run [eng/scripts/InstallJdk.ps1](/eng/scripts/InstallJdk.ps1) to install a version of the JDK that will only be used in this repo.
+
+```powershell
+./eng/scripts/InstallJdk.ps1
+```
+
+The build should find any JDK 11 or newer installation on the machine as long as the `JAVA_HOME` environment variable is set. Typically, your installation will do this automatically. However, if it is not set you can set the environment variable manually:
+
+- Set `JAVA_HOME` to `RepoRoot/.tools/jdk/win-x64/` if you used the `InstallJdk.ps1` script.
+- Set `JAVA_HOME` to `C:/Program Files/Java/jdk<version>/` if you installed the JDK globally.
+
+#### Chrome
+
+This repo contains a Selenium-based tests require a version of Chrome to be installed. Download and install it from <https://www.google.com/chrome>.
+
+#### WiX (Optional)
+
+If you plan on working with the Windows installers defined in [src/Installers/Windows](../src/Installers/Windows), you will need to install the WiX toolkit from <https://wixtoolset.org/releases/>.
+
+### On macOS/Linux
+
+You can also build ASP.NET Core on macOS or Linux. macOS Sierra or newer is required if you're building on macOS. If you're building on Linux, your machine will need to meet the [.NET Core Linux prerequisites](https://docs.microsoft.com/dotnet/core/linux-prerequisites).
+
+> :bulb: Be sure you have least 10 GB of disk space and a good Internet connection. The build scripts will download several tools and dependencies onto your machine.
+
+#### curl/wget
+
+`curl` and `wget` are command line tools that can be used to download files from an HTTP server. Either utility will need to be installed in order to complete the setup. Typically, these will be included on your machine by default.
+
+If neither utility is installed, you can install curl (<https://curl.haxx.se>) or wget (<https://www.gnu.org/software/wget>).
+
+#### Git
+
+If you've made it this far, you've already got `Git` installed. Sit back, relax, and move on to the next requirement.
+
+#### [NodeJS](https://nodejs.org)
+
+Building the repo requires version 10.14.2 or newer of Node. You can find installation executables for Node at <https://nodejs.org>.
+
+#### [Yarn](https://yarnpkg.com/)
+
+NodeJS installs the Node package manager (npm) by default. This repo depends on Yarn, an alternate package manager for the Node ecosystem. You can install Yarn from the command line using the following command.
+
+```bash
+npm install -g yarn
+```
+
+#### Java Development Kit
+
+This repo contains some Java source code that depends on an install of the JDK v11 or newer. The JDK can be installed from either:
+
+- OpenJDK <https://jdk.java.net/>
+- Oracle's JDK <https://www.oracle.com/technetwork/java/javase/downloads/index.html>
 
-### Common error: CS0006
+Similar to [the instructions above for Windows](#java-development-kit-in-windows), be sure that the the `JAVA_HOME` environment variable is set to the location of your Java installation.
 
-Opening solution filters and building may produce an error code CS0006 with a message such
+## Step 3: Build the repo
 
-> Error CS0006 Metadata file 'C:\src\aspnet\AspNetCore\artifacts\bin\Microsoft.AspNetCore.Metadata\Debug\netstandard2.0\Microsoft.AspNetCore.Metadata.dll' could not be found
+Before opening our .sln/.slnf files in Visual Studio or VS Code, you will need to at least restore the repo locally.
 
-The cause of this problem is that the solution filter you are using does not include the project that produces this .dll. This most often occurs after we have added new projects to the repo, but failed to update our .sln/slnf files to include the new project. In some cases, it is sometimes the intended behavior of the .slnf which has been crafted to only include a subset of projects.
+### In Visual Studio
 
-#### You can fix this in one of three ways
+To set up your project for development on Visual Studio, you'll need to execute the following command. Building
+subsets of the repo e.g. Java projects may (depending on your scenario) be necessary before building within Visual
+Studio because those projects are not listed in AspNetCore.sln.
 
-1. Build the project on command line. In most cases, running `build.cmd` on command line solves this problem.
-2. If the project is missing from the .sln file entirely, you can use `dotnet sln add` to add it, or else right click on the solution/folder in Visual Studio and choose Add->Existing Project, and adding it.
-3. If it is present in the .sln, but not the .slnf, you can update the solution filter to include the missing project. You can either do this one by right-clicking on project in Visual Studio and choosing to load it's direct dependencies, and then saving.  Alternatively, you can hand edit the .slnf file - it's a fairly simple json format.
+```powershell
+.\restore.cmd
+```
+
+> :bulb: If you happen to be working on macOS or Linux, you can use the `restore.sh` command.
 
-### Common error: Unable to locate the .NET Core SDK
+This will download the required tools and restore all projects inside the repository. At that point, you should be able
+to open the .sln file or one of the project specific .slnf files to work on the projects you care about.
 
-Executing `.\restore.cmd` or `.\build.cmd` may produce these errors:
+   > :bulb: Pro tip: you will also want to run this command after pulling large sets of changes. On the master
+   > branch, we regularly update the versions of .NET Core SDK required to build the repo.
+   > You will need to restart Visual Studio every time we update the .NET Core SDK.
 
-> error : Unable to locate the .NET Core SDK. Check that it is installed and that the version specified in global.json (if any) matches the installed version.
-> error MSB4236: The SDK 'Microsoft.NET.Sdk' specified could not be found.
+> :bulb: Rerunning the above command or, perhaps, the quicker `.\build.cmd -noBuildNative -noBuildManaged` may be
+> necessary after switching branches, especially if the `$(DefaultNetCoreTargetFramework)` value changes.
 
-In most cases, this is because the option _Use previews of the .NET Core SDK_ in VS2019 is not checked. Start Visual Studio, go to _Tools > Options_ and check _Use previews of the .NET Core SDK_ under _Environment > Preview Features_.
+Typically, you want to focus on a single project within this large repo. For example,
+if you want to work on Blazor WebAssembly, you'll need to launch the solution file for that project by changing into the `src/Components`
+directory and executing `startvs.cmd` in that directory like so:
 
-### Common error: HTTP Error 500.33 - ANCM Request Handler Load Failure
+```powershell
+cd src\Components
+.\startvs.cmd
+```
 
-The [ASP.NET Core Module](https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module) (ANCM) for IIS is not supported when running projects in this repository.
+After opening the solution in Visual Studio, you can build/rebuild using the controls in Visual Studio.
+
+> :exclamation: VS for Mac does not currently support opening .slnf files. So, you must use VS Code when developing on macOS.
+
+#### A brief interlude on solution files
+
+We have a single .sln file for all of ASP.NET Core, but most people don't work with it directly because Visual Studio
+doesn't currently handle projects of this scale very well.
 
-After using `startvs.cmd` to open a solution in Visual Studio, the Kestrel web host option must be used (name of the project) and not IIS Express.
+Instead, we have many Solution Filter (.slnf) files which include a sub-set of projects. See the Visual Studio
+documentation [here](https://docs.microsoft.com/visualstudio/ide/filtered-solutions) for more
+information about Solution Filters.
 
-Example of running the `MvcSandbox` project:
+These principles guide how we create and manage .slnf files:
 
-`.\startvs.cmd .\src\Mvc\Mvc.sln`
+1. Solution files are not used by CI or command line build scripts. They are meant for use by developers only.
+2. Solution files group together projects which are frequently edited at the same time.
+3. Can't find a solution that has the projects you care about? Feel free to make a PR to add a new .slnf file.
 
-![Web host options in Visual Studio](./vs-iis-express-aspnet-core-mvc-sandbox.jpg)
+### In Visual Studio Code
 
-## Building with Visual Studio Code
+Before opening the project in Visual Studio Code, you will need to make sure that you have built the project.
+You can find more info on this in the "Building on command-line" section below.
 
 Using Visual Studio Code with this repo requires setting environment variables on command line first.
 Use these command to launch VS Code with the right settings.
 
+> :bulb: Note that you'll need to launch Visual Studio Code from the command line in order to ensure that it picks up the environment variables. To learn more about the Visual Studio Code CLI, you can check out [the docs page](https://code.visualstudio.com/docs/editor/command-line).
+
 On Windows (requires PowerShell):
 
-```ps1
+```powershell
 # The extra dot at the beginning is required to 'dot source' this file into the right scope.
-
 . .\activate.ps1
 code .
 ```
@@ -165,18 +215,18 @@ source activate.sh
 code .
 ```
 
-Note that if you are using the "Remote-WSL" extension in VSCode, the environment is not supplied
-to the process in WSL.  You can workaround this by explicitly setting the environment variables
-in `~/.vscode-server/server-env-setup`.
-See https://code.visualstudio.com/docs/remote/wsl#_advanced-environment-setup-script for details.
+> :bulb: Note that if you are using the "Remote-WSL" extension in VSCode, the environment is not supplied
+> to the process in WSL.  You can workaround this by explicitly setting the environment variables
+> in `~/.vscode-server/server-env-setup`.
+> See <https://code.visualstudio.com/docs/remote/wsl#_advanced-environment-setup-script> for details.
 
-## Building on command-line
+### Building on command-line
 
-You can also build the entire project on command line with the `build.cmd`/`.sh` scripts.
+When developing in VS Code, you'll need to use the `build.cmd` or `build.sh` scripts in order to build the project. You can learn more about the command line options available, check out [the section below](using-dotnet-on-command-line-in-this-repo).
 
 On Windows:
 
-```ps1
+```powershell
 .\build.cmd
 ```
 
@@ -188,16 +238,21 @@ On macOS/Linux:
 
 By default, all of the C# projects are built. Some C# projects require NodeJS to be installed to compile JavaScript assets which are then checked in as source. If NodeJS is detected on the path, the NodeJS projects will be compiled as part of building C# projects. If NodeJS is not detected on the path, the JavaScript assets checked in previously will be used instead. To disable building NodeJS projects, specify `-noBuildNodeJS` or `--no-build-nodejs` on the command line.
 
+## Step 4: Make your code changes
+
+At this point, you will have all the dependencies installed and a code editor to up and running to make changes in. Once you've made changes, you will need to rebuild the project locally to pick up your changes. You'll also need to run tests locally to verify that your changes worked.
+
+The section below provides some helpful guides for using the `dotnet` CLI in the ASP.NET Core repo.
+
 ### Using `dotnet` on command line in this repo
 
 Because we are using pre-release versions of .NET Core, you have to set a handful of environment variables
-to make the .NET Core command line tool work well. You can set these environment variables like this
+to make the .NET Core command line tool work well. You can set these environment variables like this:
 
 On Windows (requires PowerShell):
 
-```ps1
+```powershell
 # The extra dot at the beginning is required to 'dot source' this file into the right scope.
-
 . .\activate.ps1
 ```
 
@@ -207,13 +262,15 @@ On macOS/Linux:
 source ./activate.sh
 ```
 
-## Running tests on command-line
+> :bulb: Be sure to set the environment variables using the "activate" script above before executing the `dotnet` command inside the repo.
+
+### Running tests on command-line
 
 Tests are not run by default. Use the `-test` option to run tests in addition to building.
 
 On Windows:
 
-```ps1
+```powershell
 .\build.cmd -test
 ```
 
@@ -223,17 +280,31 @@ On macOS/Linux:
 ./build.sh --test
 ```
 
-## Building a subset of the code
+> :bulb: If you're working on changes for a particular subset of the project, you might not want to execute the entire test suite. Instead, only run the tests within the subdirectory where changes were made. This can be accomplished by passing the `projects` property like so: `.\build.cmd -test -projects .\src\Framework\test\Microsoft.AspNetCore.App.UnitTests.csproj`.
 
-This repository is large. Look for `build.cmd`/`.sh` scripts in subfolders. These scripts can be used to invoke build and test on a smaller set of projects.
+### Building a subset of the code
 
-Furthermore, you can use flags on `build.cmd`/`.sh` to build subsets based on language type, like C++, TypeScript, or C#. Run `build.sh --help` or `build.cmd -help` for details.
+When working in the repository, you'll typically be focused on one project area, such as Blazor and SignalR. In that case, it's easier to use the `build.cmd` and `build.sh` that are available in each subfolder. When invoked in a subfolder on Windows:
 
-## Build properties
+```ps1
+.\build.cmd
+```
+
+Or on macOS or Linux:
+
+```bash
+./build.sh
+```
+
+> :bulb: Before using the `build.cmd` or `build.sh` at the top-level or in a subfolder, you will need to make sure that [the dependencies documented above](#step-2-install-pre-requisites) have been installed.
+
+These scripts will build and test the projects within a specific directory. Furthermore, you can use flags on `build.cmd`/`.sh` to build subsets based on language type, like C++, TypeScript, or C#. Run `build.sh --help` or `build.cmd -help` for details.
+
+### Build properties
 
 Additional properties can be added as an argument in the form `/property:$name=$value`, or `/p:$name=$value` for short. For example:
 
-```ps1
+```powershell
 .\build.cmd -Configuration Release
 ```
 
@@ -245,14 +316,18 @@ Configuration            | `Debug` or `Release`. Default = `Debug`.
 TargetArchitecture       | The CPU architecture to build for (x64, x86, arm, arm64).
 TargetOsName             | The base runtime identifier to build for (win, linux, osx, linux-musl).
 
-## Use the result of your build
+### Resx files
+
+If you need to make changes to a .resx file, run `dotnet msbuild t:/Resgen <path to csproj>`. This will update the generated C#.
+
+## Step 5: Use the result of your build
 
 After building ASP.NET Core from source, you will need to install and use your local version of ASP.NET Core.
 See ["Artifacts"](./Artifacts.md) for more explanation of the different folders produced by a build.
 
 Building installers does not run as part of `build.cmd` run without parameters, so you should opt-in for building them:
 
-```ps1
+```powershell
 .\build.cmd -all -pack -arch x64
 .\build.cmd -all -pack -arch x86 -noBuildJava
 .\build.cmd -buildInstallers
@@ -260,8 +335,8 @@ Building installers does not run as part of `build.cmd` run without parameters,
 
 *Note*: Additional build steps listed above aren't necessary on Linux or macOS.
 
-* Run the installers produced in `artifacts/installers/{Debug, Release}/` for your platform.
-* Add a NuGet.Config to your project directory with the following content:
+- Run the installers produced in `artifacts/installers/{Debug, Release}/` for your platform.
+- Add a NuGet.Config to your project directory with the following content:
 
   ```xml
   <?xml version="1.0" encoding="utf-8"?>
@@ -276,7 +351,7 @@ Building installers does not run as part of `build.cmd` run without parameters,
 
   *NOTE: This NuGet.Config should be with your application unless you want nightly packages to potentially start being restored for other apps on the machine.*
 
-* Update the versions on `PackageReference` items in your .csproj project file to point to the version from your local build.
+- Update the versions on `PackageReference` items in your .csproj project file to point to the version from your local build.
 
   ```xml
   <ItemGroup>
@@ -287,6 +362,6 @@ Building installers does not run as part of `build.cmd` run without parameters,
 Some features, such as new target frameworks, may require prerelease tooling builds for Visual Studio.
 These are available in the [Visual Studio Preview](https://www.visualstudio.com/vs/preview/).
 
-## Resx files
+## Troubleshooting
 
-If you need to make changes to a .resx file, run `dotnet msbuild /t:Resx <path to csproj>`. This will update the generated C#.
+See [BuildErrors](./BuildErrors.md) for a description of common issues you might run into while building the repo.

+ 0 - 62
docs/PackageArchives.md

@@ -1,62 +0,0 @@
-Package Archives
-================
-
-This repo builds multiple package archives which contain a NuGet fallback folder (also known as the fallback or offline package cache). The fallback folder is a set of NuGet packages that is bundled in the .NET Core SDK installers and available in Azure Web App service.
-
-Package archives are available in four varieties.
-
-* **LZMA** - `nuGetPackagesArchive-$(Version).lzma` - The LZMA is a compressed file format, similar to a .zip. On first use or on install, the .NET Core CLI will expand this LZMA file, extracting the packages inside to %DOTNET_INSTALL_DIR%/sdk/NuGetFallbackFolder. This contains all NuGet packages and their complete contents.
-* **ci-server** - `nuGetPackagesArchive-ci-server-$(Version).zip` - this archive is optimized for CI server environments. It contains the same contents as the LZMA, but trimmed of xml docs (these are only required for IDEs) and .nupkg files (not required for NuGet as for the 2.0 SDK).
-* **ci-server-patch** - `nuGetPackagesArchive-ci-server-$(Version).patch.zip` - this archive is the same as the ci-server archive, but each release is incremental - i.e. it does not bundle files that were present in a previous ci-server archive release. This can be used by first starting with a baseline `nuGetPackagesArchive-ci-server-$(Version).zip` and then applying the `.patch.zip` version for subsequent updates.
-* **ci-server-compat-patch** - `nuGetPackagesArchive-ci-server-compat-$(Version).patch.zip` - similar to the ci-server-patch archive, but this includes .nupkg files to satisfy CI environments that may have older NuGet clients.
-
-These archives are built using the projects in [src/PackageArchive/Archive.\*/](/src/PackageArchive/).
-
-## Using a fallback folder
-
-NuGet restore takes a list of fallback folders in the MSBuild property `RestoreAdditionalProjectFallbackFolders`. Unlike a folder restore source, restore will not copy the packages from a fallback folder into the global NuGet cache.
-
-By default, the .NET Core SDK adds `$(DotNetInstallRoot)/sdk/NuGetFallbackFolder/` to this list. The .NET Core CLI expands its bundled `nuGetPackagesArchive.lzma` file into this location on first use or when the installers run. (See [Microsoft.NET.NuGetOfflineCache.targets](https://github.com/dotnet/sdk/blob/v2.1.300/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.NuGetOfflineCache.targets)).
-
-## Scenarios
-
-The following scenarios are used to determine which packages go into the fallback package cache.
-These requirements are formalized as project files in [src/PackageArchive/Scenario.\*/](/src/PackageArchive/).
-
- - A user should be able to restore the following templates and only use packages from the offline cache:
-    - `dotnet new console`
-    - `dotnet new library`
-    - `dotnet new web`
-    - `dotnet new razor`
-    - `dotnet new mvc`
-
-The following packages are NOT included in the offline cache.
-  - Packages required for standalone publishing, aka projects that set a Runtime Identifier during restore
-  - Packages required for F# and VB templates
-  - Packages required for Visual Studio code generation in ASP.NET Core projects
-  - Packages required to restore .NET Framework projects
-  - Packages required to restore test projects, such as xunit, MSTest, NUnit
-
-The result of this typically means including the transitive graph of the following packages:
-
-  - Packages that match bundled runtimes
-    - Microsoft.NETCore.App
-    - Microsoft.AspNetCore.App
-  - Packages that Microsoft.NET.Sdk adds implicitly
-    - Microsoft.NETCore.App
-    - NETStandard.Library
-
-### Example
-
-Given the following parameters:
- - LatestNETCoreAppTFM = netcoreapp2.1
- - DefaultRuntimeVersion = 2.1
- - BundledRuntimeVersion = 2.1.8
- - BundledAspNetRuntimeVersion = 2.1.7
- - LatestNETStandardLibraryTFM = netstandard2.0
- - BundledNETStandardLibraryVersion = 2.0.1
-
-The LZMA should contain
-  - Microsoft.NETCore.App/2.1.0 + netcoreapp2.1 dependencies (Microsoft.NET.Sdk will implicitly reference "2.1", which NuGet to 2.1.0)
-  - Microsoft.NETCore.App/2.1.8 + netcoreapp2.1 dependencies (Matches the runtime in shared/Microsoft.NETCore.App/2.1.8/)
-  - NETStandard.Library/2.0.1 + netstandard2.0 dependencies (Microsoft.NET.Sdk will implicitly reference "2.0.1")

+ 19 - 4
docs/README.md

@@ -4,8 +4,23 @@ Contributor documentation
 The primary audience for documentation in this folder is contributors to ASP.NET Core.
 If you are looking for documentation on how to *use* ASP.NET Core, go to <https://docs.asp.net>.
 
-# ASP.NET Core developer workflow
+> :bulb: If you're a new contributor looking to set up the repo locally, the [build from source documentation](BuildFromSource.md) is the best place to start.
 
-- [Building from source](BuildFromSource.md)
-- [Troubleshooting build errors](BuildErrors.md)
-- [Artifacts structure](Artifacts.md)
+The table below outlines the different docs in this folder and what they are helpful for.
+
+| Documentation        | What is it about?   | Who is it for?      |
+|--------------------------------------------------------------------------|-------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
+| [API review process](APIReviewProcess.md)      | Outlines the process for reviewing API changes in ASP.NET Core          | Anyone looking to understand the process for making API changes to ASP.NET Core      |
+| [Artifacts structure](Artifacts.md)            | Outlines the artifacts produced by the build  | Anyone looking to understand artifiacts produced from an Azure DevOps build          |
+| [Troubleshooting build errors](BuildErrors.md) | Common errors that occur when building the repo and how to resolve them | Anyone running into an issue with the build        |
+| [Building from source](BuildFromSource.md)     | Setup instructions for the ASP.NET Core repo  | First-time contributors          |
+| [Working with EventSources and EventCounters](EventSourceAndCounters.md) | Guidance on adding event tracing to a library | Anyone needing to add event tracing for diagnostics purposes      |
+| [Tests on Helix](Helix.md)        | An overview of the Helix test environment     | Anyone debugging tests in Helix or looking to understand the output from Helix builds       |
+| [Issue management](IssueManagementPolicies.md) | Overview of policies in place to manage issues| Community members and collaborators looking to understand how we handle closed issue, issues that need author feedback, etc |    |
+| [Preparing a patch update](PreparingPatchUpdates.md)        | Documentation on how to setup for a patch release of ASP.NET Core       | Anyone looking to publish servicing updates         |
+| [Project properties](ProjectProperties.md)     | Overview of configurable MSBuild properties on the repo    | Anyone looking to modify how a project is packaged   |
+| [How references are resolved](ReferenceResolution.md)       | Overview of dependency reference setup in the repo         | Anyone looking to understand how package references are configured in the repo |
+| [Servicing changes](Servicing.md) | Documentation on how to submit servicing PRs to previous releases       | Anyone to submit patches or backports to prior releases, contains the "Shiproom Template"  |
+| [Shared framework](SharedFramework.md)         | Overview of the ASP.NET Core Shared framework | Anyone looking to understand the policies in place for managing the code of the shared framework         |
+| Submodules           | Documentation on working with submodules in Git     |   Anyone working with submodules in the repo     |
+| [Triage process](TriageProcess.md)| Overview of the issue triage process used in the repo     | Anyone looking to understand the triage process on the repo  |

+ 1 - 1
docs/ReferenceResolution.md

@@ -54,7 +54,7 @@ Steps for adding a new package dependency to an existing project. Let's say I'm
 1. Add the package to the .csproj file using `<Reference Include="System.Banana" />`
 2. Add an entry to [eng/Dependencies.props](/eng/Dependencies.props) e.g. `<LatestPackageReference Include="System.Banana" />`
 3. If this package comes from another dotnet team and should be updated automatically by our bot&hellip;
-    1. Add an entry to [eng/Versions.props](/eng/Versions.props) like this `<SystemBananaPackageVersion>0.0.1-beta-1</SystemBananaPackageVersion>`.
+    1. Add an entry to [eng/Versions.props](/eng/Versions.props) like this `<SystemBananaVersion>0.0.1-beta-1</SystemBananaVersion>`.
     2. Add an entry to [eng/Version.Details.xml](/eng/Version.Details.xml) like this:
 
         ```xml

+ 1 - 1
docs/TriageProcess.md

@@ -53,7 +53,7 @@ We may not investigate issues which haven't received many votes/comments and cho
 For some feature requests and bug reports, depending on the user involvement, we may choose to move these to the backlog at this point. What this means, is that they will not be looked at again up until the next major release planning.
 
 ## Release Planning
-Once we approach to the end of the release cylce (.NET Core 3, .NET 5) we will look through the accumulated issues in the `Backlog` milestone. This is a long process as the amount of issues accumulated in this milestone is quite large.
+Once we approach to the end of the release cycle (.NET Core 3, .NET 5) we will look through the accumulated issues in the `Backlog` milestone. This is a long process as the amount of issues accumulated in this milestone is quite large.
 
 We will try to prioritize issues with most community requests / upvotes assuming these are aligned with our goals.
 Issues, which we will think are candidates for the upcoming release, will be moved to the `Next Sprint Planning` milestone.

+ 12 - 13
docs/area-owners.md

@@ -2,22 +2,21 @@ The below table lists all the `area-`labels used in the `aspnetcore` repository
 
 | Area label | Owner | Description|
 |--- | ---| --- |
-| area-azure | anurse | |
+| area-azure | BrennanConroy | |
 | area-blazor | mkArtakMSFT | Blazor server and Blazor WASM related |
-| area-commandlinetools | anurse, mkArtakMSFT | dev certs, dotnet watch,  |
-| area-dataprotection | anurse | |
+| area-commandlinetools |  mkArtakMSFT | dev certs, dotnet watch,  |
+| area-dataprotection | Pilchie | |
 | area-grpc | shirhatti | |
-| area-healthchecks | rynowak | |
-| area-hosting | anurse | |
-| area-httpclientfactory | anurse | |
+| area-healthchecks | mkArtakMSFT | |
+| area-hosting | BrennanConroy | |
 | area-identity | blowdart | |
 | area-infrastructure | dougbu | |
-| area-installers | anurse | |
-| area-middleware | anurse | |
+| area-installers | dougbu | |
+| area-middleware | BrennanConroy | |
 | area-mvc | mkArtakMSFT | |
-| area-perf | anurse | |
-| area-platform | anurse | |
+| area-perf | sebastienros | |
+| area-platform | JunTaoLuo | |
 | area-security | blowdart | |
-| area-servers | anurse | |
-| area-signalr | anurse | |
-| area-websockets | anurse | |
+| area-servers | BrennanConroy | |
+| area-signalr | BrennanConroy | |
+| area-websockets | BrennanConroy | |

+ 1 - 1
eng/AfterSolutionBuild.targets

@@ -15,7 +15,7 @@
     <RepoTasks.RemoveSharedFrameworkDependencies Condition="@(_BuildOutput->Count()) != 0"
       Files="@(_BuildOutput)"
       FrameworkOnlyPackages="@(AspNetCoreAppReference)"
-      SharedFrameworkTargetFramework="net$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)" />
+      SharedFrameworkTargetFramework="$(DefaultNetCoreTargetFramework)" />
   </Target>
 
 </Project>

+ 12 - 7
eng/Build.props

@@ -21,13 +21,17 @@
                       $(RepoRoot)src\Tools\dotnet-watch\test\TestProjects\**\*.csproj;
                       $(RepoRoot)src\Tools\Tests.Common\TestProjects\**\*.csproj;
                       $(RepoRoot)src\Razor\Razor.Design\test\testassets\**\*.*proj;
+                      $(RepoRoot)src\Razor\test\testassets\**\*.*proj;
+                      $(RepoRoot)src\Components\Web.JS\node_modules\**\*.*proj;
+                      $(RepoRoot)src\Components\WebAssembly\Sdk\testassets\**\*.csproj;
+                      " />
+
+    <!-- These projects are not meant to be built in this repo. In the Installers case, must explicitly opt in. -->
+    <ProjectToExclude Include="
                       $(RepoRoot)src\submodules\**\*.*proj;
                       $(RepoRoot)src\Installers\**\*.*proj;
                       $(RepoRoot)src\SignalR\clients\ts\**\node_modules\**\*.*proj;
-                      $(RepoRoot)src\Components\Web.JS\node_modules\**\*.*proj;
-                      $(RepoRoot)src\Components\WebAssembly\Sdk\testassets\**\*.csproj;
-                      $(RepoRoot)src\ProjectTemplates\Web.ProjectTemplates\content\**\*.csproj;
-                      $(RepoRoot)src\ProjectTemplates\Web.ProjectTemplates\content\**\*.fsproj;
+                      $(RepoRoot)src\ProjectTemplates\Web.ProjectTemplates\content\**\*.*proj;
                       $(RepoRoot)src\ProjectTemplates\Web.Spa.ProjectTemplates\content\**\*.csproj;
                       " />
 
@@ -139,12 +143,14 @@
                           $(RepoRoot)src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj;
                           $(RepoRoot)src\Framework\App.Ref.Internal\src\Microsoft.AspNetCore.App.Ref.Internal.csproj;
                           $(RepoRoot)src\Framework\test\Microsoft.AspNetCore.App.UnitTests.csproj;
+                          $(RepoRoot)src\Caching\**\*.*proj;
                           $(RepoRoot)src\DefaultBuilder\**\*.*proj;
                           $(RepoRoot)src\Features\JsonPatch\**\*.*proj;
                           $(RepoRoot)src\DataProtection\**\*.*proj;
                           $(RepoRoot)src\Antiforgery\**\*.*proj;
                           $(RepoRoot)src\Hosting\**\*.*proj;
                           $(RepoRoot)src\Http\**\*.*proj;
+                          $(RepoRoot)src\HttpClientFactory\**\*.*proj;
                           $(RepoRoot)src\Html\**\*.*proj;
                           $(RepoRoot)src\Identity\**\*.*proj;
                           $(RepoRoot)src\Servers\**\*.csproj;
@@ -176,19 +182,19 @@
                         Exclude="
                           @(ProjectToBuild);
                           @(ProjectToExclude);
-                          $(RepoRoot)src\Razor\test\testassets\**\*.*proj;
-                          $(RepoRoot)src\Components\WebAssembly\Sdk\testassets\**\*.*proj;
                           $(RepoRoot)**\node_modules\**\*;
                           $(RepoRoot)**\bin\**\*;
                           $(RepoRoot)**\obj\**\*;"
                         Condition=" '$(BuildMainlyReferenceProviders)' != 'true' " />
         <DotNetProjects Include="
+                          $(RepoRoot)src\Caching\**\src\*.csproj;
                           $(RepoRoot)src\DefaultBuilder\**\src\*.csproj;
                           $(RepoRoot)src\Features\JsonPatch\**\src\*.csproj;
                           $(RepoRoot)src\DataProtection\**\src\*.csproj;
                           $(RepoRoot)src\Antiforgery\**\src\*.csproj;
                           $(RepoRoot)src\Hosting\**\src\*.csproj;
                           $(RepoRoot)src\Http\**\src\*.csproj;
+                          $(RepoRoot)src\HttpClientFactory\**\src\*.csproj;
                           $(RepoRoot)src\Html\**\src\*.csproj;
                           $(RepoRoot)src\Identity\**\src\*.csproj;
                           $(RepoRoot)src\Servers\**\src\*.csproj;
@@ -214,7 +220,6 @@
                         Exclude="
                           @(ProjectToBuild);
                           @(ProjectToExclude);
-                          $(RepoRoot)src\Razor\test\testassets\**\*.*proj;
                           $(RepoRoot)**\node_modules\**\*;
                           $(RepoRoot)**\bin\**\*;
                           $(RepoRoot)**\obj\**\*;"

+ 7 - 7
eng/Dependencies.props

@@ -92,6 +92,7 @@ and are generated based on the last package release.
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.win-arm" />
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.win-arm64" />
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.osx-x64" />
+    <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.osx-arm64" />
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.linux-x64" />
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.linux-arm" />
     <LatestPackageReference Include="Microsoft.NETCore.App.Runtime.linux-arm64" />
@@ -103,9 +104,10 @@ and are generated based on the last package release.
   <ItemGroup Label=".NET team dependencies (Non-source-build)" Condition="'$(DotNetBuildFromSource)' != 'true'">
     <LatestPackageReference Include="Microsoft.AspNet.WebApi.Client" />
     <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.2.1" />
-    <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.2.2" />
     <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.1.x64" />
     <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.3.1.x86" />
+    <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.5.0.x64" />
+    <LatestPackageReference Include="Microsoft.AspNetCore.AzureAppServices.SiteExtension.5.0.x86" />
     <LatestPackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Runtime" />
     <LatestPackageReference Include="Microsoft.Bcl.AsyncInterfaces" />
     <LatestPackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" />
@@ -132,6 +134,7 @@ and are generated based on the last package release.
     <LatestPackageReference Include="Microsoft.Web.Xdt" />
     <LatestPackageReference Include="NETStandard.Library" />
     <LatestPackageReference Include="System.IdentityModel.Tokens.Jwt" />
+    <LatestPackageReference Include="System.Net.Experimental.MsQuic" />
     <LatestPackageReference Include="System.Net.Http.WinHttpHandler" />
     <LatestPackageReference Include="System.Net.WebSockets.WebSocketProtocol" />
     <LatestPackageReference Include="System.ServiceProcess.ServiceController" />
@@ -173,6 +176,8 @@ and are generated based on the last package release.
     <LatestPackageReference Include="Newtonsoft.Json.Bson" />
     <LatestPackageReference Include="NSwag.ApiDescription.Client" />
     <LatestPackageReference Include="NuGet.Versioning" />
+    <LatestPackageReference Include="Polly" />
+    <LatestPackageReference Include="Polly.Extensions.Http" />
     <LatestPackageReference Include="Selenium.Support" />
     <LatestPackageReference Include="Selenium.WebDriver" />
     <LatestPackageReference Include="Selenium.WebDriver.ChromeDriver" />
@@ -196,12 +201,7 @@ and are generated based on the last package release.
 
     <!-- Get versions. -->
     <LatestPackageReference Update="@(LatestPackageReference)">
-      <Version>$(%(VersionName)PackageVersion)</Version>
-      <RTMVersion>$(%(VersionName)V0PackageVersion)</RTMVersion>
-
-      <!-- Remove excess metadata. -->
-      <RTMVersion Condition=" '%(Version)' == '%(RTMVersion)' " />
-      <VersionName />
+      <Version>$(%(VersionName)Version)</Version>
     </LatestPackageReference>
 
     <!--

+ 3 - 0
eng/ProjectReferences.props

@@ -5,6 +5,8 @@
 -->
 <Project>
   <ItemGroup>
+    <ProjectReferenceProvider Include="Microsoft.Extensions.Caching.SqlServer" ProjectPath="$(RepoRoot)src\Caching\SqlServer\src\Microsoft.Extensions.Caching.SqlServer.csproj" />
+    <ProjectReferenceProvider Include="Microsoft.Extensions.Caching.StackExchangeRedis" ProjectPath="$(RepoRoot)src\Caching\StackExchangeRedis\src\Microsoft.Extensions.Caching.StackExchangeRedis.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore" ProjectPath="$(RepoRoot)src\DefaultBuilder\src\Microsoft.AspNetCore.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.JsonPatch" ProjectPath="$(RepoRoot)src\Features\JsonPatch\src\Microsoft.AspNetCore.JsonPatch.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.DataProtection.Abstractions" ProjectPath="$(RepoRoot)src\DataProtection\Abstractions\src\Microsoft.AspNetCore.DataProtection.Abstractions.csproj" />
@@ -32,6 +34,7 @@
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.Routing.Abstractions" ProjectPath="$(RepoRoot)src\Http\Routing.Abstractions\src\Microsoft.AspNetCore.Routing.Abstractions.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.Routing" ProjectPath="$(RepoRoot)src\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.WebUtilities" ProjectPath="$(RepoRoot)src\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj" />
+    <ProjectReferenceProvider Include="Microsoft.Extensions.Http.Polly" ProjectPath="$(RepoRoot)src\HttpClientFactory\Polly\src\Microsoft.Extensions.Http.Polly.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.Html.Abstractions" ProjectPath="$(RepoRoot)src\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" ProjectPath="$(RepoRoot)src\Identity\ApiAuthorization.IdentityServer\src\Microsoft.AspNetCore.ApiAuthorization.IdentityServer.csproj" />
     <ProjectReferenceProvider Include="Microsoft.AspNetCore.Identity" ProjectPath="$(RepoRoot)src\Identity\Core\src\Microsoft.AspNetCore.Identity.csproj" />

+ 0 - 64
eng/PublishSymbols.proj

@@ -1,64 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk" DefaultTargets="RunPublishSymbols">
-  <PropertyGroup>
-    <!-- TFM doesn't matter. These settings are required to make NuGet happy so we can restore required MSBuild packages. -->
-    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
-    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
-    <ManifestsPath>artifacts\manifests\</ManifestsPath>
-    <DisablePackageReferenceRestrictions>true</DisablePackageReferenceRestrictions>
-
-    <!-- Expire symbols after 10 years (or so) by default. -->
-    <DotNetSymbolExpirationInDays Condition="'$(DotNetSymbolExpirationInDays)' == ''">3650</DotNetSymbolExpirationInDays>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Microsoft.SymbolUploader.Build.Task" Version="$(MicrosoftSymbolUploaderBuildTaskPackageVersion)" />
-  </ItemGroup>
-
-  <!--
-    Initially copied from
-    https://github.com/dotnet/core-setup/blob/19390ee14c2824c39db393aff75a95788ececebf/publish/publish.proj#L242-L286
-  -->
-  <Target Name="RunPublishSymbols">
-    <ItemGroup>
-      <SymbolServerConfig
-        Include="MSDL (public symbols server)"
-        Url="https://microsoftpublicsymbols.artifacts.visualstudio.com/DefaultCollection"
-        Pat="$(MicrosoftSymbolServerPAT)" />
-
-      <SymbolServerConfig
-        Include="SymWeb (internal symbols server)"
-        Url="https://microsoft.artifacts.visualstudio.com/DefaultCollection"
-        Pat="$(SymwebSymbolServerPAT)" />
-    </ItemGroup>
-
-    <Error
-      Condition="'%(SymbolServerConfig.Pat)' == ''"
-      Text="Missing symbol server publish PAT for '%(SymbolServerConfig.Identity)'" />
-
-    <!-- Could also set SymbolDryRun, SymbolExpirationInDays or SymbolVerboseLogging. -->
-    <ItemGroup>
-      <SymbolServerPublishProject
-        Include="$(MSBuildProjectFullPath)"
-        AdditionalProperties="
-          SymbolServerDescription=%(SymbolServerConfig.Identity);
-          SymbolServerPath=%(SymbolServerConfig.Url);
-          SymbolServerPAT=%(SymbolServerConfig.Pat)" />
-    </ItemGroup>
-
-    <!-- Note: Can't run in parallel. Symbol publish opens the zips exclusively. -->
-    <MSBuild
-      Projects="@(SymbolServerPublishProject)"
-      Targets="SetupPublishSymbols;PublishSymbols"
-      Properties="SymbolDirectory=$(SymbolDirectory)" />
-  </Target>
-
-  <Target Name="SetupPublishSymbols">
-    <ItemGroup>
-      <SymbolFilesToPublish Include="$(SymbolDirectory)/**/*.pdb" />
-      <SymbolPackagesToPublish Include="$(SymbolDirectory)/**/*.symbols.nupkg" />
-    </ItemGroup>
-
-    <Message Importance="High" Text="Publishing symbol files to '$(SymbolServerDescription)':%0A  @(SymbolFilesToPublish, '%0A  ')" />
-    <Message Importance="High" Text="Publishing symbol packages to '$(SymbolServerDescription)':%0A  @(SymbolPackagesToPublish, '%0A  ')"/>
-  </Target>
-</Project>

+ 0 - 4
eng/Publishing.props

@@ -58,10 +58,6 @@
            Do not remove if post build sign is true, as we avoid the xplat codesign jobs, and need to have
            the nupkgs pushed. -->
       <ItemsToPushToBlobFeed Remove="@(ItemsToPushToBlobFeed)" Condition="'$(OS)' != 'Windows_NT' and '$(PostBuildSign)' != 'true'" />
-      <!-- Linux x64 is built in 3 stages: Build the base packages, layout, and archive. Then build deb and rpm installers.
-           The first and last segments will both publish the layout (they share artifacts). Only publish this during the first pass. -->
-      <_InstallersToPublish Remove="$(ArtifactsDir)installers\**\*.tar.gz" Condition="'$(BuildRuntimeArchive)' == 'false'" />
-      <_ChecksumsToPublish Remove="$(ArtifactsDir)installers\**\*.tar.gz.sha512" Condition="'$(BuildRuntimeArchive)' == 'false'" />
 
       <ItemsToPushToBlobFeed Include="@(_ChecksumsToPublish)">
         <PublishFlatContainer>true</PublishFlatContainer>

+ 6 - 1
eng/QuarantinedTests.BeforeArcade.props

@@ -1,9 +1,14 @@
 <Project>
-  <PropertyGroup>
+  <PropertyGroup Condition="'$(UseVSTestRunner)' != 'true'">
     <_QuarantinedTestRunAdditionalArgs>-trait "Quarantined=true"</_QuarantinedTestRunAdditionalArgs>
     <_NonQuarantinedTestRunAdditionalArgs>-notrait "Quarantined=true"</_NonQuarantinedTestRunAdditionalArgs>
   </PropertyGroup>
 
+  <PropertyGroup Condition="'$(UseVSTestRunner)' == 'true'">
+    <_QuarantinedTestRunAdditionalArgs>--filter Quarantined=true</_QuarantinedTestRunAdditionalArgs>
+    <_NonQuarantinedTestRunAdditionalArgs>--filter Quarantined!=true</_NonQuarantinedTestRunAdditionalArgs>
+  </PropertyGroup>
+
   <PropertyGroup>
     <TestRunnerAdditionalArguments Condition="'$(RunQuarantinedTests)' == ''">$(_NonQuarantinedTestRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
     <TestRunnerAdditionalArguments Condition="'$(RunQuarantinedTests)' == 'true'">$(_QuarantinedTestRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>

+ 41 - 41
eng/SharedFramework.External.props

@@ -7,41 +7,41 @@
 <Project>
   <ItemGroup>
     <!-- Dependencies from dotnet/runtime -->
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Caching.Abstractions"                    Version="$(MicrosoftExtensionsCachingAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Caching.Memory"                          Version="$(MicrosoftExtensionsCachingMemoryPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Abstractions"              Version="$(MicrosoftExtensionsConfigurationAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Binder"                    Version="$(MicrosoftExtensionsConfigurationBinderPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.CommandLine"               Version="$(MicrosoftExtensionsConfigurationCommandLinePackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables"      Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.FileExtensions"            Version="$(MicrosoftExtensionsConfigurationFileExtensionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Ini"                       Version="$(MicrosoftExtensionsConfigurationIniPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Json"                      Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.UserSecrets"               Version="$(MicrosoftExtensionsConfigurationUserSecretsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Xml"                       Version="$(MicrosoftExtensionsConfigurationXmlPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration"                           Version="$(MicrosoftExtensionsConfigurationPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.DependencyInjection.Abstractions"        Version="$(MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.DependencyInjection"                     Version="$(MicrosoftExtensionsDependencyInjectionPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Abstractions"              Version="$(MicrosoftExtensionsFileProvidersAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Composite"                 Version="$(MicrosoftExtensionsFileProvidersCompositePackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Physical"                  Version="$(MicrosoftExtensionsFileProvidersPhysicalPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileSystemGlobbing"                      Version="$(MicrosoftExtensionsFileSystemGlobbingPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Hosting.Abstractions"                    Version="$(MicrosoftExtensionsHostingAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Hosting"                                 Version="$(MicrosoftExtensionsHostingPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Http"                                    Version="$(MicrosoftExtensionsHttpPackageVersion)"  />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Abstractions"                    Version="$(MicrosoftExtensionsLoggingAbstractionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Configuration"                   Version="$(MicrosoftExtensionsLoggingConfigurationPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Console"                         Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Debug"                           Version="$(MicrosoftExtensionsLoggingDebugPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.EventSource"                     Version="$(MicrosoftExtensionsLoggingEventSourcePackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.EventLog"                        Version="$(MicrosoftExtensionsLoggingEventLogPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.TraceSource"                     Version="$(MicrosoftExtensionsLoggingTraceSourcePackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging"                                 Version="$(MicrosoftExtensionsLoggingPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options.ConfigurationExtensions"         Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options.DataAnnotations"                 Version="$(MicrosoftExtensionsOptionsDataAnnotationsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options"                                 Version="$(MicrosoftExtensionsOptionsPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Primitives"                              Version="$(MicrosoftExtensionsPrimitivesPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="System.IO.Pipelines"                                          Version="$(SystemIOPipelinesPackageVersion)" />
-    <ExternalAspNetCoreAppReference Include="System.Security.Cryptography.Xml"                             Version="$(SystemSecurityCryptographyXmlPackageVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Caching.Abstractions"                    Version="$(MicrosoftExtensionsCachingAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Caching.Memory"                          Version="$(MicrosoftExtensionsCachingMemoryVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Abstractions"              Version="$(MicrosoftExtensionsConfigurationAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Binder"                    Version="$(MicrosoftExtensionsConfigurationBinderVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.CommandLine"               Version="$(MicrosoftExtensionsConfigurationCommandLineVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables"      Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.FileExtensions"            Version="$(MicrosoftExtensionsConfigurationFileExtensionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Ini"                       Version="$(MicrosoftExtensionsConfigurationIniVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Json"                      Version="$(MicrosoftExtensionsConfigurationJsonVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.UserSecrets"               Version="$(MicrosoftExtensionsConfigurationUserSecretsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration.Xml"                       Version="$(MicrosoftExtensionsConfigurationXmlVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Configuration"                           Version="$(MicrosoftExtensionsConfigurationVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.DependencyInjection.Abstractions"        Version="$(MicrosoftExtensionsDependencyInjectionAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.DependencyInjection"                     Version="$(MicrosoftExtensionsDependencyInjectionVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Abstractions"              Version="$(MicrosoftExtensionsFileProvidersAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Composite"                 Version="$(MicrosoftExtensionsFileProvidersCompositeVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileProviders.Physical"                  Version="$(MicrosoftExtensionsFileProvidersPhysicalVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.FileSystemGlobbing"                      Version="$(MicrosoftExtensionsFileSystemGlobbingVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Hosting.Abstractions"                    Version="$(MicrosoftExtensionsHostingAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Hosting"                                 Version="$(MicrosoftExtensionsHostingVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Http"                                    Version="$(MicrosoftExtensionsHttpVersion)"  />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Abstractions"                    Version="$(MicrosoftExtensionsLoggingAbstractionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Configuration"                   Version="$(MicrosoftExtensionsLoggingConfigurationVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Console"                         Version="$(MicrosoftExtensionsLoggingConsoleVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.Debug"                           Version="$(MicrosoftExtensionsLoggingDebugVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.EventSource"                     Version="$(MicrosoftExtensionsLoggingEventSourceVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.EventLog"                        Version="$(MicrosoftExtensionsLoggingEventLogVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging.TraceSource"                     Version="$(MicrosoftExtensionsLoggingTraceSourceVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Logging"                                 Version="$(MicrosoftExtensionsLoggingVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options.ConfigurationExtensions"         Version="$(MicrosoftExtensionsOptionsConfigurationExtensionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options.DataAnnotations"                 Version="$(MicrosoftExtensionsOptionsDataAnnotationsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Options"                                 Version="$(MicrosoftExtensionsOptionsVersion)" />
+    <ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Primitives"                              Version="$(MicrosoftExtensionsPrimitivesVersion)" />
+    <ExternalAspNetCoreAppReference Include="System.IO.Pipelines"                                          Version="$(SystemIOPipelinesVersion)" />
+    <ExternalAspNetCoreAppReference Include="System.Security.Cryptography.Xml"                             Version="$(SystemSecurityCryptographyXmlVersion)" />
 
     <!--
       Transitive dependencies of other assemblies in the shared framework. These are listed separately and should not be included directly
@@ -52,16 +52,16 @@
 
       If these are needed as direct dependencies, it is okay to change them to ExternalAspNetCoreAppReference and move up into sections above.
     -->
-    <_TransitiveExternalAspNetCoreAppReference Include="Microsoft.Win32.SystemEvents"                       Version="$(MicrosoftWin32SystemEventsPackageVersion)" />
-    <_TransitiveExternalAspNetCoreAppReference Include="System.Drawing.Common"                              Version="$(SystemDrawingCommonPackageVersion)" />
-    <_TransitiveExternalAspNetCoreAppReference Include="System.Security.Cryptography.Pkcs"                  Version="$(SystemSecurityCryptographyPkcsPackageVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="Microsoft.Win32.SystemEvents"                       Version="$(MicrosoftWin32SystemEventsVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="System.Drawing.Common"                              Version="$(SystemDrawingCommonVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="System.Security.Cryptography.Pkcs"                  Version="$(SystemSecurityCryptographyPkcsVersion)" />
     <!--
       Seems arbitrary that the following packages have their ref/ assemblies in our targeting pack but the above
       three do not. This is likely about our public APIs i.e. external compilation requirements.
     -->
-    <_TransitiveExternalAspNetCoreAppReference Include="System.Diagnostics.EventLog"                        Version="$(SystemDiagnosticsEventLogPackageVersion)" />
-    <_TransitiveExternalAspNetCoreAppReference Include="System.Security.Permissions"                        Version="$(SystemSecurityPermissionsPackageVersion)" />
-    <_TransitiveExternalAspNetCoreAppReference Include="System.Windows.Extensions"                          Version="$(SystemWindowsExtensionsPackageVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="System.Diagnostics.EventLog"                        Version="$(SystemDiagnosticsEventLogVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="System.Security.Permissions"                        Version="$(SystemSecurityPermissionsVersion)" />
+    <_TransitiveExternalAspNetCoreAppReference Include="System.Windows.Extensions"                          Version="$(SystemWindowsExtensionsVersion)" />
   </ItemGroup>
 
   <ItemGroup Condition=" '$(IsServicingBuild)' == 'true' ">

+ 1 - 0
eng/Signing.props

@@ -5,6 +5,7 @@
   <ItemGroup>
     <!-- Reset Arcade's defaults. -->
     <ItemsToSign Remove="@(ItemsToSign)" />
+    <ItemsToSignPostBuild Remove="@(ItemsToSignPostBuild)" />
     <FileExtensionSignInfo Remove="@(FileExtensionSignInfo)" />
   </ItemGroup>
 

+ 1 - 1
eng/Tools.props

@@ -7,7 +7,7 @@
       Since this project is evaluated before .npmproj files are loaded, this should cause the package to end up in
       the NuGet cache ahead of time. This is not needed in source build.
     -->
-    <PackageReference Include="Yarn.MSBuild" Version="1.15.2" />
+    <PackageReference Include="Yarn.MSBuild" Version="1.22.10" />
   </ItemGroup>
 
   <!-- Update the generated files when we restore projects. Skip in desktop msbuild due to VS 16.8 requirements. -->

+ 153 - 157
eng/Version.Details.xml

@@ -9,321 +9,317 @@
 -->
 <Dependencies>
   <ProductDependencies>
-    <Dependency Name="dotnet-ef" Version="5.0.1">
+    <Dependency Name="dotnet-ef" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.EntityFrameworkCore.Design" Version="5.0.1">
+    <Dependency Name="Microsoft.EntityFrameworkCore.Design" Version="6.0.0-alpha.1.20614.1">
       <Uri>https://github.com/dotnet/efcore</Uri>
-      <Sha>494e218127bfb7afee3c9b10a30bcd32d6cd80db</Sha>
+      <Sha>8f1500c0a2bdb0938855a90f3956ee24c3961194</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Configuration" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Configuration" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="5.0.1">
+    <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="5.0.0-rtm.20519.4">
+    <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Hosting" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Hosting" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Http" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Http" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.Console" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.Console" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Logging" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Logging" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Options" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Options" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Primitives" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.Primitives" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.Internal.Transport" Version="5.0.0-rtm.20519.4">
+    <Dependency Name="Microsoft.Extensions.Internal.Transport" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Win32.Registry" Version="5.0.0">
+    <Dependency Name="Microsoft.Win32.Registry" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Win32.SystemEvents" Version="5.0.0">
+    <Dependency Name="Microsoft.Win32.SystemEvents" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.ComponentModel.Annotations" Version="5.0.0">
+    <Dependency Name="System.ComponentModel.Annotations" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Diagnostics.DiagnosticSource" Version="5.0.0">
+    <Dependency Name="System.Diagnostics.DiagnosticSource" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Diagnostics.EventLog" Version="5.0.0">
+    <Dependency Name="System.Diagnostics.EventLog" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.DirectoryServices.Protocols" Version="5.0.0">
+    <Dependency Name="System.DirectoryServices.Protocols" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Drawing.Common" Version="5.0.0">
+    <Dependency Name="System.Drawing.Common" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.IO.Pipelines" Version="5.0.1">
+    <Dependency Name="System.IO.Pipelines" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Net.Http.Json" Version="5.0.0">
+    <Dependency Name="System.Net.Http.Json" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Net.Http.WinHttpHandler" Version="5.0.0">
+    <Dependency Name="System.Net.Http.WinHttpHandler" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="5.0.0">
+    <Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Reflection.Metadata" Version="5.0.0">
+    <Dependency Name="System.Reflection.Metadata" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Resources.Extensions" Version="5.0.0">
+    <Dependency Name="System.Resources.Extensions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="5.0.0">
+    <Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <!-- System.Security.AccessControl should only be referenced in Dependencies.props and RepoTasks.csproj. -->
-    <Dependency Name="System.Security.AccessControl" Version="5.0.0">
+    <!-- System.Security.AccessControl should only be referenced in Dependencies.props and RTMVersions.csproj. -->
+    <Dependency Name="System.Security.AccessControl" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Security.Cryptography.Cng" Version="5.0.0">
+    <Dependency Name="System.Security.Cryptography.Cng" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Security.Cryptography.Pkcs" Version="5.0.1">
+    <Dependency Name="System.Security.Cryptography.Pkcs" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Security.Cryptography.Xml" Version="5.0.0">
+    <Dependency Name="System.Security.Cryptography.Xml" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Security.Permissions" Version="5.0.0">
+    <Dependency Name="System.Security.Permissions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Security.Principal.Windows" Version="5.0.0">
+    <Dependency Name="System.Security.Principal.Windows" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.ServiceProcess.ServiceController" Version="5.0.0">
+    <Dependency Name="System.ServiceProcess.ServiceController" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Text.Encodings.Web" Version="5.0.0">
+    <Dependency Name="System.Text.Encodings.Web" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Text.Json" Version="5.0.0">
+    <Dependency Name="System.Text.Json" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Threading.Channels" Version="5.0.0">
+    <Dependency Name="System.Threading.Channels" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="System.Windows.Extensions" Version="5.0.0">
+    <Dependency Name="System.Windows.Extensions" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.Extensions.DependencyModel" Version="5.0.0">
+    <Dependency Name="Microsoft.Extensions.DependencyModel" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.NETCore.App.Ref" Version="5.0.0">
+    <Dependency Name="Microsoft.NETCore.App.Ref" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
     <!--
          Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
          All Runtime.$rid packages should have the same version.
     -->
-    <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="5.0.1">
+    <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.NETCore.App.Internal" Version="5.0.1-servicing.20575.16">
+    <Dependency Name="Microsoft.NETCore.BrowserDebugHost.Transport" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
-    </Dependency>
-    <Dependency Name="Microsoft.NETCore.BrowserDebugHost.Transport" Version="5.0.1-servicing.20575.16">
-      <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>b02e13abab3d6f499751af2ad1ae6333fb4e633d</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
   </ProductDependencies>
   <ToolsetDependencies>
     <!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
-    <Dependency Name="Microsoft.NETCore.Platforms" Version="5.0.0">
+    <Dependency Name="Microsoft.NETCore.Platforms" Version="6.0.0-alpha.1.20612.4">
       <Uri>https://github.com/dotnet/runtime</Uri>
-      <Sha>cf258a14b70ad9069470a108f13765e0e5988f51</Sha>
+      <Sha>60b6af1beaf6f973d80cf28d78f3284e2df342c7</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="5.0.0-beta.20580.4">
+    <Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="6.0.0-beta.20610.4">
       <Uri>https://github.com/dotnet/arcade</Uri>
-      <Sha>79333c52da3f213509ab79bd92924660e04e668c</Sha>
+      <Sha>3346d7b4ff047c854913fb2ded6e3aa726da6d11</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.DotNet.Build.Tasks.Installers" Version="5.0.0-beta.20580.4">
+    <Dependency Name="Microsoft.DotNet.Build.Tasks.Installers" Version="6.0.0-beta.20610.4">
       <Uri>https://github.com/dotnet/arcade</Uri>
-      <Sha>79333c52da3f213509ab79bd92924660e04e668c</Sha>
+      <Sha>3346d7b4ff047c854913fb2ded6e3aa726da6d11</Sha>
     </Dependency>
-    <Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="5.0.0-beta.20580.4">
+    <Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="6.0.0-beta.20610.4">
       <Uri>https://github.com/dotnet/arcade</Uri>
-      <Sha>79333c52da3f213509ab79bd92924660e04e668c</Sha>
+      <Sha>3346d7b4ff047c854913fb2ded6e3aa726da6d11</Sha>
     </Dependency>
   </ToolsetDependencies>
 </Dependencies>

+ 185 - 173
eng/Versions.props

@@ -6,36 +6,43 @@
 -->
 <Project>
   <PropertyGroup Label="Version settings">
-    <AspNetCoreMajorVersion>5</AspNetCoreMajorVersion>
+    <AspNetCoreMajorVersion>6</AspNetCoreMajorVersion>
     <AspNetCoreMinorVersion>0</AspNetCoreMinorVersion>
-    <AspNetCorePatchVersion>2</AspNetCorePatchVersion>
+    <AspNetCorePatchVersion>0</AspNetCorePatchVersion>
+    <PreReleaseVersionIteration>1</PreReleaseVersionIteration>
     <!--
         When StabilizePackageVersion is set to 'true', this branch will produce stable outputs for 'Shipping' packages
     -->
-    <StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">true</StabilizePackageVersion>
+    <StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">false</StabilizePackageVersion>
     <DotNetFinalVersionKind Condition="'$(StabilizePackageVersion)' == 'true'">release</DotNetFinalVersionKind>
-    <PreReleaseVersionLabel>servicing</PreReleaseVersionLabel>
-    <PreReleaseBrandingLabel>Servicing</PreReleaseBrandingLabel>
+    <PreReleaseVersionLabel>alpha</PreReleaseVersionLabel>
+    <PreReleaseBrandingLabel>Alpha $(PreReleaseVersionIteration)</PreReleaseBrandingLabel>
     <IncludePreReleaseLabelInPackageVersion>true</IncludePreReleaseLabelInPackageVersion>
     <IncludePreReleaseLabelInPackageVersion Condition=" '$(DotNetFinalVersionKind)' == 'release' ">false</IncludePreReleaseLabelInPackageVersion>
     <AspNetCoreMajorMinorVersion>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</AspNetCoreMajorMinorVersion>
     <!-- Servicing builds have different characteristics for the way dependencies, baselines, and versions are handled. -->
     <IsServicingBuild Condition=" '$(PreReleaseVersionLabel)' == 'servicing' ">true</IsServicingBuild>
-    <VersionPrefix>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion)</VersionPrefix>
+    <VersionPrefix>$(AspNetCoreMajorMinorVersion).$(AspNetCorePatchVersion)</VersionPrefix>
     <!--
       TargetingPackVersionPrefix is used by projects, like .deb and .rpm, which use slightly different version formats.
       It's also used in root Directory.Build.targets to determine the version of the last-built targeting pack.
     -->
     <TargetingPackVersionPrefix>$(VersionPrefix)</TargetingPackVersionPrefix>
     <!-- Targeting packs do not produce patch versions in servicing builds. No API changes are allowed in patches. -->
-    <TargetingPackVersionPrefix Condition="'$(IsTargetingPackBuilding)' != 'true'">$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).0</TargetingPackVersionPrefix>
+    <TargetingPackVersionPrefix Condition="'$(IsTargetingPackBuilding)' != 'true'">$(AspNetCoreMajorMinorVersion).0</TargetingPackVersionPrefix>
     <ExperimentalVersionPrefix>0.3.$(AspNetCorePatchVersion)</ExperimentalVersionPrefix>
     <!-- ANCM versioning is intentionally 10 + AspNetCoreMajorVersion because earlier versions of ANCM shipped as 8.x. -->
     <AspNetCoreModuleVersionMajor>$([MSBuild]::Add(10, $(AspNetCoreMajorVersion)))</AspNetCoreModuleVersionMajor>
     <AspNetCoreModuleVersionMinor>$(AspNetCoreMinorVersion)</AspNetCoreModuleVersionMinor>
     <AspNetCoreModuleVersionRevision>$(AspNetCorePatchVersion)</AspNetCoreModuleVersionRevision>
     <!-- This is used for error checking to ensure generated code and baselines are up to date when we increment the patch. -->
-    <PreviousAspNetCoreReleaseVersion Condition=" '$(AspNetCorePatchVersion)' != '0' ">$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$([MSBuild]::Subtract($(AspNetCorePatchVersion), 1))</PreviousAspNetCoreReleaseVersion>
+    <PreviousAspNetCoreReleaseVersion Condition=" '$(AspNetCorePatchVersion)' != '0' ">$(AspNetCoreMajorMinorVersion).$([MSBuild]::Subtract($(AspNetCorePatchVersion), 1))</PreviousAspNetCoreReleaseVersion>
+    <!--
+      Update the packages referenced in Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj,
+      src\Components\WebAssembly\Sdk\testassets\Directory.Build.props, and
+      src\Razor\test\testassets\Directory.Build.props when this changes.
+    -->
+    <DefaultNetCoreTargetFramework>net6.0</DefaultNetCoreTargetFramework>
   </PropertyGroup>
   <PropertyGroup Label="Arcade settings">
     <!-- Opt-in to Arcade tools for building VSIX projects. -->
@@ -57,85 +64,84 @@
   -->
   <PropertyGroup Label="Automated">
     <!-- Packages from dotnet/runtime -->
-    <MicrosoftExtensionsDependencyModelPackageVersion>5.0.0</MicrosoftExtensionsDependencyModelPackageVersion>
-    <MicrosoftNETCoreAppInternalPackageVersion>5.0.1-servicing.20575.16</MicrosoftNETCoreAppInternalPackageVersion>
-    <MicrosoftNETCoreAppRefPackageVersion>5.0.0</MicrosoftNETCoreAppRefPackageVersion>
-    <MicrosoftNETCoreAppRuntimewinx64PackageVersion>5.0.1</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
-    <MicrosoftNETCoreBrowserDebugHostTransportPackageVersion>5.0.1-servicing.20575.16</MicrosoftNETCoreBrowserDebugHostTransportPackageVersion>
-    <MicrosoftWin32RegistryPackageVersion>5.0.0</MicrosoftWin32RegistryPackageVersion>
-    <MicrosoftWin32SystemEventsPackageVersion>5.0.0</MicrosoftWin32SystemEventsPackageVersion>
-    <MicrosoftExtensionsCachingAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsCachingAbstractionsPackageVersion>
-    <MicrosoftExtensionsCachingMemoryPackageVersion>5.0.0</MicrosoftExtensionsCachingMemoryPackageVersion>
-    <MicrosoftExtensionsConfigurationAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
-    <MicrosoftExtensionsConfigurationBinderPackageVersion>5.0.0</MicrosoftExtensionsConfigurationBinderPackageVersion>
-    <MicrosoftExtensionsConfigurationCommandLinePackageVersion>5.0.0</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
-    <MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>5.0.0</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
-    <MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>5.0.0</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
-    <MicrosoftExtensionsConfigurationIniPackageVersion>5.0.0</MicrosoftExtensionsConfigurationIniPackageVersion>
-    <MicrosoftExtensionsConfigurationJsonPackageVersion>5.0.0</MicrosoftExtensionsConfigurationJsonPackageVersion>
-    <MicrosoftExtensionsConfigurationPackageVersion>5.0.0</MicrosoftExtensionsConfigurationPackageVersion>
-    <MicrosoftExtensionsConfigurationUserSecretsPackageVersion>5.0.0</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
-    <MicrosoftExtensionsConfigurationXmlPackageVersion>5.0.0</MicrosoftExtensionsConfigurationXmlPackageVersion>
-    <MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
-    <MicrosoftExtensionsDependencyInjectionPackageVersion>5.0.1</MicrosoftExtensionsDependencyInjectionPackageVersion>
-    <MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
-    <MicrosoftExtensionsFileProvidersCompositePackageVersion>5.0.0</MicrosoftExtensionsFileProvidersCompositePackageVersion>
-    <MicrosoftExtensionsFileProvidersPhysicalPackageVersion>5.0.0</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
-    <MicrosoftExtensionsFileSystemGlobbingPackageVersion>5.0.0</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
-    <MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>5.0.0-rtm.20519.4</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
-    <MicrosoftExtensionsHostingAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsHostingAbstractionsPackageVersion>
-    <MicrosoftExtensionsHostingPackageVersion>5.0.0</MicrosoftExtensionsHostingPackageVersion>
-    <MicrosoftExtensionsHttpPackageVersion>5.0.0</MicrosoftExtensionsHttpPackageVersion>
-    <MicrosoftExtensionsLoggingAbstractionsPackageVersion>5.0.0</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
-    <MicrosoftExtensionsLoggingConfigurationPackageVersion>5.0.0</MicrosoftExtensionsLoggingConfigurationPackageVersion>
-    <MicrosoftExtensionsLoggingConsolePackageVersion>5.0.0</MicrosoftExtensionsLoggingConsolePackageVersion>
-    <MicrosoftExtensionsLoggingDebugPackageVersion>5.0.0</MicrosoftExtensionsLoggingDebugPackageVersion>
-    <MicrosoftExtensionsLoggingEventSourcePackageVersion>5.0.0</MicrosoftExtensionsLoggingEventSourcePackageVersion>
-    <MicrosoftExtensionsLoggingEventLogPackageVersion>5.0.0</MicrosoftExtensionsLoggingEventLogPackageVersion>
-    <MicrosoftExtensionsLoggingPackageVersion>5.0.0</MicrosoftExtensionsLoggingPackageVersion>
-    <MicrosoftExtensionsLoggingTraceSourcePackageVersion>5.0.0</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
-    <MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>5.0.0</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
-    <MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>5.0.0</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
-    <MicrosoftExtensionsOptionsPackageVersion>5.0.0</MicrosoftExtensionsOptionsPackageVersion>
-    <MicrosoftExtensionsPrimitivesPackageVersion>5.0.0</MicrosoftExtensionsPrimitivesPackageVersion>
-    <MicrosoftExtensionsInternalTransportPackageVersion>5.0.0-rtm.20519.4</MicrosoftExtensionsInternalTransportPackageVersion>
-    <SystemComponentModelAnnotationsPackageVersion>5.0.0</SystemComponentModelAnnotationsPackageVersion>
-    <SystemDiagnosticsDiagnosticSourcePackageVersion>5.0.0</SystemDiagnosticsDiagnosticSourcePackageVersion>
-    <SystemDiagnosticsEventLogPackageVersion>5.0.0</SystemDiagnosticsEventLogPackageVersion>
-    <SystemDirectoryServicesProtocolsPackageVersion>5.0.0</SystemDirectoryServicesProtocolsPackageVersion>
-    <SystemDrawingCommonPackageVersion>5.0.0</SystemDrawingCommonPackageVersion>
-    <SystemIOPipelinesPackageVersion>5.0.1</SystemIOPipelinesPackageVersion>
-    <SystemNetHttpJsonPackageVersion>5.0.0</SystemNetHttpJsonPackageVersion>
-    <SystemNetHttpWinHttpHandlerPackageVersion>5.0.0</SystemNetHttpWinHttpHandlerPackageVersion>
-    <SystemNetWebSocketsWebSocketProtocolPackageVersion>5.0.0</SystemNetWebSocketsWebSocketProtocolPackageVersion>
-    <SystemReflectionMetadataPackageVersion>5.0.0</SystemReflectionMetadataPackageVersion>
-    <SystemResourcesExtensionsPackageVersion>5.0.0</SystemResourcesExtensionsPackageVersion>
-    <SystemRuntimeCompilerServicesUnsafePackageVersion>5.0.0</SystemRuntimeCompilerServicesUnsafePackageVersion>
-    <!-- System.Security.AccessControl should only be referenced in Dependencies.props and RepoTasks.csproj. -->
-    <SystemSecurityAccessControlPackageVersion>5.0.0</SystemSecurityAccessControlPackageVersion>
-    <SystemSecurityCryptographyCngPackageVersion>5.0.0</SystemSecurityCryptographyCngPackageVersion>
-    <SystemSecurityCryptographyPkcsPackageVersion>5.0.1</SystemSecurityCryptographyPkcsPackageVersion>
-    <SystemSecurityCryptographyXmlPackageVersion>5.0.0</SystemSecurityCryptographyXmlPackageVersion>
-    <SystemSecurityPermissionsPackageVersion>5.0.0</SystemSecurityPermissionsPackageVersion>
-    <SystemSecurityPrincipalWindowsPackageVersion>5.0.0</SystemSecurityPrincipalWindowsPackageVersion>
-    <SystemServiceProcessServiceControllerPackageVersion>5.0.0</SystemServiceProcessServiceControllerPackageVersion>
-    <SystemTextEncodingsWebPackageVersion>5.0.0</SystemTextEncodingsWebPackageVersion>
-    <SystemTextJsonPackageVersion>5.0.0</SystemTextJsonPackageVersion>
-    <SystemThreadingChannelsPackageVersion>5.0.0</SystemThreadingChannelsPackageVersion>
-    <SystemWindowsExtensionsPackageVersion>5.0.0</SystemWindowsExtensionsPackageVersion>
+    <MicrosoftExtensionsDependencyModelVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsDependencyModelVersion>
+    <MicrosoftNETCoreAppRefVersion>6.0.0-alpha.1.20612.4</MicrosoftNETCoreAppRefVersion>
+    <MicrosoftNETCoreAppRuntimewinx64Version>6.0.0-alpha.1.20612.4</MicrosoftNETCoreAppRuntimewinx64Version>
+    <MicrosoftNETCoreBrowserDebugHostTransportVersion>6.0.0-alpha.1.20612.4</MicrosoftNETCoreBrowserDebugHostTransportVersion>
+    <MicrosoftWin32RegistryVersion>6.0.0-alpha.1.20612.4</MicrosoftWin32RegistryVersion>
+    <MicrosoftWin32SystemEventsVersion>6.0.0-alpha.1.20612.4</MicrosoftWin32SystemEventsVersion>
+    <MicrosoftExtensionsCachingAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsCachingAbstractionsVersion>
+    <MicrosoftExtensionsCachingMemoryVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsCachingMemoryVersion>
+    <MicrosoftExtensionsConfigurationAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationAbstractionsVersion>
+    <MicrosoftExtensionsConfigurationBinderVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationBinderVersion>
+    <MicrosoftExtensionsConfigurationCommandLineVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationCommandLineVersion>
+    <MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>
+    <MicrosoftExtensionsConfigurationFileExtensionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationFileExtensionsVersion>
+    <MicrosoftExtensionsConfigurationIniVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationIniVersion>
+    <MicrosoftExtensionsConfigurationJsonVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationJsonVersion>
+    <MicrosoftExtensionsConfigurationVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationVersion>
+    <MicrosoftExtensionsConfigurationUserSecretsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationUserSecretsVersion>
+    <MicrosoftExtensionsConfigurationXmlVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsConfigurationXmlVersion>
+    <MicrosoftExtensionsDependencyInjectionAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsDependencyInjectionAbstractionsVersion>
+    <MicrosoftExtensionsDependencyInjectionVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsDependencyInjectionVersion>
+    <MicrosoftExtensionsFileProvidersAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsFileProvidersAbstractionsVersion>
+    <MicrosoftExtensionsFileProvidersCompositeVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsFileProvidersCompositeVersion>
+    <MicrosoftExtensionsFileProvidersPhysicalVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsFileProvidersPhysicalVersion>
+    <MicrosoftExtensionsFileSystemGlobbingVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsFileSystemGlobbingVersion>
+    <MicrosoftExtensionsHostFactoryResolverSourcesVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsHostFactoryResolverSourcesVersion>
+    <MicrosoftExtensionsHostingAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsHostingAbstractionsVersion>
+    <MicrosoftExtensionsHostingVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsHostingVersion>
+    <MicrosoftExtensionsHttpVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsHttpVersion>
+    <MicrosoftExtensionsLoggingAbstractionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingAbstractionsVersion>
+    <MicrosoftExtensionsLoggingConfigurationVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingConfigurationVersion>
+    <MicrosoftExtensionsLoggingConsoleVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingConsoleVersion>
+    <MicrosoftExtensionsLoggingDebugVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingDebugVersion>
+    <MicrosoftExtensionsLoggingEventSourceVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingEventSourceVersion>
+    <MicrosoftExtensionsLoggingEventLogVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingEventLogVersion>
+    <MicrosoftExtensionsLoggingVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingVersion>
+    <MicrosoftExtensionsLoggingTraceSourceVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsLoggingTraceSourceVersion>
+    <MicrosoftExtensionsOptionsConfigurationExtensionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsOptionsConfigurationExtensionsVersion>
+    <MicrosoftExtensionsOptionsDataAnnotationsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsOptionsDataAnnotationsVersion>
+    <MicrosoftExtensionsOptionsVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsOptionsVersion>
+    <MicrosoftExtensionsPrimitivesVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsPrimitivesVersion>
+    <MicrosoftExtensionsInternalTransportVersion>6.0.0-alpha.1.20612.4</MicrosoftExtensionsInternalTransportVersion>
+    <SystemComponentModelAnnotationsVersion>6.0.0-alpha.1.20612.4</SystemComponentModelAnnotationsVersion>
+    <SystemDiagnosticsDiagnosticSourceVersion>6.0.0-alpha.1.20612.4</SystemDiagnosticsDiagnosticSourceVersion>
+    <SystemDiagnosticsEventLogVersion>6.0.0-alpha.1.20612.4</SystemDiagnosticsEventLogVersion>
+    <SystemDirectoryServicesProtocolsVersion>6.0.0-alpha.1.20612.4</SystemDirectoryServicesProtocolsVersion>
+    <SystemDrawingCommonVersion>6.0.0-alpha.1.20612.4</SystemDrawingCommonVersion>
+    <SystemIOPipelinesVersion>6.0.0-alpha.1.20612.4</SystemIOPipelinesVersion>
+    <SystemNetHttpJsonVersion>6.0.0-alpha.1.20612.4</SystemNetHttpJsonVersion>
+    <SystemNetHttpWinHttpHandlerVersion>6.0.0-alpha.1.20612.4</SystemNetHttpWinHttpHandlerVersion>
+    <SystemNetWebSocketsWebSocketProtocolVersion>6.0.0-alpha.1.20612.4</SystemNetWebSocketsWebSocketProtocolVersion>
+    <SystemReflectionMetadataVersion>6.0.0-alpha.1.20612.4</SystemReflectionMetadataVersion>
+    <SystemResourcesExtensionsVersion>6.0.0-alpha.1.20612.4</SystemResourcesExtensionsVersion>
+    <SystemRuntimeCompilerServicesUnsafeVersion>6.0.0-alpha.1.20612.4</SystemRuntimeCompilerServicesUnsafeVersion>
+    <!-- System.Security.AccessControl should only be referenced in Dependencies.props and RTMVersions.csproj. -->
+    <SystemSecurityAccessControlVersion>6.0.0-alpha.1.20612.4</SystemSecurityAccessControlVersion>
+    <SystemSecurityCryptographyCngVersion>6.0.0-alpha.1.20612.4</SystemSecurityCryptographyCngVersion>
+    <SystemSecurityCryptographyPkcsVersion>6.0.0-alpha.1.20612.4</SystemSecurityCryptographyPkcsVersion>
+    <SystemSecurityCryptographyXmlVersion>6.0.0-alpha.1.20612.4</SystemSecurityCryptographyXmlVersion>
+    <SystemSecurityPermissionsVersion>6.0.0-alpha.1.20612.4</SystemSecurityPermissionsVersion>
+    <SystemSecurityPrincipalWindowsVersion>6.0.0-alpha.1.20612.4</SystemSecurityPrincipalWindowsVersion>
+    <SystemServiceProcessServiceControllerVersion>6.0.0-alpha.1.20612.4</SystemServiceProcessServiceControllerVersion>
+    <SystemTextEncodingsWebVersion>6.0.0-alpha.1.20612.4</SystemTextEncodingsWebVersion>
+    <SystemTextJsonVersion>6.0.0-alpha.1.20612.4</SystemTextJsonVersion>
+    <SystemThreadingChannelsVersion>6.0.0-alpha.1.20612.4</SystemThreadingChannelsVersion>
+    <SystemWindowsExtensionsVersion>6.0.0-alpha.1.20612.4</SystemWindowsExtensionsVersion>
     <!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
-    <MicrosoftNETCorePlatformsPackageVersion>5.0.0</MicrosoftNETCorePlatformsPackageVersion>
+    <MicrosoftNETCorePlatformsVersion>6.0.0-alpha.1.20612.4</MicrosoftNETCorePlatformsVersion>
     <!-- Packages from dotnet/efcore -->
-    <dotnetefPackageVersion>5.0.1</dotnetefPackageVersion>
-    <MicrosoftEntityFrameworkCoreInMemoryPackageVersion>5.0.1</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
-    <MicrosoftEntityFrameworkCoreRelationalPackageVersion>5.0.1</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
-    <MicrosoftEntityFrameworkCoreSqlitePackageVersion>5.0.1</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
-    <MicrosoftEntityFrameworkCoreSqlServerPackageVersion>5.0.1</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
-    <MicrosoftEntityFrameworkCoreToolsPackageVersion>5.0.1</MicrosoftEntityFrameworkCoreToolsPackageVersion>
-    <MicrosoftEntityFrameworkCorePackageVersion>5.0.1</MicrosoftEntityFrameworkCorePackageVersion>
-    <MicrosoftEntityFrameworkCoreDesignPackageVersion>5.0.1</MicrosoftEntityFrameworkCoreDesignPackageVersion>
+    <dotnetefVersion>6.0.0-alpha.1.20614.1</dotnetefVersion>
+    <MicrosoftEntityFrameworkCoreInMemoryVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreInMemoryVersion>
+    <MicrosoftEntityFrameworkCoreRelationalVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreRelationalVersion>
+    <MicrosoftEntityFrameworkCoreSqliteVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreSqliteVersion>
+    <MicrosoftEntityFrameworkCoreSqlServerVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreSqlServerVersion>
+    <MicrosoftEntityFrameworkCoreToolsVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreToolsVersion>
+    <MicrosoftEntityFrameworkCoreVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreVersion>
+    <MicrosoftEntityFrameworkCoreDesignVersion>6.0.0-alpha.1.20614.1</MicrosoftEntityFrameworkCoreDesignVersion>
     <!-- Packages from dotnet/arcade -->
-    <MicrosoftDotNetBuildTasksInstallersPackageVersion>5.0.0-beta.20580.4</MicrosoftDotNetBuildTasksInstallersPackageVersion>
+    <MicrosoftDotNetBuildTasksInstallersVersion>6.0.0-beta.20610.4</MicrosoftDotNetBuildTasksInstallersVersion>
   </PropertyGroup>
   <!--
 
@@ -151,7 +157,7 @@
       Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
       All Runtime.$rid packages should have the same version.
     -->
-    <MicrosoftNETCoreAppRuntimeVersion>$(MicrosoftNETCoreAppRuntimewinx64PackageVersion)</MicrosoftNETCoreAppRuntimeVersion>
+    <MicrosoftNETCoreAppRuntimeVersion>$(MicrosoftNETCoreAppRuntimewinx64Version)</MicrosoftNETCoreAppRuntimeVersion>
   </PropertyGroup>
   <!--
     We ship ref/ assemblies for runtime packages in our targeting targeting pack. When servicing that targeting pack,
@@ -184,103 +190,109 @@
     <SystemWindowsExtensionsV0PackageVersion>$(SystemWindowsExtensionsPackageVersion.Split('.')[0]).$(SystemWindowsExtensionsPackageVersion.Split('.')[1]).0</SystemWindowsExtensionsV0PackageVersion>
   </PropertyGroup>
   <PropertyGroup Label="Manual">
-    <MicrosoftNetCompilersToolsetPackageVersion>3.8.0-3.20458.6</MicrosoftNetCompilersToolsetPackageVersion>
+    <!-- Packages from dotnet/roslyn -->
+    <MicrosoftNetCompilersToolsetVersion>3.8.0-5.20519.18</MicrosoftNetCompilersToolsetVersion>
     <!-- DiagnosticAdapter package pinned temporarily until migrated/deprecated -->
-    <MicrosoftExtensionsDiagnosticAdapterPackageVersion>5.0.0-preview.4.20180.4</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
+    <MicrosoftExtensionsDiagnosticAdapterVersion>5.0.0-preview.4.20180.4</MicrosoftExtensionsDiagnosticAdapterVersion>
     <!-- Build tool dependencies -->
-    <InternalAspNetCoreBuildTasksPackageVersion>3.0.0-build-20190530.3</InternalAspNetCoreBuildTasksPackageVersion>
-    <MicrosoftSymbolUploaderBuildTaskPackageVersion>1.0.0-beta-64023-03</MicrosoftSymbolUploaderBuildTaskPackageVersion>
+    <InternalAspNetCoreBuildTasksVersion>3.0.0-build-20190530.3</InternalAspNetCoreBuildTasksVersion>
     <MicrosoftVSSDKBuildToolsVersion>15.9.3032</MicrosoftVSSDKBuildToolsVersion>
     <!-- Stable dotnet/corefx packages no longer updated for .NET Core 3 -->
-    <MicrosoftCSharpPackageVersion>4.7.0</MicrosoftCSharpPackageVersion>
-    <NETStandardLibraryPackageVersion>2.0.3</NETStandardLibraryPackageVersion>
-    <SystemBuffersPackageVersion>4.5.0</SystemBuffersPackageVersion>
-    <SystemCodeDomPackageVersion>4.4.0</SystemCodeDomPackageVersion>
-    <SystemCommandlineExperimentalPackageVersion>0.3.0-alpha.19317.1</SystemCommandlineExperimentalPackageVersion>
-    <SystemComponentModelPackageVersion>4.3.0</SystemComponentModelPackageVersion>
-    <SystemNetHttpPackageVersion>4.3.4</SystemNetHttpPackageVersion>
-    <SystemNetSocketsPackageVersion>4.3.0</SystemNetSocketsPackageVersion>
-    <SystemRuntimeInteropServicesRuntimeInformationPackageVersion>4.3.0</SystemRuntimeInteropServicesRuntimeInformationPackageVersion>
-    <SystemThreadingTasksExtensionsPackageVersion>4.5.3</SystemThreadingTasksExtensionsPackageVersion>
-    <SystemValueTuplePackageVersion>4.5.0</SystemValueTuplePackageVersion>
+    <MicrosoftCSharpVersion>4.7.0</MicrosoftCSharpVersion>
+    <NETStandardLibraryVersion>2.0.3</NETStandardLibraryVersion>
+    <SystemBuffersVersion>4.5.0</SystemBuffersVersion>
+    <SystemCodeDomVersion>4.4.0</SystemCodeDomVersion>
+    <SystemCommandlineExperimentalVersion>0.3.0-alpha.19317.1</SystemCommandlineExperimentalVersion>
+    <SystemComponentModelVersion>4.3.0</SystemComponentModelVersion>
+    <SystemNetHttpVersion>4.3.4</SystemNetHttpVersion>
+    <SystemNetSocketsVersion>4.3.0</SystemNetSocketsVersion>
+    <SystemRuntimeInteropServicesRuntimeInformationVersion>4.3.0</SystemRuntimeInteropServicesRuntimeInformationVersion>
+    <SystemThreadingTasksExtensionsVersion>4.5.3</SystemThreadingTasksExtensionsVersion>
+    <SystemValueTupleVersion>4.5.0</SystemValueTupleVersion>
     <!-- Packages developed by @aspnet, but manually updated as necessary. -->
-    <LibuvPackageVersion>1.10.0</LibuvPackageVersion>
-    <MicrosoftAspNetWebApiClientPackageVersion>5.2.6</MicrosoftAspNetWebApiClientPackageVersion>
-    <MonoWebAssemblyInteropPackageVersion>3.1.1-preview4.19614.4</MonoWebAssemblyInteropPackageVersion>
+    <LibuvVersion>1.10.0</LibuvVersion>
+    <MicrosoftAspNetWebApiClientVersion>5.2.6</MicrosoftAspNetWebApiClientVersion>
+    <MonoWebAssemblyInteropVersion>3.1.1-preview4.19614.4</MonoWebAssemblyInteropVersion>
     <!-- Partner teams -->
-    <MicrosoftBclAsyncInterfacesPackageVersion>1.0.0</MicrosoftBclAsyncInterfacesPackageVersion>
-    <MicrosoftBuildPackageVersion>15.8.166</MicrosoftBuildPackageVersion>
-    <MicrosoftAzureSignalRPackageVersion>1.2.0</MicrosoftAzureSignalRPackageVersion>
-    <MicrosoftBuildFrameworkPackageVersion>15.8.166</MicrosoftBuildFrameworkPackageVersion>
-    <MicrosoftBuildLocatorPackageVersion>1.2.6</MicrosoftBuildLocatorPackageVersion>
-    <MicrosoftBuildUtilitiesCorePackageVersion>15.8.166</MicrosoftBuildUtilitiesCorePackageVersion>
-    <MicrosoftCodeAnalysisCommonPackageVersion>3.8.0</MicrosoftCodeAnalysisCommonPackageVersion>
-    <MicrosoftCodeAnalysisCSharpPackageVersion>3.8.0</MicrosoftCodeAnalysisCSharpPackageVersion>
-    <MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>3.8.0</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>
-    <MicrosoftCodeAnalysisPublicApiAnalyzersPackageVersion>3.3.0</MicrosoftCodeAnalysisPublicApiAnalyzersPackageVersion>
-    <MicrosoftCodeAnalysisFxCopAnalyzersPackageVersion>3.0.0</MicrosoftCodeAnalysisFxCopAnalyzersPackageVersion>
-    <MicrosoftCssParserPackageVersion>1.0.0-20200708.1</MicrosoftCssParserPackageVersion>
-    <MicrosoftIdentityModelClientsActiveDirectoryPackageVersion>3.19.8</MicrosoftIdentityModelClientsActiveDirectoryPackageVersion>
-    <MicrosoftIdentityModelLoggingPackageVersion>6.7.1</MicrosoftIdentityModelLoggingPackageVersion>
-    <MicrosoftIdentityModelProtocolsOpenIdConnectPackageVersion>6.7.1</MicrosoftIdentityModelProtocolsOpenIdConnectPackageVersion>
-    <MicrosoftIdentityModelProtocolsWsFederationPackageVersion>6.7.1</MicrosoftIdentityModelProtocolsWsFederationPackageVersion>
-    <MicrosoftInternalAspNetCoreH2SpecAllPackageVersion>2.2.1</MicrosoftInternalAspNetCoreH2SpecAllPackageVersion>
-    <MicrosoftNETCoreWindowsApiSetsPackageVersion>1.0.1</MicrosoftNETCoreWindowsApiSetsPackageVersion>
-    <MicrosoftOwinSecurityCookiesPackageVersion>3.0.1</MicrosoftOwinSecurityCookiesPackageVersion>
-    <MicrosoftOwinTestingPackageVersion>3.0.1</MicrosoftOwinTestingPackageVersion>
-    <MicrosoftWebAdministrationPackageVersion>11.1.0</MicrosoftWebAdministrationPackageVersion>
-    <MicrosoftWebXdtPackageVersion>1.4.0</MicrosoftWebXdtPackageVersion>
-    <SystemIdentityModelTokensJwtPackageVersion>6.7.1</SystemIdentityModelTokensJwtPackageVersion>
-    <NuGetVersioningPackageVersion>5.7.0</NuGetVersioningPackageVersion>
-    <!-- Packages from 2.1, 2.2, and 3.1 branches used for site extension build. -->
-    <MicrosoftAspNetCoreAzureAppServicesSiteExtension21PackageVersion>2.1.1</MicrosoftAspNetCoreAzureAppServicesSiteExtension21PackageVersion>
-    <MicrosoftAspNetCoreAzureAppServicesSiteExtension22PackageVersion>2.2.0</MicrosoftAspNetCoreAzureAppServicesSiteExtension22PackageVersion>
-    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion>3.1.10-servicing-20520-4</MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion>
-    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64PackageVersion>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64PackageVersion>
-    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86PackageVersion>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31PackageVersion)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86PackageVersion>
+    <MicrosoftBclAsyncInterfacesVersion>1.0.0</MicrosoftBclAsyncInterfacesVersion>
+    <MicrosoftBuildVersion>15.8.166</MicrosoftBuildVersion>
+    <MicrosoftAzureSignalRVersion>1.2.0</MicrosoftAzureSignalRVersion>
+    <MicrosoftBuildFrameworkVersion>15.8.166</MicrosoftBuildFrameworkVersion>
+    <MicrosoftBuildLocatorVersion>1.2.6</MicrosoftBuildLocatorVersion>
+    <MicrosoftBuildUtilitiesCoreVersion>15.8.166</MicrosoftBuildUtilitiesCoreVersion>
+    <MicrosoftCodeAnalysisCommonVersion>3.7.0</MicrosoftCodeAnalysisCommonVersion>
+    <MicrosoftCodeAnalysisCSharpVersion>3.7.0</MicrosoftCodeAnalysisCSharpVersion>
+    <MicrosoftCodeAnalysisCSharpWorkspacesVersion>3.7.0</MicrosoftCodeAnalysisCSharpWorkspacesVersion>
+    <MicrosoftCodeAnalysisPublicApiAnalyzersVersion>3.3.0</MicrosoftCodeAnalysisPublicApiAnalyzersVersion>
+    <MicrosoftCodeAnalysisFxCopAnalyzersVersion>3.0.0</MicrosoftCodeAnalysisFxCopAnalyzersVersion>
+    <MicrosoftCssParserVersion>1.0.0-20200708.1</MicrosoftCssParserVersion>
+    <MicrosoftIdentityModelClientsActiveDirectoryVersion>3.19.8</MicrosoftIdentityModelClientsActiveDirectoryVersion>
+    <MicrosoftIdentityModelLoggingVersion>6.7.1</MicrosoftIdentityModelLoggingVersion>
+    <MicrosoftIdentityModelProtocolsOpenIdConnectVersion>6.7.1</MicrosoftIdentityModelProtocolsOpenIdConnectVersion>
+    <MicrosoftIdentityModelProtocolsWsFederationVersion>6.7.1</MicrosoftIdentityModelProtocolsWsFederationVersion>
+    <MicrosoftInternalAspNetCoreH2SpecAllVersion>2.2.1</MicrosoftInternalAspNetCoreH2SpecAllVersion>
+    <MicrosoftNETCoreWindowsApiSetsVersion>1.0.1</MicrosoftNETCoreWindowsApiSetsVersion>
+    <MicrosoftOwinSecurityCookiesVersion>3.0.1</MicrosoftOwinSecurityCookiesVersion>
+    <MicrosoftOwinTestingVersion>3.0.1</MicrosoftOwinTestingVersion>
+    <MicrosoftWebAdministrationVersion>11.1.0</MicrosoftWebAdministrationVersion>
+    <MicrosoftWebXdtVersion>1.4.0</MicrosoftWebXdtVersion>
+    <SystemIdentityModelTokensJwtVersion>6.7.1</SystemIdentityModelTokensJwtVersion>
+    <NuGetVersioningVersion>5.7.0</NuGetVersioningVersion>
+    <SystemNetExperimentalMsQuicVersion>5.0.0-alpha.20560.6</SystemNetExperimentalMsQuicVersion>
+    <!-- Packages from 2.1, 3.1, and 5.0 branches used for site extension build. -->
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension21Version>2.1.1</MicrosoftAspNetCoreAzureAppServicesSiteExtension21Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension22Version>2.2.0</MicrosoftAspNetCoreAzureAppServicesSiteExtension22Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>3.1.10-servicing-20520-4</MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>5.0.0-rtm-20529-7</MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension50x64Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension50x64Version>
+    <MicrosoftAspNetCoreAzureAppServicesSiteExtension50x86Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension50x86Version>
     <!-- 3rd party dependencies -->
-    <AngleSharpPackageVersion>0.9.9</AngleSharpPackageVersion>
-    <BenchmarkDotNetPackageVersion>0.12.1</BenchmarkDotNetPackageVersion>
-    <CastleCorePackageVersion>4.2.1</CastleCorePackageVersion>
-    <CommandLineParserPackageVersion>2.3.0</CommandLineParserPackageVersion>
-    <FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
-    <GoogleProtobufPackageVersion>3.14.0</GoogleProtobufPackageVersion>
-    <GrpcAspNetCorePackageVersion>2.34.0</GrpcAspNetCorePackageVersion>
-    <GrpcAuthPackageVersion>2.34.0</GrpcAuthPackageVersion>
-    <GrpcNetClientPackageVersion>2.34.0</GrpcNetClientPackageVersion>
-    <GrpcToolsPackageVersion>2.34.0</GrpcToolsPackageVersion>
-    <IdentityServer4AspNetIdentityPackageVersion>4.1.0</IdentityServer4AspNetIdentityPackageVersion>
-    <IdentityServer4EntityFrameworkPackageVersion>4.1.0</IdentityServer4EntityFrameworkPackageVersion>
-    <IdentityServer4PackageVersion>4.1.0</IdentityServer4PackageVersion>
-    <IdentityServer4StoragePackageVersion>4.1.0</IdentityServer4StoragePackageVersion>
-    <IdentityServer4EntityFrameworkStoragePackageVersion>4.1.0</IdentityServer4EntityFrameworkStoragePackageVersion>
-    <MessagePackPackageVersion>2.1.90</MessagePackPackageVersion>
-    <MicrosoftIdentityWebPackageVersion>1.1.0</MicrosoftIdentityWebPackageVersion>
-    <MicrosoftIdentityWebMicrosoftGraphPackageVersion>1.1.0</MicrosoftIdentityWebMicrosoftGraphPackageVersion>
-    <MicrosoftIdentityWebUIPackageVersion>1.1.0</MicrosoftIdentityWebUIPackageVersion>
-    <MessagePackAnalyzerPackageVersion>$(MessagePackPackageVersion)</MessagePackAnalyzerPackageVersion>
-    <MoqPackageVersion>4.10.0</MoqPackageVersion>
-    <MonoCecilPackageVersion>0.11.2</MonoCecilPackageVersion>
-    <NewtonsoftJsonBsonPackageVersion>1.0.2</NewtonsoftJsonBsonPackageVersion>
-    <NewtonsoftJsonPackageVersion>12.0.2</NewtonsoftJsonPackageVersion>
-    <NSwagApiDescriptionClientPackageVersion>13.0.4</NSwagApiDescriptionClientPackageVersion>
-    <SeleniumSupportPackageVersion>4.0.0-alpha07</SeleniumSupportPackageVersion>
-    <SeleniumWebDriverMicrosoftDriverPackageVersion>17.17134.0</SeleniumWebDriverMicrosoftDriverPackageVersion>
-    <SeleniumWebDriverChromeDriverPackageVersion>87.0.4280.2000-beta</SeleniumWebDriverChromeDriverPackageVersion>
-    <SeleniumWebDriverPackageVersion>4.0.0-alpha07</SeleniumWebDriverPackageVersion>
-    <SerilogExtensionsLoggingPackageVersion>1.4.0</SerilogExtensionsLoggingPackageVersion>
-    <SerilogSinksFilePackageVersion>4.0.0</SerilogSinksFilePackageVersion>
-    <StackExchangeRedisPackageVersion>2.0.593</StackExchangeRedisPackageVersion>
-    <SystemReactiveLinqPackageVersion>3.1.1</SystemReactiveLinqPackageVersion>
-    <SwashbuckleAspNetCorePackageVersion>5.6.3</SwashbuckleAspNetCorePackageVersion>
-    <XunitAbstractionsPackageVersion>2.0.3</XunitAbstractionsPackageVersion>
-    <XunitAnalyzersPackageVersion>0.10.0</XunitAnalyzersPackageVersion>
+    <AngleSharpVersion>0.9.9</AngleSharpVersion>
+    <BenchmarkDotNetVersion>0.12.1</BenchmarkDotNetVersion>
+    <CastleCoreVersion>4.2.1</CastleCoreVersion>
+    <CommandLineParserVersion>2.3.0</CommandLineParserVersion>
+    <FSharpCoreVersion>4.2.1</FSharpCoreVersion>
+    <GoogleProtobufVersion>3.13.0</GoogleProtobufVersion>
+    <GrpcAspNetCoreVersion>2.32.0</GrpcAspNetCoreVersion>
+    <GrpcAuthVersion>2.32.0</GrpcAuthVersion>
+    <GrpcNetClientVersion>2.32.0</GrpcNetClientVersion>
+    <GrpcToolsVersion>2.32.0</GrpcToolsVersion>
+    <IdentityServer4AspNetIdentityVersion>4.1.0</IdentityServer4AspNetIdentityVersion>
+    <IdentityServer4EntityFrameworkVersion>4.1.0</IdentityServer4EntityFrameworkVersion>
+    <IdentityServer4Version>4.1.0</IdentityServer4Version>
+    <IdentityServer4StorageVersion>4.1.0</IdentityServer4StorageVersion>
+    <IdentityServer4EntityFrameworkStorageVersion>4.1.0</IdentityServer4EntityFrameworkStorageVersion>
+    <MessagePackVersion>2.1.90</MessagePackVersion>
+    <MicrosoftIdentityWebVersion>1.1.0</MicrosoftIdentityWebVersion>
+    <MicrosoftIdentityWebMicrosoftGraphVersion>1.1.0</MicrosoftIdentityWebMicrosoftGraphVersion>
+    <MicrosoftIdentityWebUIVersion>1.1.0</MicrosoftIdentityWebUIVersion>
+    <MessagePackAnalyzerVersion>$(MessagePackVersion)</MessagePackAnalyzerVersion>
+    <MoqVersion>4.10.0</MoqVersion>
+    <MonoCecilVersion>0.11.2</MonoCecilVersion>
+    <NewtonsoftJsonBsonVersion>1.0.2</NewtonsoftJsonBsonVersion>
+    <NewtonsoftJsonVersion>12.0.2</NewtonsoftJsonVersion>
+    <NSwagApiDescriptionClientVersion>13.0.4</NSwagApiDescriptionClientVersion>
+    <PollyExtensionsHttpVersion>3.0.0</PollyExtensionsHttpVersion>
+    <PollyVersion>7.1.0</PollyVersion>
+    <SeleniumSupportVersion>4.0.0-alpha07</SeleniumSupportVersion>
+    <SeleniumWebDriverMicrosoftDriverVersion>17.17134.0</SeleniumWebDriverMicrosoftDriverVersion>
+    <SeleniumWebDriverChromeDriverVersion>87.0.4280.2000-beta</SeleniumWebDriverChromeDriverVersion>
+    <SeleniumWebDriverVersion>4.0.0-alpha07</SeleniumWebDriverVersion>
+    <SerilogExtensionsLoggingVersion>1.4.0</SerilogExtensionsLoggingVersion>
+    <SerilogSinksFileVersion>4.0.0</SerilogSinksFileVersion>
+    <StackExchangeRedisVersion>2.0.593</StackExchangeRedisVersion>
+    <SystemReactiveLinqVersion>3.1.1</SystemReactiveLinqVersion>
+    <SwashbuckleAspNetCoreVersion>5.6.3</SwashbuckleAspNetCoreVersion>
+    <XunitAbstractionsVersion>2.0.3</XunitAbstractionsVersion>
+    <XunitAnalyzersVersion>0.10.0</XunitAnalyzersVersion>
     <XunitVersion>2.4.1</XunitVersion>
-    <XunitAssertPackageVersion>$(XunitVersion)</XunitAssertPackageVersion>
-    <XunitExtensibilityCorePackageVersion>$(XunitVersion)</XunitExtensibilityCorePackageVersion>
-    <XunitExtensibilityExecutionPackageVersion>$(XunitVersion)</XunitExtensibilityExecutionPackageVersion>
+    <XunitAssertVersion>$(XunitVersion)</XunitAssertVersion>
+    <XunitExtensibilityCoreVersion>$(XunitVersion)</XunitExtensibilityCoreVersion>
+    <XunitExtensibilityExecutionVersion>$(XunitVersion)</XunitExtensibilityExecutionVersion>
     <XUnitRunnerVisualStudioVersion>2.4.3</XUnitRunnerVisualStudioVersion>
-    <MicrosoftDataSqlClientPackageVersion>1.0.19249.1</MicrosoftDataSqlClientPackageVersion>
+    <MicrosoftDataSqlClientVersion>1.0.19249.1</MicrosoftDataSqlClientVersion>
   </PropertyGroup>
   <!-- Restore feeds -->
   <PropertyGroup Label="Restore feeds">

+ 1 - 1
eng/Workarounds.props

@@ -13,7 +13,7 @@
     <PublishWindowsPdb>false</PublishWindowsPdb>
   </PropertyGroup>
 
-  <PropertyGroup>
+  <PropertyGroup Condition="'$(UseVSTestRunner)' != 'true'">
     <!-- Xunit output is piped into a file anyways, so color codes aren't useful. -->
     <TestRunnerAdditionalArguments>$(TestRunnerAdditionalArguments) -nocolor</TestRunnerAdditionalArguments>
   </PropertyGroup>

+ 2 - 21
eng/Workarounds.targets

@@ -1,17 +1,12 @@
 <!-- Use this file to workaround issues. List the issue tracking the item to fix so we can remove the workaround when the issue is resolved. -->
 <Project>
-  <!-- Workaround while there is no 5.0 SDK available, suppress unsupported version error -->
-  <PropertyGroup>
-    <NETCoreAppMaximumVersion>5.0</NETCoreAppMaximumVersion>
-  </PropertyGroup>
-
   <ItemGroup>
     <!-- Reference base shared framework at incoming dependency flow version, not bundled sdk version. -->
     <FrameworkReference
       Update="Microsoft.NETCore.App"
       Condition=" '$(TargetFramework)' == '$(DefaultNetCoreTargetFramework)' AND '$(TargetLatestDotNetRuntime)' != 'false' "
       RuntimeFrameworkVersion="$(MicrosoftNETCoreAppRuntimeVersion)"
-      TargetingPackVersion="$(MicrosoftNETCoreAppRefPackageVersion)" />
+      TargetingPackVersion="$(MicrosoftNETCoreAppRefVersion)" />
   </ItemGroup>
 
   <!--
@@ -38,21 +33,7 @@
 
   <!-- Workaround for https://github.com/dotnet/arcade/issues/204, not needed in source build -->
   <ItemGroup Condition="'$(DotNetBuildFromSource)' != 'true'">
-    <PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksPackageVersion)" IsImplicitlyDefined="true" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <!-- Workaround when there is no vNext SDK available, copy known apphost/framework reference info from 3.1 -->
-    <KnownAppHostPack
-      Include="@(KnownAppHostPack->WithMetadataValue('TargetFramework', 'netcoreapp3.1'))"
-      TargetFramework="$(KnownAppHostPackOrFrameworkReferenceTfm)"
-      Condition="@(KnownAppHostPack->Count()) != '0' AND !(@(KnownAppHostPack->AnyHaveMetadataValue('TargetFramework', '$(KnownAppHostPackOrFrameworkReferenceTfm)')))"
-      />
-    <KnownFrameworkReference
-      Include="@(KnownFrameworkReference->WithMetadataValue('TargetFramework', 'netcoreapp3.1'))"
-      TargetFramework="$(KnownAppHostPackOrFrameworkReferenceTfm)"
-      Condition="@(KnownFrameworkReference->Count()) != '0' AND !(@(KnownFrameworkReference->AnyHaveMetadataValue('TargetFramework', '$(KnownAppHostPackOrFrameworkReferenceTfm)')))"
-      />
+    <PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksVersion)" IsImplicitlyDefined="true" />
   </ItemGroup>
 
   <!-- Workaround for netstandard2.1 projects until we can get a preview 8 SDK containing https://github.com/dotnet/sdk/pull/3463 fix. -->

+ 43 - 0
eng/common/cross/armel/armel.jessie.patch

@@ -0,0 +1,43 @@
+diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h
+--- a/usr/include/urcu/uatomic/generic.h	2014-10-22 15:00:58.000000000 -0700
++++ b/usr/include/urcu/uatomic/generic.h	2020-10-30 21:38:28.550000000 -0700
+@@ -69,10 +69,10 @@
+ #endif
+ #ifdef UATOMIC_HAS_ATOMIC_SHORT
+ 	case 2:
+-		return __sync_val_compare_and_swap_2(addr, old, _new);
++		return __sync_val_compare_and_swap_2((uint16_t*) addr, old, _new);
+ #endif
+ 	case 4:
+-		return __sync_val_compare_and_swap_4(addr, old, _new);
++		return __sync_val_compare_and_swap_4((uint32_t*) addr, old, _new);
+ #if (CAA_BITS_PER_LONG == 64)
+ 	case 8:
+ 		return __sync_val_compare_and_swap_8(addr, old, _new);
+@@ -109,7 +109,7 @@
+ 		return;
+ #endif
+ 	case 4:
+-		__sync_and_and_fetch_4(addr, val);
++		__sync_and_and_fetch_4((uint32_t*) addr, val);
+ 		return;
+ #if (CAA_BITS_PER_LONG == 64)
+ 	case 8:
+@@ -148,7 +148,7 @@
+ 		return;
+ #endif
+ 	case 4:
+-		__sync_or_and_fetch_4(addr, val);
++		__sync_or_and_fetch_4((uint32_t*) addr, val);
+ 		return;
+ #if (CAA_BITS_PER_LONG == 64)
+ 	case 8:
+@@ -187,7 +187,7 @@
+ 		return __sync_add_and_fetch_2(addr, val);
+ #endif
+ 	case 4:
+-		return __sync_add_and_fetch_4(addr, val);
++		return __sync_add_and_fetch_4((uint32_t*) addr, val);
+ #if (CAA_BITS_PER_LONG == 64)
+ 	case 8:
+ 		return __sync_add_and_fetch_8(addr, val);

+ 14 - 0
eng/common/cross/build-rootfs.sh

@@ -106,6 +106,13 @@ while :; do
             __UbuntuRepo="http://ftp.debian.org/debian/"
             __CodeName=jessie
             ;;
+        s390x)
+            __BuildArch=s390x
+            __UbuntuArch=s390x
+            __UbuntuRepo="http://ports.ubuntu.com/ubuntu-ports/"
+            __UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libunwind8-dev//')
+            unset __LLDB_Package
+            ;;
         x86)
             __BuildArch=x86
             __UbuntuArch=i386
@@ -329,6 +336,7 @@ elif [[ -n $__CodeName ]]; then
     chroot $__RootfsDir apt-get -f -y install
     chroot $__RootfsDir apt-get -y install $__UbuntuPackages
     chroot $__RootfsDir symlinks -cr /usr
+    chroot $__RootfsDir apt-get clean
 
     if [ $__SkipUnmount == 0 ]; then
         umount $__RootfsDir/* || true
@@ -340,6 +348,12 @@ elif [[ -n $__CodeName ]]; then
         patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch
         popd
     fi
+
+    if [[ "$__BuildArch" == "armel" && "$__CodeName" == "jessie" ]]; then
+        pushd $__RootfsDir
+        patch -p1 < $__CrossDir/$__BuildArch/armel.jessie.patch
+        popd
+    fi
 elif [[ "$__Tizen" == "tizen" ]]; then
     ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh
 else

+ 11 - 0
eng/common/cross/s390x/sources.list.bionic

@@ -0,0 +1,11 @@
+deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
+deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe
+
+deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
+deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted
+
+deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse
+deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse

+ 9 - 2
eng/common/cross/toolchain.cmake

@@ -36,6 +36,9 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm64")
   if("$ENV{__DistroRid}" MATCHES "tizen.*")
     set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
   endif()
+elseif(TARGET_ARCH_NAME STREQUAL "s390x")
+  set(CMAKE_SYSTEM_PROCESSOR s390x)
+  set(TOOLCHAIN "s390x-linux-gnu")
 elseif(TARGET_ARCH_NAME STREQUAL "x86")
   set(CMAKE_SYSTEM_PROCESSOR i686)
   set(TOOLCHAIN "i686-linux-gnu")
@@ -46,7 +49,7 @@ elseif (ILLUMOS)
   set(CMAKE_SYSTEM_PROCESSOR "x86_64")
   set(TOOLCHAIN "x86_64-illumos")
 else()
-  message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64 and x86 are supported!")
+  message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64, s390x and x86 are supported!")
 endif()
 
 if(DEFINED ENV{TOOLCHAIN})
@@ -139,6 +142,10 @@ function(add_toolchain_linker_flag Flag)
   set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}} ${Flag}" PARENT_SCOPE)
 endfunction()
 
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+  add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/lib/${TOOLCHAIN}")
+  add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}")
+endif()
 
 if(TARGET_ARCH_NAME STREQUAL "armel")
   if(DEFINED TIZEN_TOOLCHAIN) # For Tizen only
@@ -167,7 +174,7 @@ endif()
 
 # Specify compile options
 
-if((TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$" AND NOT "$ENV{__DistroRid}" MATCHES "android.*") OR ILLUMOS)
+if((TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64|s390x)$" AND NOT "$ENV{__DistroRid}" MATCHES "android.*") OR ILLUMOS)
   set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
   set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
   set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})

+ 47 - 6
eng/common/performance/crossgen_perf.proj

@@ -19,7 +19,7 @@
   </PropertyGroup>
   <PropertyGroup Condition="'$(AGENT_OS)' != 'Windows_NT'">
     <Python>python3</Python>
-    <HelixPreCommands>$(HelixPreCommands);chmod +x $HELIX_WORKITEM_PAYLOAD/startup/Startup;chmod +x $HELIX_WORKITEM_PAYLOAD/startup/perfcollect;sudo apt update</HelixPreCommands>
+    <HelixPreCommands>$(HelixPreCommands);chmod +x $HELIX_WORKITEM_PAYLOAD/startup/Startup;chmod +x $HELIX_WORKITEM_PAYLOAD/startup/perfcollect;sudo apt update;chmod +x $HELIX_WORKITEM_PAYLOAD/SOD/SizeOnDisk</HelixPreCommands>
     <CoreRoot>$HELIX_CORRELATION_PAYLOAD/Core_Root</CoreRoot>
     <ScenarioDirectory>$HELIX_CORRELATION_PAYLOAD/performance/src/scenarios/</ScenarioDirectory>
     <CrossgenDirectory>$(ScenarioDirectory)crossgen/</CrossgenDirectory>
@@ -27,11 +27,18 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <SingleAssembly Include="System.Private.Xml.dll"/>
-    <SingleAssembly Include="System.Linq.Expressions.dll"/>
-    <SingleAssembly Include="Microsoft.CodeAnalysis.VisualBasic.dll"/>
-    <SingleAssembly Include="Microsoft.CodeAnalysis.CSharp.dll"/>
-    <SingleAssembly Include="System.Private.CoreLib.dll"/>
+    <SingleAssembly Include="System.Net.WebProxy.dll"/>                 <!-- Approx. 10 KB as of 2020/10 -->
+    <SingleAssembly Include="System.Net.Http.Json.dll"/>                <!-- Approx. 20 KB as of 2020/10 -->
+    <SingleAssembly Include="System.Drawing.Primitives.dll"/>           <!-- Approx. 50 KB as of 2020/10 -->
+    <SingleAssembly Include="System.ServiceModel.Syndication.dll"/>     <!-- Approx. 100 KB as of 2020/10 -->
+    <SingleAssembly Include="System.Net.Sockets.dll"/>                  <!-- Approx. 200 KB as of 2020/10 -->
+    <SingleAssembly Include="System.Linq.Expressions.dll"/>             <!-- Approx. 500 KB as of 2020/10 -->
+    <SingleAssembly Include="System.Data.Common.dll"/>                  <!-- Approx. 1 MB as of 2020/10 -->
+    <SingleAssembly Include="Microsoft.CodeAnalysis.dll"/>              <!-- Approx. 2 MB as of 2020/10 -->
+    <SingleAssembly Include="System.Private.Xml.dll"/>                  <!-- Approx. 3 MB as of 2020/10 -->
+    <SingleAssembly Include="Microsoft.CodeAnalysis.VisualBasic.dll"/>  <!-- Approx. 4 MB as of 2020/10 -->
+    <SingleAssembly Include="Microsoft.CodeAnalysis.CSharp.dll"/>       <!-- Approx. 4 MB as of 2020/10 -->
+    <SingleAssembly Include="System.Private.CoreLib.dll"/>              <!-- Approx. 10 MB as of 2020/10 -->
   </ItemGroup>
   <ItemGroup>
     <Composite Include="framework-r2r.dll.rsp"/>
@@ -51,6 +58,31 @@
     </Crossgen2WorkItem>
   </ItemGroup>
 
+  <ItemGroup> 
+    <Crossgen2SingleThreadedWorkItem Include="@(SingleAssembly)">
+      <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+      <Command>$(Python) $(Crossgen2Directory)test.py crossgen2 --core-root $(CoreRoot) --single %(Identity) --singlethreaded True</Command>
+    </Crossgen2SingleThreadedWorkItem>
+  </ItemGroup>
+
+  <ItemGroup>
+    <CrossgenSizeOnDiskWorkItem Include="@(SingleAssembly)" Condition="'$(Architecture)' == 'x64'">
+      <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+      <PreCommands>$(Python) $(CrossgenDirectory)pre.py crossgen --core-root $(CoreRoot) --single %(Identity) </PreCommands>
+      <Command>$(Python) $(CrossgenDirectory)test.py sod --scenario-name &quot;Crossgen %(Identity) Size&quot; --dirs ./crossgen.out/</Command>
+      <PostCommands>$(Python) $(CrossgenDirectory)post.py</PostCommands>
+    </CrossgenSizeOnDiskWorkItem>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Crossgen2SizeOnDiskWorkItem Include="@(SingleAssembly)" Condition="'$(Architecture)' == 'x64'">
+      <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>
+      <PreCommands>$(Python) $(Crossgen2Directory)pre.py crossgen2 --core-root $(CoreRoot) --single %(Identity) </PreCommands>
+      <Command>$(Python) $(Crossgen2Directory)test.py sod --scenario-name &quot;Crossgen2 %(Identity) Size&quot; --dirs ./crossgen.out/</Command>
+      <PostCommands>$(Python) $(Crossgen2Directory)post.py</PostCommands>
+    </Crossgen2SizeOnDiskWorkItem>
+  </ItemGroup>
+
   <ItemGroup>
     <!-- Enable crossgen tests on Windows x64 and Windows x86 -->
     <HelixWorkItem Include="@(CrossgenWorkItem -> 'Crossgen %(Identity)')" Condition="'$(AGENT_OS)' == 'Windows_NT'">
@@ -60,10 +92,19 @@
     <HelixWorkItem Include="@(Crossgen2WorkItem -> 'Crossgen2 %(Identity)')" Condition="'$(Architecture)' == 'x64'">
       <Timeout>4:00</Timeout>
     </HelixWorkItem>
+    <HelixWorkItem Include="@(Crossgen2SingleThreadedWorkItem -> 'Crossgen2 single-threaded %(Identity)')" Condition="'$(Architecture)' == 'x64'">
+      <Timeout>4:00</Timeout>
+    </HelixWorkItem>
     <HelixWorkItem Include="Crossgen2 Composite Framework R2R" Condition="'$(Architecture)' == 'x64'">
       <PayloadDirectory>$(WorkItemDirectory)</PayloadDirectory>	
       <Command>$(Python) $(Crossgen2Directory)test.py crossgen2 --core-root $(CoreRoot) --composite $(Crossgen2Directory)framework-r2r.dll.rsp</Command>
       <Timeout>1:00</Timeout>  
     </HelixWorkItem>
+    <HelixWorkItem Include="@(CrossgenSizeOnDiskWorkItem -> 'Crossgen Size on Disk %(Identity)')" Condition="'$(Architecture)' == 'x64'">
+      <Timeout>4:00</Timeout>  
+    </HelixWorkItem>
+    <HelixWorkItem Include="@(Crossgen2SizeOnDiskWorkItem -> 'Crossgen2 Size on Disk %(Identity)')" Condition="'$(Architecture)' == 'x64'">
+      <Timeout>4:00</Timeout>  
+    </HelixWorkItem>
   </ItemGroup>
 </Project>

+ 3 - 1
eng/common/performance/performance-setup.ps1

@@ -82,7 +82,9 @@ $SetupArguments = "--repository https://github.com/$Repository --branch $Branch
 #This grabs the LKG version number of dotnet and passes it to our scripts
 $VersionJSON = Get-Content global.json | ConvertFrom-Json
 $DotNetVersion = $VersionJSON.tools.dotnet
-$SetupArguments = "--dotnet-versions $DotNetVersion $SetupArguments"
+# TODO: Change this back to parsing when we have a good story for dealing with TFM changes or when the LKG in runtime gets updated to include net6.0
+# $SetupArguments = "--dotnet-versions $DotNetVersion $SetupArguments"
+$SetupArguments = "--dotnet-versions 6.0.100-alpha.1.20553.6 $SetupArguments"
 
 
 if ($RunFromPerformanceRepo) {

+ 10 - 1
eng/common/performance/performance-setup.sh

@@ -198,9 +198,16 @@ if [[ "$internal" == true ]]; then
     else
         queue=Ubuntu.1804.Amd64.Tiger.Perf
     fi
+else
+    if [[ "$architecture" = "arm64" ]]; then
+        queue=ubuntu.1804.armarch.open
+    else
+        queue=Ubuntu.1804.Amd64.Open
+    fi
 fi
 
 if [[ "$mono_dotnet" != "" ]] && [[ "$monointerpreter" == "false" ]]; then
+    configurations="$configurations LLVM=$llvm MonoInterpreter=$monointerpreter MonoAOT=$monoaot"
     extra_benchmark_dotnet_arguments="$extra_benchmark_dotnet_arguments --category-exclusion-filter NoMono"
 fi
 
@@ -222,7 +229,9 @@ if [[ "$use_latest_dotnet" = false ]]; then
     # Get the tools section from the global.json.
     # This grabs the LKG version number of dotnet and passes it to our scripts
     dotnet_version=`cat global.json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["tools"]["dotnet"])'`
-    setup_arguments="--dotnet-versions $dotnet_version $setup_arguments"
+    # TODO: Change this back to parsing when we have a good story for dealing with TFM changes or when the LKG in runtime gets updated to include net6.0
+    # setup_arguments="--dotnet-versions $dotnet_version $setup_arguments"
+    setup_arguments="--dotnet-versions 6.0.100-alpha.1.20553.6 $setup_arguments"
 fi
 
 if [[ "$run_from_perf_repo" = true ]]; then

+ 61 - 43
eng/common/pipeline-logging-functions.ps1

@@ -29,14 +29,14 @@ function Write-PipelineTelemetryError {
         [switch]$AsOutput,
         [switch]$Force)
 
-        $PSBoundParameters.Remove('Category') | Out-Null
+    $PSBoundParameters.Remove('Category') | Out-Null
 
-        if($Force -Or ((Test-Path variable:ci) -And $ci)) {
-            $Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message"
-        }
-        $PSBoundParameters.Remove('Message') | Out-Null
-        $PSBoundParameters.Add('Message', $Message)
-        Write-PipelineTaskError @PSBoundParameters
+    if ($Force -Or ((Test-Path variable:ci) -And $ci)) {
+        $Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message"
+    }
+    $PSBoundParameters.Remove('Message') | Out-Null
+    $PSBoundParameters.Add('Message', $Message)
+    Write-PipelineTaskError @PSBoundParameters
 }
 
 # Specify "-Force" to force pipeline formatted output even if "$ci" is false or not set
@@ -55,8 +55,8 @@ function Write-PipelineTaskError {
         [switch]$Force
     )
 
-    if(!$Force -And (-Not (Test-Path variable:ci) -Or !$ci)) {
-        if($Type -eq 'error') {
+    if (!$Force -And (-Not (Test-Path variable:ci) -Or !$ci)) {
+        if ($Type -eq 'error') {
             Write-Host $Message -ForegroundColor Red
             return
         }
@@ -66,47 +66,61 @@ function Write-PipelineTaskError {
         }
     }
 
-    if(($Type -ne 'error') -and ($Type -ne 'warning')) {
+    if (($Type -ne 'error') -and ($Type -ne 'warning')) {
         Write-Host $Message
         return
     }
     $PSBoundParameters.Remove('Force') | Out-Null      
-    if(-not $PSBoundParameters.ContainsKey('Type')) {
+    if (-not $PSBoundParameters.ContainsKey('Type')) {
         $PSBoundParameters.Add('Type', 'error')
     }
     Write-LogIssue @PSBoundParameters
-  }
+}
   
-  function Write-PipelineSetVariable {
+function Write-PipelineSetVariable {
     [CmdletBinding()]
     param(
-      [Parameter(Mandatory = $true)]
-      [string]$Name,
-      [string]$Value,
-      [switch]$Secret,
-      [switch]$AsOutput,
-      [bool]$IsMultiJobVariable=$true)
-
-      if((Test-Path variable:ci) -And $ci) {
+        [Parameter(Mandatory = $true)]
+        [string]$Name,
+        [string]$Value,
+        [switch]$Secret,
+        [switch]$AsOutput,
+        [bool]$IsMultiJobVariable = $true)
+
+    if ((Test-Path variable:ci) -And $ci) {
         Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{
-          'variable' = $Name
-          'isSecret' = $Secret
-          'isOutput' = $IsMultiJobVariable
+            'variable' = $Name
+            'isSecret' = $Secret
+            'isOutput' = $IsMultiJobVariable
         } -AsOutput:$AsOutput
-      }
-  }
+    }
+}
   
-  function Write-PipelinePrependPath {
+function Write-PipelinePrependPath {
     [CmdletBinding()]
     param(
-      [Parameter(Mandatory=$true)]
-      [string]$Path,
-      [switch]$AsOutput)
+        [Parameter(Mandatory = $true)]
+        [string]$Path,
+        [switch]$AsOutput)
 
-      if((Test-Path variable:ci) -And $ci) {
+    if ((Test-Path variable:ci) -And $ci) {
         Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput
-      }
-  }
+    }
+}
+
+function Write-PipelineSetResult {
+    [CmdletBinding()]
+    param(
+        [ValidateSet("Succeeded", "SucceededWithIssues", "Failed", "Cancelled", "Skipped")]
+        [Parameter(Mandatory = $true)]
+        [string]$Result,
+        [string]$Message)
+    if ((Test-Path variable:ci) -And $ci) {
+        Write-LoggingCommand -Area 'task' -Event 'complete' -Data $Message -Properties @{
+            'result' = $Result
+        }
+    }
+}
 
 <########################################
 # Private functions.
@@ -123,7 +137,8 @@ function Format-LoggingCommandData {
         foreach ($mapping in $script:loggingCommandEscapeMappings) {
             $Value = $Value.Replace($mapping.Token, $mapping.Replacement)
         }
-    } else {
+    }
+    else {
         for ($i = $script:loggingCommandEscapeMappings.Length - 1 ; $i -ge 0 ; $i--) {
             $mapping = $script:loggingCommandEscapeMappings[$i]
             $Value = $Value.Replace($mapping.Replacement, $mapping.Token)
@@ -156,7 +171,8 @@ function Format-LoggingCommand {
                 if ($first) {
                     $null = $sb.Append(' ')
                     $first = $false
-                } else {
+                }
+                else {
                     $null = $sb.Append(';')
                 }
 
@@ -193,7 +209,8 @@ function Write-LoggingCommand {
     $command = Format-LoggingCommand -Area $Area -Event $Event -Data $Data -Properties $Properties
     if ($AsOutput) {
         $command
-    } else {
+    }
+    else {
         Write-Host $command
     }
 }
@@ -212,12 +229,12 @@ function Write-LogIssue {
         [switch]$AsOutput)
 
     $command = Format-LoggingCommand -Area 'task' -Event 'logissue' -Data $Message -Properties @{
-            'type' = $Type
-            'code' = $ErrCode
-            'sourcepath' = $SourcePath
-            'linenumber' = $LineNumber
-            'columnnumber' = $ColumnNumber
-        }
+        'type'         = $Type
+        'code'         = $ErrCode
+        'sourcepath'   = $SourcePath
+        'linenumber'   = $LineNumber
+        'columnnumber' = $ColumnNumber
+    }
     if ($AsOutput) {
         return $command
     }
@@ -229,7 +246,8 @@ function Write-LogIssue {
             $foregroundColor = [System.ConsoleColor]::Red
             $backgroundColor = [System.ConsoleColor]::Black
         }
-    } else {
+    }
+    else {
         $foregroundColor = $host.PrivateData.WarningForegroundColor
         $backgroundColor = $host.PrivateData.WarningBackgroundColor
         if ($foregroundColor -isnot [System.ConsoleColor] -or $backgroundColor -isnot [System.ConsoleColor]) {

+ 25 - 1
eng/common/pipeline-logging-functions.sh

@@ -179,4 +179,28 @@ function Write-PipelinePrependPath {
   if [[ "$ci" == true ]]; then
     echo "##vso[task.prependpath]$prepend_path"
   fi
-}
+}
+
+function Write-PipelineSetResult {
+  local result=''
+  local message=''
+
+  while [[ $# -gt 0 ]]; do
+    opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
+    case "$opt" in
+      -result|-r)
+        result=$2
+        shift
+        ;;
+      -message|-m)
+        message=$2
+        shift
+        ;;
+    esac
+    shift
+  done
+
+  if [[ "$ci" == true ]]; then
+    echo "##vso[task.complete result=$result;]$message"
+  fi
+}

+ 3 - 3
eng/common/post-build/post-build-utils.ps1

@@ -69,9 +69,9 @@ function Trigger-Subscription([string]$SubscriptionId) {
 
 function Validate-MaestroVars {
   try {
-    Get-Variable MaestroApiEndPoint -Scope Global | Out-Null
-    Get-Variable MaestroApiVersion -Scope Global | Out-Null
-    Get-Variable MaestroApiAccessToken -Scope Global | Out-Null
+    Get-Variable MaestroApiEndPoint | Out-Null
+    Get-Variable MaestroApiVersion | Out-Null
+    Get-Variable MaestroApiAccessToken | Out-Null
 
     if (!($MaestroApiEndPoint -Match '^http[s]?://maestro-(int|prod).westus2.cloudapp.azure.com$')) {
       Write-PipelineTelemetryError -Category 'MaestroVars' -Message "MaestroApiEndPoint is not a valid Maestro URL. '$MaestroApiEndPoint'"

+ 6 - 0
eng/common/post-build/publish-using-darc.ps1

@@ -10,6 +10,7 @@ param(
   [Parameter(Mandatory=$false)][string] $EnableNugetValidation,
   [Parameter(Mandatory=$false)][string] $PublishInstallersAndChecksums,
   [Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters,
+  [Parameter(Mandatory=$false)][string] $SymbolPublishingAdditionalParameters,
   [Parameter(Mandatory=$false)][string] $SigningValidationAdditionalParameters
 )
 
@@ -25,6 +26,11 @@ try {
     $optionalParams.Add($ArtifactsPublishingAdditionalParameters) | Out-Null
   }
 
+  if ("" -ne $SymbolPublishingAdditionalParameters) {
+    $optionalParams.Add("symbol-publishing-parameters") | Out-Null
+    $optionalParams.Add($SymbolPublishingAdditionalParameters) | Out-Null
+  }
+
   if ("false" -eq $WaitPublishingFinish) {
     $optionalParams.Add("--no-wait") | Out-Null
   }

+ 8 - 7
eng/common/post-build/sourcelink-validation.ps1

@@ -161,9 +161,12 @@ $ValidatePackage = {
 function CheckJobResult(
     $result, 
     $packagePath,
-    [ref]$ValidationFailures) {
-  if ($jobResult.result -ne '0') {
-    Write-PipelineTelemetryError -Category 'SourceLink' -Message "$packagePath has broken SourceLink links."
+    [ref]$ValidationFailures,
+    [switch]$logErrors) {
+  if ($result -ne '0') {
+    if ($logErrors) {
+      Write-PipelineTelemetryError -Category 'SourceLink' -Message "$packagePath has broken SourceLink links."
+    }
     $ValidationFailures.Value++
   }
 }
@@ -228,16 +231,14 @@ function ValidateSourceLinkLinks {
 
       foreach ($Job in @(Get-Job -State 'Completed')) {
         $jobResult = Wait-Job -Id $Job.Id | Receive-Job
-        CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures)
+        CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures) -LogErrors
         Remove-Job -Id $Job.Id
       }
     }
 
   foreach ($Job in @(Get-Job)) {
     $jobResult = Wait-Job -Id $Job.Id | Receive-Job
-    if ($jobResult -ne '0') {
-      $ValidationFailures++
-    }
+    CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures)
     Remove-Job -Id $Job.Id
   }
   if ($ValidationFailures -gt 0) {

+ 52 - 24
eng/common/post-build/symbols-validation.ps1

@@ -9,9 +9,16 @@ param(
 # Maximum number of jobs to run in parallel
 $MaxParallelJobs = 6
 
+# Max number of retries
+$MaxRetry = 5
+
 # Wait time between check for system load
 $SecondsBetweenLoadChecks = 10
 
+# Set error codes
+Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1
+Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2
+
 $CountMissingSymbols = {
   param( 
     [string] $PackagePath          # Path to a NuGet package
@@ -21,10 +28,15 @@ $CountMissingSymbols = {
 
   Add-Type -AssemblyName System.IO.Compression.FileSystem
 
+  Write-Host "Validating $PackagePath "
+
   # Ensure input file exist
   if (!(Test-Path $PackagePath)) {
     Write-PipelineTaskError "Input file does not exist: $PackagePath"
-    return -2
+    return [pscustomobject]@{
+      result = $using:ERROR_FILEDOESNOTEXIST
+      packagePath = $PackagePath
+    }
   }
   
   # Extensions for which we'll look for symbols
@@ -45,7 +57,7 @@ $CountMissingSymbols = {
     Write-Host "Something went wrong extracting $PackagePath"
     Write-Host $_
     return [pscustomobject]@{
-      result = -1
+      result = $using:ERROR_BADEXTRACT
       packagePath = $PackagePath
     }
   }
@@ -91,26 +103,37 @@ $CountMissingSymbols = {
       $dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools"
       $dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe"
 
-      & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
+      $totalRetries = 0
 
-      if (Test-Path $PdbPath) {
-        return 'PDB'
-      }
-      elseif (Test-Path $NGenPdb) {
-        return 'NGen PDB'
-      }
-      elseif (Test-Path $SODbg) {
-        return 'DBG for SO'
-      }  
-      elseif (Test-Path $DylibDwarf) {
-        return 'Dwarf for Dylib'
-      }  
-      elseif (Test-Path $SymbolPath) {
-        return 'Module'
-      }
-      else {
-        return $null
+      while ($totalRetries -lt $using:MaxRetry) {
+        # Save the output and get diagnostic output
+        $output = & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String
+
+        if (Test-Path $PdbPath) {
+          return 'PDB'
+        }
+        elseif (Test-Path $NGenPdb) {
+          return 'NGen PDB'
+        }
+        elseif (Test-Path $SODbg) {
+          return 'DBG for SO'
+        }  
+        elseif (Test-Path $DylibDwarf) {
+          return 'Dwarf for Dylib'
+        }  
+        elseif (Test-Path $SymbolPath) {
+          return 'Module'
+        }
+        elseif ($output.Contains("503 Service Unavailable")) {
+          # If we got a 503 error, we should retry.
+          $totalRetries++
+        }
+        else {
+          return $null
+        }
       }
+      
+      return $null
     }
 
       $SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath
@@ -155,14 +178,21 @@ function CheckJobResult(
     $packagePath,
     [ref]$DupedSymbols,
     [ref]$TotalFailures) {
-  if ($result -eq '-1') {
+  if ($result -eq $ERROR_BADEXTRACT) {
     Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files"
     $DupedSymbols.Value++
   } 
-  elseif ($jobResult.result -ne '0') {
+  elseif ($result -eq $ERROR_FILEDOESNOTEXIST) {
+    Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist"
+    $TotalFailures.Value++
+  }
+  elseif ($result -gt '0') {
     Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath"
     $TotalFailures.Value++
   }
+  else {
+    Write-Host "All symbols verified for package $packagePath"
+  }
 }
 
 function CheckSymbolsAvailable {
@@ -192,8 +222,6 @@ function CheckSymbolsAvailable {
         return
       }
 
-      Write-Host "Validating $FileName "
-
       Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList $FullName | Out-Null
 
       $NumJobs = @(Get-Job -State 'Running').Count

+ 5 - 13
eng/common/templates/job/job.yml

@@ -24,9 +24,9 @@ parameters:
   enablePublishBuildAssets: false
   enablePublishTestResults: false
   enablePublishUsingPipelines: false
-  useBuildManifest: false
   mergeTestResults: false
   testRunTitle: ''
+  testResultsFormat: ''
   name: ''
   preSteps: []
   runAsPublic: false
@@ -131,8 +131,8 @@ jobs:
     - task: RichCodeNavIndexer@0
       displayName: RichCodeNav Upload
       inputs:
-        languages: 'csharp'
-        environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'prod') }}
+        languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
+        environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'production') }}
         richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
       continueOnError: true
 
@@ -202,7 +202,7 @@ jobs:
       continueOnError: true
       condition: always()
 
-  - ${{ if eq(parameters.enablePublishTestResults, 'true') }}:
+  - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
     - task: PublishTestResults@2
       displayName: Publish XUnit Test Results
       inputs:
@@ -213,6 +213,7 @@ jobs:
         mergeTestResults: ${{ parameters.mergeTestResults }}
       continueOnError: true
       condition: always()
+  - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'vstest')) }}:
     - task: PublishTestResults@2
       displayName: Publish TRX Test Results
       inputs:
@@ -241,12 +242,3 @@ jobs:
         ArtifactName: AssetManifests
       continueOnError: ${{ parameters.continueOnError }}
       condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true'))
-
-  - ${{ if eq(parameters.useBuildManifest, true) }}:
-    - task: PublishBuildArtifacts@1
-      displayName: Publish Build Manifest
-      inputs:
-        PathToPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/manifest.props'
-        PublishLocation: Container
-        ArtifactName: BuildManifests
-      continueOnError: ${{ parameters.continueOnError }}

+ 4 - 63
eng/common/templates/post-build/post-build.yml

@@ -32,7 +32,6 @@ parameters:
   symbolPublishingAdditionalParameters: ''
   artifactsPublishingAdditionalParameters: ''
   signingValidationAdditionalParameters: ''
-  useBuildManifest: false
 
   # Which stages should finish execution before post-build stages start
   validateDependsOn:
@@ -54,9 +53,6 @@ parameters:
   NETCoreExperimentalChannelId: 562
   NetEngServicesIntChannelId: 678
   NetEngServicesProdChannelId: 679
-  Net5Preview8ChannelId: 1155
-  Net5RC1ChannelId: 1157
-  Net5RC2ChannelId: 1329
   NetCoreSDK313xxChannelId: 759
   NetCoreSDK313xxInternalChannelId: 760
   NetCoreSDK314xxChannelId: 921
@@ -94,7 +90,7 @@ stages:
             inputs:
               filePath: $(Build.SourcesDirectory)/eng/common/post-build/check-channel-consistency.ps1
               arguments: -PromoteToChannels "$(TargetChannels)"
-                -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetDev5ChannelId}},${{parameters.NetDev6ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview8ChannelId}},${{parameters.Net5RC1ChannelId}},${{parameters.Net5RC2ChannelId}},${{parameters.NetCoreSDK313xxChannelId}},${{parameters.NetCoreSDK313xxInternalChannelId}},${{parameters.NetCoreSDK314xxChannelId}},${{parameters.NetCoreSDK314xxInternalChannelId}},${{parameters.VS166ChannelId}},${{parameters.VS167ChannelId}},${{parameters.VS168ChannelId}},${{parameters.VSMasterChannelId}}
+                -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetDev5ChannelId}},${{parameters.NetDev6ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.NetCoreSDK313xxChannelId}},${{parameters.NetCoreSDK313xxInternalChannelId}},${{parameters.NetCoreSDK314xxChannelId}},${{parameters.NetCoreSDK314xxInternalChannelId}},${{parameters.VS166ChannelId}},${{parameters.VS167ChannelId}},${{parameters.VS168ChannelId}},${{parameters.VSMasterChannelId}}
 
     - job:
       displayName: NuGet Validation
@@ -142,16 +138,6 @@ stages:
       pool:
         vmImage: 'windows-2019'
       steps:
-        - ${{ if eq(parameters.useBuildManifest, true) }}:
-          - task: DownloadBuildArtifacts@0
-            displayName: Download build manifest
-            inputs:
-              buildType: specific
-              buildVersionToDownload: specific
-              project: $(AzDOProjectName)
-              pipeline: $(AzDOPipelineId)
-              buildId: $(AzDOBuildId)
-              artifactName: BuildManifests
         - task: DownloadBuildArtifacts@0
           displayName: Download Package Artifacts
           inputs:
@@ -253,6 +239,7 @@ stages:
     - job:
       displayName: Publish Using Darc
       dependsOn: setupMaestroVars
+      timeoutInMinutes: 120
       variables:
         - name: BARBuildId
           value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
@@ -269,6 +256,8 @@ stages:
               -MaestroToken '$(MaestroApiAccessToken)'
               -WaitPublishingFinish ${{ parameters.waitPublishingFinish }}
               -PublishInstallersAndChecksums ${{ parameters.publishInstallersAndChecksums }}
+              -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
+              -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
 
 - ${{ if and(le(parameters.publishingInfraVersion, 2), eq(parameters.inline, 'true')) }}:
   - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
@@ -303,54 +292,6 @@ stages:
       shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json'
       symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-symbols/nuget/v3/index.json'
 
-  - template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
-    parameters:
-      BARBuildId: ${{ parameters.BARBuildId }}
-      PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}    
-      artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
-      dependsOn: ${{ parameters.publishDependsOn }}
-      publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
-      symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }}
-      stageName: 'Net5_Preview8_Publish'
-      channelName: '.NET 5 Preview 8'
-      akaMSChannelName: 'net5/preview8'
-      channelId: ${{ parameters.Net5Preview8ChannelId }}
-      transportFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v3/index.json'
-      shippingFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json'
-      symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-symbols/nuget/v3/index.json'
-
-  - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
-    parameters:
-      BARBuildId: ${{ parameters.BARBuildId }}
-      PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-      artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
-      dependsOn: ${{ parameters.publishDependsOn }}
-      publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
-      symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }}
-      stageName: 'Net5_RC1_Publish'
-      channelName: '.NET 5 RC 1'
-      akaMSChannelName: 'net5/rc1'
-      channelId: ${{ parameters.Net5RC1ChannelId }}
-      transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json'
-      shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json'
-      symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json'
-
-  - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
-    parameters:
-      BARBuildId: ${{ parameters.BARBuildId }}
-      PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-      artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
-      dependsOn: ${{ parameters.publishDependsOn }}
-      publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
-      symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }}
-      stageName: 'Net5_RC2_Publish'
-      channelName: '.NET 5 RC 2'
-      akaMSChannelName: 'net5/rc2'
-      channelId: ${{ parameters.Net5RC2ChannelId }}
-      transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json'
-      shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json'
-      symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json'
-
   - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
     parameters:
       BARBuildId: ${{ parameters.BARBuildId }}

+ 13 - 4
eng/common/tools.ps1

@@ -57,7 +57,7 @@ set-strictmode -version 2.0
 $ErrorActionPreference = 'Stop'
 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
 
-# If specified, provides an alternate path for getting .NET Core SDKs and Runtimes. This script will still try public sources first.
+# If specifies, provides an alternate path for getting .NET Core SDKs and Runtimes. This script will still try public sources first.
 [string]$runtimeSourceFeed = if (Test-Path variable:runtimeSourceFeed) { $runtimeSourceFeed } else { $null }
 # Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed
 [string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null }
@@ -677,14 +677,23 @@ function MSBuild-Core() {
   $exitCode = Exec-Process $buildTool.Path $cmdArgs
 
   if ($exitCode -ne 0) {
-    Write-PipelineTelemetryError -Category 'Build' -Message 'Build failed.'
+    # We should not Write-PipelineTaskError here because that message shows up in the build summary
+    # The build already logged an error, that's the reason it failed. Producing an error here only adds noise.
+    Write-Host "Build failed with exit code $exitCode. Check errors above." -ForegroundColor Red
 
     $buildLog = GetMSBuildBinaryLogCommandLineArgument $args
-    if ($buildLog -ne $null) {
+    if ($null -ne $buildLog) {
       Write-Host "See log: $buildLog" -ForegroundColor DarkGray
     }
 
-    ExitWithExitCode $exitCode
+    if ($ci) {
+      Write-PipelineSetResult -Result "Failed" -Message "msbuild execution failed."
+      # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error
+      # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error
+      ExitWithExitCode 0
+    } else {
+      ExitWithExitCode $exitCode
+    }
   }
 }
 

+ 20 - 7
eng/common/tools.sh

@@ -249,7 +249,7 @@ function with_retries {
       return 0
     fi
 
-    timeout=$((2**$retries-1))
+    timeout=$((3**$retries-1))
     echo "Failed to execute '$@'. Waiting $timeout seconds before next attempt ($retries out of $maxRetries)." 1>&2
     sleep $timeout
   done
@@ -271,10 +271,14 @@ function GetDotNetInstallScript {
 
     # Use curl if available, otherwise use wget
     if command -v curl > /dev/null; then
-      with_retries curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || {
-        local exit_code=$?
-        Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
-        ExitWithExitCode $exit_code
+      # first, try directly, if this fails we will retry with verbose logging
+      curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" || {
+        echo "curl failed; will now retry with verbose logging."
+        with_retries curl "$install_script_url" -sSL --verbose --retry 10 --create-dirs -o "$install_script" || {
+          local exit_code=$?
+          Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to acquire dotnet install script (exit code '$exit_code')."
+          ExitWithExitCode $exit_code
+        }
       }
     else
       with_retries wget -v -O "$install_script" "$install_script_url" || {
@@ -437,8 +441,17 @@ function MSBuild-Core {
 
     "$_InitializeBuildTool" "$@" || {
       local exit_code=$?
-      Write-PipelineTaskError "Build failed (exit code '$exit_code')."
-      ExitWithExitCode $exit_code
+      # We should not Write-PipelineTaskError here because that message shows up in the build summary
+      # The build already logged an error, that's the reason it failed. Producing an error here only adds noise.
+      echo "Build failed with exit code $exit_code. Check errors above."
+      if [[ "$ci" == "true" ]]; then
+        Write-PipelineSetResult -result "Failed" -message "msbuild execution failed."
+        # Exiting with an exit code causes the azure pipelines task to log yet another "noise" error
+        # The above Write-PipelineSetResult will cause the task to be marked as failure without adding yet another error
+        ExitWithExitCode 0
+      else
+        ExitWithExitCode $exit_code
+      fi
     }
   }
 

+ 2 - 2
eng/helix/content/RunTests/ProcessUtil.cs

@@ -53,7 +53,7 @@ namespace RunTests
         public static Task CaptureDumpAsync(int pid, string dumpFilePath)
         {
             // Skip this on OSX, we know it's unsupported right now
-            if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+            if (OperatingSystem.IsMacOS())
             {
                 // Can we capture stacks or do a gcdump instead?
                 return Task.CompletedTask;
@@ -178,7 +178,7 @@ namespace RunTests
                     await CaptureDumpAsync(process.Id, dumpFilePath);
                 }
 
-                if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+                if (!OperatingSystem.IsWindows())
                 {
                     sys_kill(process.Id, sig: 2); // SIGINT
 

+ 5 - 0
eng/helix/content/RunTests/RunTestsOptions.cs

@@ -50,6 +50,11 @@ namespace RunTests
                     aliases: new string[] { "--helixTimeout" },
                     description: "The timeout duration of the Helix job")
                 { Argument = new Argument<string>(), Required = true },
+
+                new Option(
+                    aliases: new string[] { "--source" },
+                    description: "The restore sources to use during testing")
+                { Argument = new Argument<string>() { Arity = ArgumentArity.ZeroOrMore }, Required = true }
             };
 
             var parseResult = command.Parse(args);

+ 1 - 1
eng/helix/content/RunTests/TestRunner.cs

@@ -144,7 +144,7 @@ namespace RunTests
                         cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
 
                     // ';' is the path separator on Windows, and ':' on Unix
-                    Options.Path += RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ";" : ":";
+                    Options.Path += OperatingSystem.IsWindows() ? ";" : ":";
                     Options.Path += $"{Environment.GetEnvironmentVariable("DOTNET_CLI_HOME")}/.dotnet/tools";
                     EnvironmentVariables["PATH"] = Options.Path;
                 }

+ 8 - 4
eng/helix/content/runtests.cmd

@@ -25,14 +25,18 @@ set "PATH=%DOTNET_ROOT%;%PATH%;%HELIX_CORRELATION_PAYLOAD%\node\bin"
 echo Set path to: "%PATH%"
 echo.
 
-echo "InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true '' '' $true"
-powershell.exe -noLogo -NoProfile -ExecutionPolicy unrestricted -command ". eng\common\tools.ps1; InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true '' '' $true"
-echo.
-
 IF [%$feedCred%] == [] (
+    echo "InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true '' '' $true"
+    powershell.exe -noLogo -NoProfile -ExecutionPolicy unrestricted -command ". eng\common\tools.ps1; InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true '' '' $true"
+    echo.
+
     echo "InstallDotNet %DOTNET_ROOT% %$runtimeVersion% %$arch% dotnet $true '' '' $true"
     powershell.exe -noLogo -NoProfile -ExecutionPolicy unrestricted -command ". eng\common\tools.ps1; InstallDotNet %DOTNET_ROOT% %$runtimeVersion% %$arch% dotnet $true '' '' $true"
 ) else (
+    echo "InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true https://dotnetclimsrc.blob.core.windows.net/dotnet ... $true"
+    powershell.exe -noLogo -NoProfile -ExecutionPolicy unrestricted -command ". eng\common\tools.ps1; InstallDotNet %DOTNET_ROOT% %$sdkVersion% %$arch% '' $true https://dotnetclimsrc.blob.core.windows.net/dotnet %$feedCred% $true"
+    echo.
+
     echo "InstallDotNet %DOTNET_ROOT% %$runtimeVersion% %$arch% dotnet $true https://dotnetclimsrc.blob.core.windows.net/dotnet ... $true"
     powershell.exe -noLogo -NoProfile -ExecutionPolicy unrestricted -command ". eng\common\tools.ps1; InstallDotNet %DOTNET_ROOT% %$runtimeVersion% %$arch% dotnet $true https://dotnetclimsrc.blob.core.windows.net/dotnet %$feedCred% $true"
 )

+ 16 - 7
eng/helix/content/runtests.sh

@@ -31,15 +31,16 @@ YELLOW="\033[0;33m"
 MAGENTA="\033[0;95m"
 
 . eng/common/tools.sh
-echo "InstallDotNet $DOTNET_ROOT $dotnet_sdk_version '' '' true"
-InstallDotNet $DOTNET_ROOT $dotnet_sdk_version "" "" true || {
-  exit_code=$?
-  Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "dotnet-install.sh failed (exit code '$exit_code')." >&2
-  ExitWithExitCode $exit_code
-}
-echo
 
 if [[ -z "${10:-}" ]]; then
+    echo "InstallDotNet $DOTNET_ROOT $dotnet_sdk_version '' '' true"
+    InstallDotNet $DOTNET_ROOT $dotnet_sdk_version "" "" true || {
+      exit_code=$?
+      Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "dotnet-install.sh failed (exit code '$exit_code')." >&2
+      ExitWithExitCode $exit_code
+    }
+    echo
+
     echo "InstallDotNet $DOTNET_ROOT $dotnet_runtime_version '' dotnet true"
     InstallDotNet $DOTNET_ROOT $dotnet_runtime_version "" dotnet true || {
       exit_code=$?
@@ -47,6 +48,14 @@ if [[ -z "${10:-}" ]]; then
       ExitWithExitCode $exit_code
     }
 else
+    echo "InstallDotNet $DOTNET_ROOT $dotnet_sdk_version '' '' true https://dotnetclimsrc.blob.core.windows.net/dotnet ..."
+    InstallDotNet $DOTNET_ROOT $dotnet_sdk_version "" "" true https://dotnetclimsrc.blob.core.windows.net/dotnet ${10} || {
+      exit_code=$?
+      Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "dotnet-install.sh failed (exit code '$exit_code')." >&2
+      ExitWithExitCode $exit_code
+    }
+    echo
+
     echo "InstallDotNet $DOTNET_ROOT $dotnet_runtime_version '' dotnet true https://dotnetclimsrc.blob.core.windows.net/dotnet ..."
     InstallDotNet $DOTNET_ROOT $dotnet_runtime_version "" dotnet true https://dotnetclimsrc.blob.core.windows.net/dotnet ${10} || {
       exit_code=$?

+ 7 - 5
eng/scripts/CodeCheck.ps1

@@ -7,8 +7,10 @@ param(
     [switch]$ci,
     # Optional arguments that enable downloading an internal
     # runtime or runtime from a non-default location
-    [string]$DotNetRuntimeSourceFeed,
-    [string]$DotNetRuntimeSourceFeedKey
+    [Alias('DotNetRuntimeSourceFeed')]
+    [string]$RuntimeSourceFeed,
+    [Alias('DotNetRuntimeSourceFeedKey')]
+    [string]$RuntimeSourceFeedKey
 )
 
 $ErrorActionPreference = 'Stop'
@@ -47,8 +49,8 @@ function LogError {
 try {
     if ($ci) {
         # Install dotnet.exe
-        if ($DotNetRuntimeSourceFeed -or $DotNetRuntimeSourceFeedKey) {
-            & $repoRoot/restore.cmd -ci -nobl -noBuildNodeJS -DotNetRuntimeSourceFeed $DotNetRuntimeSourceFeed -DotNetRuntimeSourceFeedKey $DotNetRuntimeSourceFeedKey
+        if ($RuntimeSourceFeed -or $RuntimeSourceFeedKey) {
+            & $repoRoot/restore.cmd -ci -nobl -noBuildNodeJS -RuntimeSourceFeed $RuntimeSourceFeed -RuntimeSourceFeedKey $RuntimeSourceFeedKey
         }
         else{
             & $repoRoot/restore.cmd -ci -nobl -noBuildNodeJS
@@ -108,7 +110,7 @@ try {
         else {
             $varName = $dep.Name -replace '\.',''
             $varName = $varName -replace '\-',''
-            $varName = "${varName}PackageVersion"
+            $varName = "${varName}Version"
 
             $versionVar = $versionProps.SelectSingleNode("//PropertyGroup[`@Label=`"Automated`"]/$varName")
             $actualVersion = $versionVar.InnerText

+ 19 - 14
eng/scripts/ci-source-build.sh

@@ -33,8 +33,8 @@ reporoot="$(dirname "$(dirname "$scriptroot")")"
 #    mv "$reporoot/global.bak.json" "$reporoot/global.json"
 #}" EXIT
 
-dotnet_runtime_source_feed=''
-dotnet_runtime_source_feed_key=''
+runtime_source_feed=''
+runtime_source_feed_key=''
 other_args=()
 
 #
@@ -46,8 +46,8 @@ __usage() {
 Arguments:
     <Arguments>...                    Arguments passed to the command. Variable number of arguments allowed.
 
-    --dotnet-runtime-source-feed      Additional feed that can be used when downloading .NET runtimes
-    --dotnet-runtime-source-feed-key  Key for feed that can be used when downloading .NET runtimes
+    --runtime-source-feed             Additional feed that can be used when downloading .NET runtimes and SDKs
+    --runtime-source-feed-key         Key for feed that can be used when downloading .NET runtimes and SDKs
 
 Description:
    This script is meant for testing source build by imitating some of the input parameters and conditions.
@@ -73,15 +73,15 @@ while [[ $# -gt 0 ]]; do
             __usage --no-exit
             exit 0
             ;;
-        -dotnet-runtime-source-feed|-dotnetruntimesourcefeed)
+        -dotnet-runtime-source-feed|-dotnetruntimesourcefeed|-runtime_source_feed|-runtimesourcefeed)
             shift
-            [ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed" && __usage
-            dotnet_runtime_source_feed="${1:-}"
+            [ -z "${1:-}" ] && __error "Missing value for parameter --runtime-source-feed" && __usage
+            runtime_source_feed="${1:-}"
             ;;
-        -dotnet-runtime-source-feed-key|-dotnetruntimesourcefeedkey)
+        -dotnet-runtime-source-feed-key|-dotnetruntimesourcefeedkey|-runtime_source_feed_key|-runtimesourcefeedkey)
             shift
-            [ -z "${1:-}" ] && __error "Missing value for parameter --dotnet-runtime-source-feed-key" && __usage
-            dotnet_runtime_source_feed_key="${1:-}"
+            [ -z "${1:-}" ] && __error "Missing value for parameter --runtime-source-feed-key" && __usage
+            runtime_source_feed_key="${1:-}"
             ;;
         *)
             other_args[${#other_args[*]}]="$1"
@@ -92,9 +92,14 @@ done
 
 # Set up additional runtime args
 runtime_feed_args=()
-if [ ! -z "$dotnet_runtime_source_feed$dotnet_runtime_source_feed_key" ]; then
-    runtimeFeedArg="/p:DotNetRuntimeSourceFeed=$dotnet_runtime_source_feed"
-    runtimeFeedKeyArg="/p:DotNetRuntimeSourceFeedKey=$dotnet_runtime_source_feed_key"
+if [ ! -z "$runtime_source_feed$runtime_source_feed_key" ]; then
+    runtime_feed_args[${#runtime_feed_args[*]}]="-runtimesourcefeed"
+    runtime_feed_args[${#runtime_feed_args[*]}]="$runtime_source_feed"
+    runtime_feed_args[${#runtime_feed_args[*]}]="-runtimesourcefeedKey"
+    runtime_feed_args[${#runtime_feed_args[*]}]="$runtime_source_feed_key"
+
+    runtimeFeedArg="/p:DotNetRuntimeSourceFeed=$runtime_source_feed"
+    runtimeFeedKeyArg="/p:DotNetRuntimeSourceFeedKey=$runtime_source_feed_key"
     runtime_feed_args[${#runtime_feed_args[*]}]=$runtimeFeedArg
     runtime_feed_args[${#runtime_feed_args[*]}]=$runtimeFeedKeyArg
 fi
@@ -105,4 +110,4 @@ fi
 export DotNetBuildFromSource='true'
 
 # Build projects
-"$reporoot/eng/common/build.sh" --restore --build --pack ${other_args[@]+"${other_args[@]}"} ${runtime_feed_args[@]+"${runtime_feed_args[@]}"}
+"$reporoot/eng/common/build.sh" --restore --build --ci --pack ${other_args[@]+"${other_args[@]}"} ${runtime_feed_args[@]+"${runtime_feed_args[@]}"}

+ 1 - 1
eng/targets/CSharp.Common.props

@@ -45,7 +45,7 @@
   </ItemGroup>
 
   <ImportGroup Condition="'$(UsingMicrosoftNETSdkBlazorWebAssembly)' == 'true'">
-    <Import Project="$(RepoRoot)src\Components\WebAssembly\Sdk\src\build\net5.0\Microsoft.NET.Sdk.BlazorWebAssembly.props" />
+    <Import Project="$(RepoRoot)src\Components\WebAssembly\Sdk\src\build\net6.0\Microsoft.NET.Sdk.BlazorWebAssembly.props" />
   </ImportGroup>
 
   <PropertyGroup Condition="'$(UsingMicrosoftNETSdkBlazorWebAssembly)' == 'true'">

+ 13 - 7
eng/targets/Helix.Common.props

@@ -21,25 +21,31 @@
   <!-- PR(ci.yaml) required queues -->
   <ItemGroup Condition="'$(IsRequiredCheck)' == 'true' AND '$(TargetArchitecture)' == 'x64'">
     <HelixAvailableTargetQueue Include="Ubuntu.1604.Amd64.Open" Platform="Linux" />
-    <HelixAvailableTargetQueue Include="Windows.10.Amd64.Open" Platform="Windows" />
+    <HelixAvailableTargetQueue Include="Windows.10.Amd64.Server20H1.Open" Platform="Windows" />
     <HelixAvailableTargetQueue Include="OSX.1014.Amd64.Open" Platform="Linux" />
   </ItemGroup>
 
   <!-- queues for helix-matrix.yml pipeline -->
-  <ItemGroup Condition="'$(IsWindowsOnlyTest)' != 'true' AND '$(TargetArchitecture)' == 'x64' AND '$(IsHelixDaily)' == 'true'">
-    <HelixAvailableTargetQueue Include="Windows.7.Amd64.Open" Platform="Windows" />
-    <HelixAvailableTargetQueue Include="Windows.81.Amd64.Open" Platform="Windows" />
-    <HelixAvailableTargetQueue Include="Windows.10.Amd64.Server20H1.Open" Platform="Windows" />
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'x64' AND '$(IsHelixDaily)' == 'true' AND '$(IsWindowsOnlyTest)' != 'true'">
     <HelixAvailableTargetQueue Include="Ubuntu.1804.Amd64.Open" Platform="Linux" />
     <HelixAvailableTargetQueue Include="Ubuntu.2004.Amd64.Open" Platform="Linux" />
+    <HelixAvailableTargetQueue Include="OSX.1100.Amd64.Open" Platform="Linux" />
     <HelixAvailableTargetQueue Include="Debian.9.Amd64.Open" Platform="Linux" />
     <HelixAvailableTargetQueue Include="Redhat.7.Amd64.Open" Platform="Linux" />
     <HelixAvailableTargetQueue Include="(Fedora.28.Amd64.Open)[email protected]/dotnet-buildtools/prereqs:fedora-28-helix-09ca40b-20190508143249" Platform="Linux" />
+    <HelixAvailableTargetQueue Include="(Alpine.312.Amd64.Open)[email protected]/dotnet-buildtools/prereqs:alpine-3.12-helix-20200908125345-56c6673" Platform="Linux" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'x64' AND '$(IsHelixDaily)' == 'true'">
+    <HelixAvailableTargetQueue Include="Windows.7.Amd64.Open" Platform="Windows" />
+    <HelixAvailableTargetQueue Include="Windows.81.Amd64.Open" Platform="Windows" />
   </ItemGroup>
 
   <!-- arm64 queues for helix-matrix.yml pipeline -->
-  <ItemGroup Condition="'$(IsWindowsOnlyTest)' != 'true' AND '$(TargetArchitecture)' == 'arm64' AND '$(IsHelixDaily)' == 'true'">
-    <HelixAvailableTargetQueue Include="Windows.10.Arm64.Open" Platform="Windows" />
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'arm64' AND '$(IsHelixDaily)' == 'true' AND '$(IsWindowsOnlyTest)' != 'true'">
     <HelixAvailableTargetQueue Include="(Debian.9.Arm64.Open)[email protected]/dotnet-buildtools/prereqs:debian-9-helix-arm64v8-a12566d-20190807161036" Platform="Linux" />
   </ItemGroup>
+  <!-- IIS Express isn't supported on arm64 and most of the IsWindowsOnlyTests depend on it's setup scripts. -->
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'arm64' AND '$(IsHelixDaily)' == 'true' AND '$(IsWindowsOnlyTest)' != 'true'">
+    <HelixAvailableTargetQueue Include="Windows.10.Arm64v8.Open" Platform="Windows" />
+  </ItemGroup>
 </Project>

+ 4 - 7
eng/targets/Helix.targets

@@ -42,11 +42,6 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
     </ContentWithTargetPath>
-    <ContentWithTargetPath Include="$(RepoRoot)eng\common\dotnet-install-scripts\*">
-      <TargetPath>eng\common\dotnet-install-scripts\%(Filename)%(Extension)</TargetPath>
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
-    </ContentWithTargetPath>
   </ItemGroup>
 
   <!--
@@ -97,6 +92,7 @@
     <PropertyGroup>
       <BuildHelixPayload Condition="'@(_HelixApplicableTargetQueue->Count())' == '0'">false</BuildHelixPayload>
       <BuildHelixPayload Condition="'$(TargetArchitecture)' == 'arm64' AND '$(SkipHelixArm)' == 'true'">false</BuildHelixPayload>
+      <BuildHelixPayload Condition="$(HelixTargetQueue.StartsWith('%28Alpine.')) AND '$(SkipHelixAlpine)' == 'true'">false</BuildHelixPayload>
       <BuildHelixPayload Condition="$(SkipHelixQueues.Contains('$(HelixTargetQueue)'))">false</BuildHelixPayload>
     </PropertyGroup>
   </Target>
@@ -165,9 +161,10 @@
         <!--
           When the targeting pack builds, it has exactly the same version as the shared framework. Passing
           SharedFxVersion because that's needed even when the targeting pack isn't building.
+          Use the BrowserDebugHost transport package as a sentinel for the non-shipping version of the NETCoreApp shared framework.
         -->
-        <Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppInternalPackageVersion) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfPackageVersion) $(HelixTimeout) $(DotNetRuntimeSourceFeedKey)</Command>
-        <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreAppInternalPackageVersion) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfPackageVersion) $(HelixTimeout) $(DotNetRuntimeSourceFeedKey)</Command>
+        <Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreBrowserDebugHostTransportVersion) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfVersion) $(HelixTimeout) $(DotNetRuntimeSourceFeedKey)</Command>
+        <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(NETCoreSdkVersion) $(MicrosoftNETCoreBrowserDebugHostTransportVersion) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(TargetArchitecture) $(RunQuarantinedTests) $(DotnetEfVersion) $(HelixTimeout) $(DotNetRuntimeSourceFeedKey)</Command>
         <Command Condition="$(HelixCommand) != ''">$(HelixCommand)</Command>
         <Timeout>$(HelixTimeout)</Timeout>
       </HelixWorkItem>

+ 2 - 2
eng/targets/Npm.Common.targets

@@ -122,8 +122,8 @@
         <PackageId>$(PackageId)</PackageId>
         <PackageVersion>$(PackageVersionForPackageVersionInfo)</PackageVersion>
         <VersionSuffix>$(VersionSuffix)</VersionSuffix>
-        <!-- Fill in the item though variable names like "@microsoft/signalrPackageVersion" are likely invalid. -->
-        <VersionVariableName>$(PackageId.Replace('.',''))PackageVersion</VersionVariableName>
+        <!-- Fill in the item though variable names like "@microsoft/signalrVersion" are likely invalid. -->
+        <VersionVariableName>$(PackageId.Replace('.',''))dVersion</VersionVariableName>
       </_ProjectPathWithVersion>
     </ItemGroup>
   </Target>

+ 1 - 1
eng/targets/Packaging.targets

@@ -18,7 +18,7 @@
         <PackageId>$(PackageId)</PackageId>
         <PackageVersion>$(PackageVersionForPackageVersionInfo)</PackageVersion>
         <VersionSuffix>$(VersionSuffix)</VersionSuffix>
-        <VersionVariableName>$(PackageId.Replace('.',''))PackageVersion</VersionVariableName>
+        <VersionVariableName>$(PackageId.Replace('.',''))Version</VersionVariableName>
       </_ProjectPathWithVersion>
     </ItemGroup>
   </Target>

+ 2 - 1
eng/targets/ResolveReferences.targets

@@ -297,10 +297,11 @@
     If we have a ref/ assembly from dotnet/runtime for an Extension package, use that when compiling but do not reference its assemblies.
   -->
   <ItemGroup Condition=" '$(MSBuildProjectName)' != 'Microsoft.AspNetCore.App.Runtime' AND
+      '$(MSBuildProjectName)' != 'RepoTasks' AND
       ($(_CompileTfmUsingReferenceAssemblies) OR
        ('$(IsTargetingPackBuilding)' != 'false' AND '$(MSBuildProjectName)' == 'Microsoft.AspNetCore.App.Ref')) ">
     <PackageReference Include="Microsoft.Extensions.Internal.Transport"
-        Version="$(MicrosoftExtensionsInternalTransportPackageVersion)"
+        Version="$(MicrosoftExtensionsInternalTransportVersion)"
         IsImplicitlyDefined="true"
         IncludeAssets="Compile"
         PrivateAssets="All"

+ 1 - 1
eng/tools/BaselineGenerator/BaselineGenerator.csproj

@@ -7,8 +7,8 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
     <PackageReference Include="NuGet.Protocol" Version="4.8.2" />
-    <PackageReference Include="Microsoft.Extensions.CommandLineUtils" Version="1.1.0" />
   </ItemGroup>
 
 </Project>

+ 76 - 38
eng/tools/BaselineGenerator/Program.cs

@@ -4,6 +4,7 @@
 using System;
 using System.IO;
 using System.Linq;
+using System.Collections.Generic;
 using System.Net.Http;
 using System.Text;
 using System.Threading;
@@ -30,16 +31,18 @@ namespace PackageBaselineGenerator
             new Program().Execute(args);
         }
 
-        private readonly CommandOption _source;
+        private readonly CommandOption _sources;
         private readonly CommandOption _output;
         private readonly CommandOption _update;
 
+        private static readonly string[] _defaultSources = new string[] { "https://api.nuget.org/v3/index.json" };
+
         public Program()
         {
-            _source = Option(
-                "-s|--package-source <SOURCE>",
-                "The NuGet source of packages to fetch",
-                CommandOptionType.SingleValue);
+            _sources = Option(
+                "-s|--package-sources <Sources>",
+                "The NuGet source(s) of packages to fetch",
+                CommandOptionType.MultipleValue);
             _output = Option("-o|--output <OUT>", "The generated file output path", CommandOptionType.SingleValue);
             _update = Option("-u|--update", "Regenerate the input (Baseline.xml) file.", CommandOptionType.NoValue);
 
@@ -56,26 +59,32 @@ namespace PackageBaselineGenerator
 
             var inputPath = Path.Combine(Directory.GetCurrentDirectory(), "Baseline.xml");
             var input = XDocument.Load(inputPath);
-            var source = _source.HasValue() ? _source.Value().TrimEnd('/') : "https://api.nuget.org/v3/index.json";
-            var packageSource = new PackageSource(source);
+            var sources = _sources.HasValue() ? _sources.Values.Select(s => s.TrimEnd('/')) : _defaultSources;
+            var packageSources = sources.Select(s => new PackageSource(s));
             var providers = Repository.Provider.GetCoreV3(); // Get v2 and v3 API support
-            var sourceRepository = new SourceRepository(packageSource, providers);
+            var sourceRepositories = packageSources.Select(ps => new SourceRepository(ps, providers));
             if (_update.HasValue())
             {
-                var updateResult = await RunUpdateAsync(inputPath, input, sourceRepository);
+                var updateResult = await RunUpdateAsync(inputPath, input, sourceRepositories);
                 if (updateResult != 0)
                 {
                     return updateResult;
                 }
             }
 
-            var feedType = await sourceRepository.GetFeedType(CancellationToken.None);
-            var feedV3 = feedType == FeedType.HttpV3;
-            var packageBase = source + "/package";
-            if (feedV3)
+            List<(string packageBase, bool feedV3)> packageBases = new List<(string, bool)>();
+            foreach (var sourceRepository in sourceRepositories)
             {
-                var resources = await sourceRepository.GetResourceAsync<ServiceIndexResourceV3>();
-                packageBase = resources.GetServiceEntryUri(ServiceTypes.PackageBaseAddress).ToString().TrimEnd('/');
+                var feedType = await sourceRepository.GetFeedType(CancellationToken.None);
+                var feedV3 = feedType == FeedType.HttpV3;
+                var packageBase = sourceRepository.PackageSource + "/package";
+                if (feedV3)
+                {
+                    var resources = await sourceRepository.GetResourceAsync<ServiceIndexResourceV3>();
+                    packageBase = resources.GetServiceEntryUri(ServiceTypes.PackageBaseAddress).ToString().TrimEnd('/');
+                }
+
+                packageBases.Add((packageBase, feedV3));
             }
 
             var output = _output.HasValue()
@@ -116,18 +125,34 @@ namespace PackageBaselineGenerator
 
                 if (!File.Exists(nupkgPath))
                 {
-                    var url = feedV3 ?
-                        $"{packageBase}/{id.ToLowerInvariant()}/{version}/{id.ToLowerInvariant()}.{version}.nupkg" :
-                        $"{packageBase}/{id}/{version}";
-
-                    Console.WriteLine($"Downloading {url}");
-                    using (var response = await client.GetStreamAsync(url))
+                    foreach ((string packageBase, bool feedV3) in packageBases)
                     {
-                        using (var file = File.Create(nupkgPath))
+                        var url = feedV3 ?
+                            $"{packageBase}/{id.ToLowerInvariant()}/{version}/{id.ToLowerInvariant()}.{version}.nupkg" :
+                            $"{packageBase}/{id}/{version}";
+
+                        Console.WriteLine($"Downloading {url}");
+                        try
+                        {
+                            using (var response = await client.GetStreamAsync(url))
+                            {
+                                using (var file = File.Create(nupkgPath))
+                                {
+                                    await response.CopyToAsync(file);
+                                }
+                            }
+                        }
+                        catch (HttpRequestException e) when (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                         {
-                            await response.CopyToAsync(file);
+                            // If it's not found, continue onto the next one.
+                            continue;
                         }
                     }
+
+                    if (!File.Exists(nupkgPath))
+                    {
+                        throw new Exception($"Could not download package {id} @ {version} using any input feed");
+                    }
                 }
 
                 using (var reader = new PackageArchiveReader(nupkgPath))
@@ -195,9 +220,11 @@ namespace PackageBaselineGenerator
         private async Task<int> RunUpdateAsync(
             string documentPath,
             XDocument document,
-            SourceRepository sourceRepository)
+            IEnumerable<SourceRepository> sourceRepositories)
         {
-            var packageMetadataResource = await sourceRepository.GetResourceAsync<PackageMetadataResource>();
+            var packageMetadataResources = await Task.WhenAll(sourceRepositories.Select(async sr =>
+                await sr.GetResourceAsync<PackageMetadataResource>()));
+
             var logger = new Logger(Error, Out);
             var hasChanged = false;
             using (var cacheContext = new SourceCacheContext { NoCache = true })
@@ -206,7 +233,7 @@ namespace PackageBaselineGenerator
                 hasChanged = await TryUpdateVersionAsync(
                     versionAttribute,
                     "Microsoft.AspNetCore.App.Runtime.win-x64",
-                    packageMetadataResource,
+                    packageMetadataResources,
                     logger,
                     cacheContext);
 
@@ -217,7 +244,7 @@ namespace PackageBaselineGenerator
                     var attributeChanged = await TryUpdateVersionAsync(
                         versionAttribute,
                         id,
-                        packageMetadataResource,
+                        packageMetadataResources,
                         logger,
                         cacheContext);
 
@@ -261,25 +288,36 @@ namespace PackageBaselineGenerator
         private static async Task<bool> TryUpdateVersionAsync(
             XAttribute versionAttribute,
             string packageId,
-            PackageMetadataResource packageMetadataResource,
+            IEnumerable<PackageMetadataResource> packageMetadataResources,
             ILogger logger,
             SourceCacheContext cacheContext)
         {
-            var searchMetadata = await packageMetadataResource.GetMetadataAsync(
-                packageId,
-                includePrerelease: false,
-                includeUnlisted: true, // Microsoft.AspNetCore.DataOrotection.Redis package is not listed.
-                sourceCacheContext: cacheContext,
-                log: logger,
-                token: CancellationToken.None);
-
             var currentVersion = NuGetVersion.Parse(versionAttribute.Value);
             var versionRange = new VersionRange(
                 currentVersion,
                 new FloatRange(NuGetVersionFloatBehavior.Patch, currentVersion));
 
-            var latestVersion = versionRange.FindBestMatch(
-                searchMetadata.Select(metadata => metadata.Identity.Version));
+            var searchMetadatas = await Task.WhenAll(
+                packageMetadataResources.Select(async pmr => await pmr.GetMetadataAsync(
+                    packageId,
+                    includePrerelease: false,
+                    includeUnlisted: true, // Microsoft.AspNetCore.DataOrotection.Redis package is not listed.
+                    sourceCacheContext: cacheContext,
+                    log: logger,
+                    token: CancellationToken.None)));
+
+            // Find the latest version among each search metadata
+            NuGetVersion latestVersion = null;
+            foreach (var searchMetadata in searchMetadatas)
+            {
+                var potentialLatestVersion = versionRange.FindBestMatch(
+                    searchMetadata.Select(metadata => metadata.Identity.Version));
+                if (latestVersion == null ||
+                    (potentialLatestVersion != null && potentialLatestVersion.CompareTo(latestVersion) > 0))
+                {
+                    latestVersion = potentialLatestVersion;
+                }
+            }
 
             if (latestVersion == null)
             {

+ 1 - 1
eng/tools/BaselineGenerator/README.md

@@ -4,7 +4,7 @@ This tool is used to generate an MSBuild file which sets the "baseline" against
 
 ## Usage
 
-Add `--package-source {source}` to the commands below if the packages of interest are not all hosted on NuGet.org.
+Add `--package-sources {source}` to the commands below if the packages of interest are not all hosted on NuGet.org.
 
 ### Auto-update
 

+ 0 - 1
eng/tools/GenerateFiles/Directory.Build.props.in

@@ -1,7 +1,6 @@
 <Project>
   <PropertyGroup>
     <DefaultNetCoreTargetFramework>${DefaultNetCoreTargetFramework}</DefaultNetCoreTargetFramework>
-    <TargetFramework>${DefaultNetCoreTargetFramework}</TargetFramework>
     <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
   </PropertyGroup>
 </Project>

+ 68 - 19
eng/tools/GenerateFiles/Directory.Build.targets.in

@@ -2,43 +2,92 @@
   <PropertyGroup>
     <!-- Workaround while there is no SDK available that understands the TFM; suppress unsupported version errors. -->
     <NETCoreAppMaximumVersion>99.9</NETCoreAppMaximumVersion>
+
+    <UpdateAspNetCoreKnownFramework
+      Condition=" '$(UpdateAspNetCoreKnownFramework)' == '' ">true</UpdateAspNetCoreKnownFramework>
   </PropertyGroup>
 
+  <!-- Workaround when there is no vNext SDK available; copy known apphost/framework reference info from 5.0. -->
   <ItemGroup>
-    <!-- Workaround when there is no vNext SDK available; copy known apphost/framework reference info from 5.0. -->
     <KnownAppHostPack
       Include="@(KnownAppHostPack->WithMetadataValue('TargetFramework', 'netcoreapp5.0'))"
       TargetFramework="${KnownAppHostPackOrFrameworkReferenceTfm}"
-      Condition="@(KnownAppHostPack->Count()) != '0' AND !(@(KnownAppHostPack->AnyHaveMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}')))"
-      />
+      Condition="@(KnownAppHostPack->Count()) != '0' AND
+        !(@(KnownAppHostPack->AnyHaveMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}')))" />
     <KnownFrameworkReference
       Include="@(KnownFrameworkReference->WithMetadataValue('TargetFramework', 'netcoreapp5.0'))"
       TargetFramework="${KnownAppHostPackOrFrameworkReferenceTfm}"
-      Condition="@(KnownFrameworkReference->Count()) != '0' AND !(@(KnownFrameworkReference->AnyHaveMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}')))"
-      />
+      Condition="@(KnownFrameworkReference->Count()) != '0' AND
+        !(@(KnownFrameworkReference->AnyHaveMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}')))" />
   </ItemGroup>
 
   <ItemGroup>
-    <!-- Use the same NETCore shared framework as repo built against. -->
+    <!-- Use the same NETCore shared framework as repo built against except when building product code in servicing. -->
     <KnownFrameworkReference
-      Update="@(KnownFrameworkReference->WithMetadataValue('Identity', 'Microsoft.NETCore.App')->WithMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}'))"
-      DefaultRuntimeFrameworkVersion="${MicrosoftNETCoreAppRuntimeVersion}"
-      LatestRuntimeFrameworkVersion="${MicrosoftNETCoreAppRuntimeVersion}"
-      TargetingPackVersion="${MicrosoftNETCoreAppRefPackageVersion}" />
+        Update="@(KnownFrameworkReference->WithMetadataValue('Identity', 'Microsoft.NETCore.App')->WithMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}'))"
+        LatestRuntimeFrameworkVersion="${MicrosoftNETCoreAppRuntimeVersion}">
+      <!--
+        Change the default shared framework and targeting pack version only when _not_ servicing. Avoid bumping
+        version used in most projects. When servicing, projects can use $(TargetLatestRuntimePatch) to explicitly
+        control whether assemblies build against default (false) or latest (true). When that property is not set, SDK
+        uses default metadata in most cases but published apps e.g. tool projects (again, property not set) use latest.
+
+        !temporary! Also check $(TargetLatestRuntimePatch) here because these metadata changes otherwise increase the
+        minimum versions, making $(TargetLatestRuntimePatch) irrelevant. This helps to avoid problems with current
+        `[assembly: AssemblyVersion(...)]` changes in dotnet/runtime assemblies and our MSBuild tasks.
+      -->
+      <DefaultRuntimeFrameworkVersion Condition=" '$(IsServicingBuild)' != 'true' AND
+          '$(TargetLatestDotNetRuntime)' != 'false' ">${MicrosoftNETCoreAppRuntimeVersion}</DefaultRuntimeFrameworkVersion>
+      <TargetingPackVersion Condition=" '$(IsServicingBuild)' != 'true' AND
+          '$(TargetLatestDotNetRuntime)' != 'false' ">${MicrosoftNETCoreAppRefVersion}</TargetingPackVersion>
+    </KnownFrameworkReference>
 
-    <!-- Use the just-built ASP.NET Core shared framework. -->
+    <!-- Use the just-built ASP.NET Core shared framework if available except when building product code in servicing. -->
     <KnownFrameworkReference
-      Update="@(KnownFrameworkReference->WithMetadataValue('Identity', 'Microsoft.AspNetCore.App')->WithMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}'))"
-      DefaultRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppRuntimePackageVersion}"
-      LatestRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppRuntimePackageVersion}"
-      TargetingPackVersion="${MicrosoftAspNetCoreAppRefPackageVersion}"
-      RuntimePackRuntimeIdentifiers="${SupportedRuntimeIdentifiers}" />
-  </ItemGroup>
+        Update="@(KnownFrameworkReference->WithMetadataValue('Identity', 'Microsoft.AspNetCore.App')->WithMetadataValue('TargetFramework', '${KnownAppHostPackOrFrameworkReferenceTfm}'))"
+        Condition=" $(UpdateAspNetCoreKnownFramework) "
+        LatestRuntimeFrameworkVersion="${MicrosoftAspNetCoreAppRuntimeVersion}"
+        RuntimePackRuntimeIdentifiers="${SupportedRuntimeIdentifiers}">
+      <DefaultRuntimeFrameworkVersion
+          Condition=" '$(IsServicingBuild)' != 'true' ">${MicrosoftAspNetCoreAppRuntimeVersion}</DefaultRuntimeFrameworkVersion>
+      <TargetingPackVersion
+          Condition=" '$(IsServicingBuild)' != 'true' ">${MicrosoftAspNetCoreAppRefVersion}</TargetingPackVersion>
+    </KnownFrameworkReference>
 
-  <ItemGroup Condition="$(BuildingTestAppsIndependently) == 'false'">
     <PackageReference Include="Microsoft.Net.Compilers.Toolset"
-      Version="${MicrosoftNetCompilersToolsetPackageVersion}"
+      Version="${MicrosoftNetCompilersToolsetVersion}"
       PrivateAssets="all"
       IsImplicitlyDefined="true" />
   </ItemGroup>
+
+  <!-- Warn if the "just-built" ASP.NET Core shared framework does not exist. -->
+  <Target Name="WarnAboutMissingSharedFramework"
+      BeforeTargets="Restore;Build;Rebuild;RunTests;Test;VSTest;Pack"
+      Condition=" $(UpdateAspNetCoreKnownFramework) ">
+    <PropertyGroup>
+      <!--
+        Property (already normalized) from Arcade SDK's RepoLayout.props. This covers all projects using the
+        Arcade SDK. Ignore $(LocalDotNetRoot) because that is set in root Directory.Build.props (where Arcade SDK
+        is imported) and therefore doesn't cover additional projects.
+      -->
+      <_DotNetRoot Condition=" '$(DotNetRoot)' != '' ">$(DotNetRoot)</_DotNetRoot>
+      <!--
+        Environment variable from eng/common/tools.ps1 scripts. This covers tests and assets that do not use the
+        Arcade SDK but are run from our build.* scripts.
+      -->
+      <_DotNetRoot Condition=" '$(_DotNetRoot)' == '' AND
+          '$(DOTNET_INSTALL_DIR)' != '' ">$([MSBuild]::NormalizeDirectory('$(DOTNET_INSTALL_DIR)'))</_DotNetRoot>
+      <!--
+        Environment variable from root activate.* and Helix runtest.* scripts. This covers tests and assets on
+        Helix agents and when run locally using 'msbuild' after activation.
+      -->
+      <_DotNetRoot Condition=" '$(_DotNetRoot)' == '' AND
+          '$(DOTNET_ROOT)' != '' ">$([MSBuild]::NormalizeDirectory('$(DOTNET_ROOT)'))</_DotNetRoot>
+    </PropertyGroup>
+
+    <Error Text="Unable to determine dotnet root location." Condition=" '$(_DotNetRoot)' == '' " />
+    <Error Text="Dotnet root location '$(_DotNetRoot)' does not exist." Condition=" !EXISTS('$(_DotNetRoot)') " />
+    <Warning Text="Requested Microsoft.AspNetCore.App v${MicrosoftAspNetCoreAppRuntimeVersion} does not exist."
+        Condition=" !EXISTS('$(_DotNetRoot)shared\Microsoft.AspNetCore.App\${MicrosoftAspNetCoreAppRuntimeVersion}') " />
+  </Target>
 </Project>

+ 6 - 5
eng/tools/GenerateFiles/GenerateFiles.csproj

@@ -1,6 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+    <!-- Use fixed version instead of $(DefaultNetCoreTargetFramework) to avoid needing workarounds set up here. -->
+    <TargetFramework>net5.0</TargetFramework>
   </PropertyGroup>
 
   <!-- Update artifacts/bin/GenerateFiles/Directory.Build.* files. -->
@@ -9,11 +10,11 @@
       <_TemplateProperties>
         DefaultNetCoreTargetFramework=$(DefaultNetCoreTargetFramework);
         KnownAppHostPackOrFrameworkReferenceTfm=$(KnownAppHostPackOrFrameworkReferenceTfm);
-        MicrosoftAspNetCoreAppRefPackageVersion=$(TargetingPackVersion);
-        MicrosoftAspNetCoreAppRuntimePackageVersion=$(SharedFxVersion);
-        MicrosoftNETCoreAppRefPackageVersion=$(MicrosoftNETCoreAppRefPackageVersion);
+        MicrosoftAspNetCoreAppRefVersion=$(TargetingPackVersion);
+        MicrosoftAspNetCoreAppRuntimeVersion=$(SharedFxVersion);
+        MicrosoftNETCoreAppRefVersion=$(MicrosoftNETCoreAppRefVersion);
         MicrosoftNETCoreAppRuntimeVersion=$(MicrosoftNETCoreAppRuntimeVersion);
-        MicrosoftNetCompilersToolsetPackageVersion=$(MicrosoftNetCompilersToolsetPackageVersion);
+        MicrosoftNetCompilersToolsetVersion=$(MicrosoftNetCompilersToolsetVersion);
         SupportedRuntimeIdentifiers=$(SupportedRuntimeIdentifiers.Trim())
       </_TemplateProperties>
     </PropertyGroup>

+ 4 - 0
eng/tools/RepoTasks/.editorconfig

@@ -0,0 +1,4 @@
+[*.cs]
+dotnet_diagnostic.CA1307.severity = none
+dotnet_diagnostic.CA1308.severity = none
+dotnet_diagnostic.CA1309.severity = none

+ 2 - 0
eng/tools/RepoTasks/RepoTasks.csproj

@@ -8,6 +8,8 @@
     <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
     <!-- Need to build this project in source build -->
     <ExcludeFromSourceBuild>false</ExcludeFromSourceBuild>
+    <!-- Temporarily target the previous runtime until https://github.com/dotnet/sdk/pull/14574 is merged. -->
+    <TargetLatestDotNetRuntime>false</TargetLatestDotNetRuntime>
     <!-- No need to track public APIs of these MSBuild tasks. -->
     <AddPublicApiAnalyzers>false</AddPublicApiAnalyzers>
   </PropertyGroup>

+ 1 - 1
eng/tools/RepoTasks/RepoTasks.tasks

@@ -1,6 +1,6 @@
 <Project>
   <PropertyGroup>
-    <_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' == 'core'">net5.0</_RepoTaskAssemblyFolder>
+    <_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' == 'core'">net6.0</_RepoTaskAssemblyFolder>
     <_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' != 'core'">net472</_RepoTaskAssemblyFolder>
     <_RepoTaskAssembly>$(ArtifactsBinDir)RepoTasks\Release\$(_RepoTaskAssemblyFolder)\RepoTasks.dll</_RepoTaskAssembly>
   </PropertyGroup>

+ 7 - 7
global.json

@@ -1,16 +1,16 @@
 {
   "sdk": {
-    "version": "5.0.101"
+    "version": "6.0.100-alpha.1.20523.3"
   },
   "tools": {
-    "dotnet": "5.0.101",
+    "dotnet": "6.0.100-alpha.1.20523.3",
     "runtimes": {
       "dotnet/x64": [
         "2.1.23",
-        "$(MicrosoftNETCoreAppInternalPackageVersion)"
+        "$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
       ],
       "dotnet/x86": [
-        "$(MicrosoftNETCoreAppInternalPackageVersion)"
+        "$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
       ],
       "aspnetcore/x64": [
         "3.1.10"
@@ -29,8 +29,8 @@
     "xcopy-msbuild": "16.5.0-alpha"
   },
   "msbuild-sdks": {
-    "Yarn.MSBuild": "1.15.2",
-    "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20580.4",
-    "Microsoft.DotNet.Helix.Sdk": "5.0.0-beta.20580.4"
+    "Yarn.MSBuild": "1.22.10",
+    "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.20610.4",
+    "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.20610.4"
   }
 }

+ 2 - 2
src/Analyzers/Analyzers/test/AnalyzerTestBase.cs

@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Analyzers
     {
         public TestSource Read(string source)
         {
-            if (!source.EndsWith(".cs"))
+            if (!source.EndsWith(".cs", StringComparison.Ordinal))
             {
                 source = source + ".cs";
             }
@@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Analyzers
 
         public Project CreateProject(string source)
         {
-            if (!source.EndsWith(".cs"))
+            if (!source.EndsWith(".cs", StringComparison.Ordinal))
             {
                 source = source + ".cs";
             }

+ 1 - 1
src/Antiforgery/src/Internal/DefaultAntiforgery.cs

@@ -400,7 +400,7 @@ namespace Microsoft.AspNetCore.Antiforgery
             var pragmaHeader = response.Headers[HeaderNames.Pragma];
             if (!logWarning
                 && !string.IsNullOrEmpty(pragmaHeader)
-                && string.Compare(pragmaHeader, "no-cache", ignoreCase: true) != 0)
+                && !string.Equals(pragmaHeader, "no-cache", StringComparison.OrdinalIgnoreCase))
             {
                 logWarning = true;
             }

+ 3 - 3
src/Antiforgery/test/DefaultAntiforgeryTest.cs

@@ -1186,7 +1186,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
             var testSink = new TestSink();
             var loggerFactory = new Mock<ILoggerFactory>();
             loggerFactory
-                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName))
+                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName!))
                 .Returns(new TestLogger("test logger", testSink, enabled: true));
             var services = new ServiceCollection();
             services.AddSingleton(loggerFactory.Object);
@@ -1224,7 +1224,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
             var testSink = new TestSink();
             var loggerFactory = new Mock<ILoggerFactory>();
             loggerFactory
-                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName))
+                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName!))
                 .Returns(new TestLogger("test logger", testSink, enabled: true));
             var services = new ServiceCollection();
             services.AddSingleton(loggerFactory.Object);
@@ -1258,7 +1258,7 @@ namespace Microsoft.AspNetCore.Antiforgery.Internal
             var testSink = new TestSink();
             var loggerFactory = new Mock<ILoggerFactory>();
             loggerFactory
-                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName))
+                .Setup(lf => lf.CreateLogger(typeof(DefaultAntiforgery).FullName!))
                 .Returns(new TestLogger("test logger", testSink, enabled: true));
             var services = new ServiceCollection();
             services.AddSingleton(loggerFactory.Object);

+ 11 - 0
src/Caching/Caching.slnf

@@ -0,0 +1,11 @@
+{
+  "solution": {
+    "path": "..\\..\\AspNetCore.sln",
+    "projects": [
+      "src\\Caching\\SqlServer\\src\\Microsoft.Extensions.Caching.SqlServer.csproj",
+      "src\\Caching\\SqlServer\\test\\Microsoft.Extensions.Caching.SqlServer.Tests.csproj",
+      "src\\Caching\\StackExchangeRedis\\src\\Microsoft.Extensions.Caching.StackExchangeRedis.csproj",
+      "src\\Caching\\StackExchangeRedis\\test\\Microsoft.Extensions.Caching.StackExchangeRedis.Tests.csproj",
+    ]
+  }
+}

+ 21 - 0
src/Caching/README.md

@@ -0,0 +1,21 @@
+# Caching
+
+This area contains distributed cache implementations for Microsoft SQL Server and Redis. See documentation at <https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests#use-polly-based-handlers>.
+
+## Description
+
+These packages are not part of the ASP.NET Core shared framework but are shipped as an individual package. These packages have a third party dependencies on Polly and Polly.Extensions.Http.
+
+## Development Setup
+
+### Build
+
+To build this specific project from source, follow the instructions [on building a subset of the code](../../docs/BuildFromSource.md#building-a-subset-of-the-code).
+
+### Test
+
+To run the tests for this project, [run the tests on the command line](../../docs/BuildFromSource.md#running-tests-on-command-line) in this directory.
+
+## More Information
+
+For more information, see the [ASP.NET Core README](../../README.md).

+ 25 - 0
src/Caching/SqlServer/src/Columns.cs

@@ -0,0 +1,25 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal static class Columns
+    {
+        public static class Names
+        {
+            public const string CacheItemId = "Id";
+            public const string CacheItemValue = "Value";
+            public const string ExpiresAtTime = "ExpiresAtTime";
+            public const string SlidingExpirationInSeconds = "SlidingExpirationInSeconds";
+            public const string AbsoluteExpiration = "AbsoluteExpiration";
+        }
+
+        public static class Indexes
+        {
+            // The value of the following index positions is dependent on how the SQL queries
+            // are selecting the columns.
+            public const int CacheItemValueIndex = 0;
+        }
+    }
+}

+ 327 - 0
src/Caching/SqlServer/src/DatabaseOperations.cs

@@ -0,0 +1,327 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Data;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Data.SqlClient;
+using Microsoft.Extensions.Caching.Distributed;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal class DatabaseOperations : IDatabaseOperations
+    {
+        /// <summary>
+        /// Since there is no specific exception type representing a 'duplicate key' error, we are relying on
+        /// the following message number which represents the following text in Microsoft SQL Server database.
+        ///     "Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.
+        ///     The duplicate key value is %ls."
+        /// You can find the list of system messages by executing the following query:
+        /// "SELECT * FROM sys.messages WHERE [text] LIKE '%duplicate%'"
+        /// </summary>
+        private const int DuplicateKeyErrorId = 2627;
+
+        protected const string GetTableSchemaErrorText =
+            "Could not retrieve information of table with schema '{0}' and " +
+            "name '{1}'. Make sure you have the table setup and try again. " +
+            "Connection string: {2}";
+
+        public DatabaseOperations(
+            string connectionString, string schemaName, string tableName, ISystemClock systemClock)
+        {
+            ConnectionString = connectionString;
+            SchemaName = schemaName;
+            TableName = tableName;
+            SystemClock = systemClock;
+            SqlQueries = new SqlQueries(schemaName, tableName);
+        }
+
+        protected SqlQueries SqlQueries { get; }
+
+        protected string ConnectionString { get; }
+
+        protected string SchemaName { get; }
+
+        protected string TableName { get; }
+
+        protected ISystemClock SystemClock { get; }
+
+        public void DeleteCacheItem(string key)
+        {
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var command = new SqlCommand(SqlQueries.DeleteCacheItem, connection))
+            {
+                command.Parameters.AddCacheItemId(key);
+
+                connection.Open();
+
+                command.ExecuteNonQuery();
+            }
+        }
+
+        public async Task DeleteCacheItemAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var command = new SqlCommand(SqlQueries.DeleteCacheItem, connection))
+            {
+                command.Parameters.AddCacheItemId(key);
+
+                await connection.OpenAsync(token).ConfigureAwait(false);
+
+                await command.ExecuteNonQueryAsync(token).ConfigureAwait(false);
+            }
+        }
+
+        public virtual byte[] GetCacheItem(string key)
+        {
+            return GetCacheItem(key, includeValue: true);
+        }
+
+        public virtual async Task<byte[]> GetCacheItemAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            return await GetCacheItemAsync(key, includeValue: true, token: token).ConfigureAwait(false);
+        }
+
+        public void RefreshCacheItem(string key)
+        {
+            GetCacheItem(key, includeValue: false);
+        }
+
+        public async Task RefreshCacheItemAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            await GetCacheItemAsync(key, includeValue: false, token:token).ConfigureAwait(false);
+        }
+
+        public virtual void DeleteExpiredCacheItems()
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var command = new SqlCommand(SqlQueries.DeleteExpiredCacheItems, connection))
+            {
+                command.Parameters.AddWithValue("UtcNow", SqlDbType.DateTimeOffset, utcNow);
+
+                connection.Open();
+
+                var effectedRowCount = command.ExecuteNonQuery();
+            }
+        }
+
+        public virtual void SetCacheItem(string key, byte[] value, DistributedCacheEntryOptions options)
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            var absoluteExpiration = GetAbsoluteExpiration(utcNow, options);
+            ValidateOptions(options.SlidingExpiration, absoluteExpiration);
+
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var upsertCommand = new SqlCommand(SqlQueries.SetCacheItem, connection))
+            {
+                upsertCommand.Parameters
+                    .AddCacheItemId(key)
+                    .AddCacheItemValue(value)
+                    .AddSlidingExpirationInSeconds(options.SlidingExpiration)
+                    .AddAbsoluteExpiration(absoluteExpiration)
+                    .AddWithValue("UtcNow", SqlDbType.DateTimeOffset, utcNow);
+
+                connection.Open();
+
+                try
+                {
+                    upsertCommand.ExecuteNonQuery();
+                }
+                catch (SqlException ex)
+                {
+                    if (IsDuplicateKeyException(ex))
+                    {
+                        // There is a possibility that multiple requests can try to add the same item to the cache, in
+                        // which case we receive a 'duplicate key' exception on the primary key column.
+                    }
+                    else
+                    {
+                        throw;
+                    }
+                }
+            }
+        }
+
+        public virtual async Task SetCacheItemAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            var utcNow = SystemClock.UtcNow;
+
+            var absoluteExpiration = GetAbsoluteExpiration(utcNow, options);
+            ValidateOptions(options.SlidingExpiration, absoluteExpiration);
+
+            using (var connection = new SqlConnection(ConnectionString))
+            using(var upsertCommand = new SqlCommand(SqlQueries.SetCacheItem, connection))
+            {
+                upsertCommand.Parameters
+                    .AddCacheItemId(key)
+                    .AddCacheItemValue(value)
+                    .AddSlidingExpirationInSeconds(options.SlidingExpiration)
+                    .AddAbsoluteExpiration(absoluteExpiration)
+                    .AddWithValue("UtcNow", SqlDbType.DateTimeOffset, utcNow);
+
+                await connection.OpenAsync(token).ConfigureAwait(false);
+
+                try
+                {
+                    await upsertCommand.ExecuteNonQueryAsync(token).ConfigureAwait(false);
+                }
+                catch (SqlException ex)
+                {
+                    if (IsDuplicateKeyException(ex))
+                    {
+                        // There is a possibility that multiple requests can try to add the same item to the cache, in
+                        // which case we receive a 'duplicate key' exception on the primary key column.
+                    }
+                    else
+                    {
+                        throw;
+                    }
+                }
+            }
+        }
+
+        protected virtual byte[] GetCacheItem(string key, bool includeValue)
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            string query;
+            if (includeValue)
+            {
+                query = SqlQueries.GetCacheItem;
+            }
+            else
+            {
+                query = SqlQueries.GetCacheItemWithoutValue;
+            }
+
+            byte[] value = null;
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var command = new SqlCommand(query, connection))
+            {
+                command.Parameters
+                    .AddCacheItemId(key)
+                    .AddWithValue("UtcNow", SqlDbType.DateTimeOffset, utcNow);
+
+                connection.Open();
+
+                using (var reader = command.ExecuteReader(
+                    CommandBehavior.SequentialAccess | CommandBehavior.SingleRow | CommandBehavior.SingleResult))
+                {
+                    if (reader.Read())
+                    {
+                        if (includeValue)
+                        {
+                            value = reader.GetFieldValue<byte[]>(Columns.Indexes.CacheItemValueIndex);
+                        }
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+            }
+
+            return value;
+        }
+
+        protected virtual async Task<byte[]> GetCacheItemAsync(string key, bool includeValue, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            var utcNow = SystemClock.UtcNow;
+
+            string query;
+            if (includeValue)
+            {
+                query = SqlQueries.GetCacheItem;
+            }
+            else
+            {
+                query = SqlQueries.GetCacheItemWithoutValue;
+            }
+
+            byte[] value = null;
+            using (var connection = new SqlConnection(ConnectionString))
+            using (var command = new SqlCommand(query, connection))
+            {
+                command.Parameters
+                    .AddCacheItemId(key)
+                    .AddWithValue("UtcNow", SqlDbType.DateTimeOffset, utcNow);
+
+                await connection.OpenAsync(token).ConfigureAwait(false);
+
+                using (var reader = await command.ExecuteReaderAsync(
+                    CommandBehavior.SequentialAccess | CommandBehavior.SingleRow | CommandBehavior.SingleResult,
+                    token).ConfigureAwait(false))
+                {
+                    if (await reader.ReadAsync(token).ConfigureAwait(false))
+                    {
+                        if (includeValue)
+                        {
+                            value = await reader.GetFieldValueAsync<byte[]>(Columns.Indexes.CacheItemValueIndex, token).ConfigureAwait(false);
+                        }
+                    }
+                    else
+                    {
+                        return null;
+                    }
+                }
+            }
+
+            return value;
+        }
+
+        protected bool IsDuplicateKeyException(SqlException ex)
+        {
+            if (ex.Errors != null)
+            {
+                return ex.Errors.Cast<SqlError>().Any(error => error.Number == DuplicateKeyErrorId);
+            }
+            return false;
+        }
+
+        protected DateTimeOffset? GetAbsoluteExpiration(DateTimeOffset utcNow, DistributedCacheEntryOptions options)
+        {
+            // calculate absolute expiration
+            DateTimeOffset? absoluteExpiration = null;
+            if (options.AbsoluteExpirationRelativeToNow.HasValue)
+            {
+                absoluteExpiration = utcNow.Add(options.AbsoluteExpirationRelativeToNow.Value);
+            }
+            else if (options.AbsoluteExpiration.HasValue)
+            {
+                if (options.AbsoluteExpiration.Value <= utcNow)
+                {
+                    throw new InvalidOperationException("The absolute expiration value must be in the future.");
+                }
+
+                absoluteExpiration = options.AbsoluteExpiration.Value;
+            }
+            return absoluteExpiration;
+        }
+
+        protected void ValidateOptions(TimeSpan? slidingExpiration, DateTimeOffset? absoluteExpiration)
+        {
+            if (!slidingExpiration.HasValue && !absoluteExpiration.HasValue)
+            {
+                throw new InvalidOperationException("Either absolute or sliding expiration needs " +
+                    "to be provided.");
+            }
+        }
+    }
+}

+ 31 - 0
src/Caching/SqlServer/src/IDatabaseOperations.cs

@@ -0,0 +1,31 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Caching.Distributed;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal interface IDatabaseOperations
+    {
+        byte[] GetCacheItem(string key);
+
+        Task<byte[]> GetCacheItemAsync(string key, CancellationToken token = default(CancellationToken));
+
+        void RefreshCacheItem(string key);
+
+        Task RefreshCacheItemAsync(string key, CancellationToken token = default(CancellationToken));
+
+        void DeleteCacheItem(string key);
+
+        Task DeleteCacheItemAsync(string key, CancellationToken token = default(CancellationToken));
+
+        void SetCacheItem(string key, byte[] value, DistributedCacheEntryOptions options);
+
+        Task SetCacheItemAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken));
+
+        void DeleteExpiredCacheItems();
+    }
+}

+ 25 - 0
src/Caching/SqlServer/src/Microsoft.Extensions.Caching.SqlServer.csproj

@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <Description>Distributed cache implementation of Microsoft.Extensions.Caching.Distributed.IDistributedCache using Microsoft SQL Server.</Description>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <NoWarn>$(NoWarn);CS1591</NoWarn>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <PackageTags>cache;distributedcache;sqlserver</PackageTags>
+    <ExcludeFromSourceBuild>true</ExcludeFromSourceBuild>
+    <NoWarn>$(NoWarn);PKG0001</NoWarn>
+    <IsPackable>true</IsPackable>
+    <IsShipping>true</IsShipping>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <InternalsVisibleTo Include="Microsoft.Extensions.Caching.SqlServer.Tests" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Reference Include="Microsoft.Extensions.Caching.Abstractions" />
+    <Reference Include="Microsoft.Extensions.Options" />
+    <Reference Include="Microsoft.Data.SqlClient" />
+  </ItemGroup>
+
+</Project>

+ 204 - 0
src/Caching/SqlServer/src/MonoDatabaseOperations.cs

@@ -0,0 +1,204 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Data;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Data.SqlClient;
+using Microsoft.Extensions.Caching.Distributed;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal class MonoDatabaseOperations : DatabaseOperations
+    {
+        public MonoDatabaseOperations(
+            string connectionString, string schemaName, string tableName, ISystemClock systemClock)
+            : base(connectionString, schemaName, tableName, systemClock)
+        {
+        }
+
+        protected override byte[] GetCacheItem(string key, bool includeValue)
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            string query;
+            if (includeValue)
+            {
+                query = SqlQueries.GetCacheItem;
+            }
+            else
+            {
+                query = SqlQueries.GetCacheItemWithoutValue;
+            }
+
+            byte[] value = null;
+            using (var connection = new SqlConnection(ConnectionString))
+            {
+                var command = new SqlCommand(query, connection);
+                command.Parameters
+                    .AddCacheItemId(key)
+                    .AddWithValue("UtcNow", SqlDbType.DateTime, utcNow.UtcDateTime);
+
+                connection.Open();
+
+                var reader = command.ExecuteReader(CommandBehavior.SingleRow | CommandBehavior.SingleResult);
+
+                if (reader.Read())
+                {
+                    if (includeValue)
+                    {
+                        value = (byte[])reader[Columns.Indexes.CacheItemValueIndex];
+                    }
+                }
+                else
+                {
+                    return null;
+                }
+            }
+
+            return value;
+        }
+
+        protected override async Task<byte[]> GetCacheItemAsync(string key, bool includeValue, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            var utcNow = SystemClock.UtcNow;
+
+            string query;
+            if (includeValue)
+            {
+                query = SqlQueries.GetCacheItem;
+            }
+            else
+            {
+                query = SqlQueries.GetCacheItemWithoutValue;
+            }
+
+            byte[] value = null;
+            using (var connection = new SqlConnection(ConnectionString))
+            {
+                var command = new SqlCommand(query, connection);
+                command.Parameters
+                    .AddCacheItemId(key)
+                    .AddWithValue("UtcNow", SqlDbType.DateTime, utcNow.UtcDateTime);
+
+                await connection.OpenAsync(token).ConfigureAwait(false);
+
+                var reader = await command.ExecuteReaderAsync(
+                    CommandBehavior.SingleRow | CommandBehavior.SingleResult,
+                    token).ConfigureAwait(false);
+
+                if (await reader.ReadAsync(token).ConfigureAwait(false))
+                {
+                    if (includeValue)
+                    {
+                        value = (byte[])reader[Columns.Indexes.CacheItemValueIndex];
+                    }
+                }
+                else
+                {
+                    return null;
+                }
+            }
+
+            return value;
+        }
+
+        public override void SetCacheItem(string key, byte[] value, DistributedCacheEntryOptions options)
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            var absoluteExpiration = GetAbsoluteExpiration(utcNow, options);
+            ValidateOptions(options.SlidingExpiration, absoluteExpiration);
+
+            using (var connection = new SqlConnection(ConnectionString))
+            {
+                var upsertCommand = new SqlCommand(SqlQueries.SetCacheItem, connection);
+                upsertCommand.Parameters
+                    .AddCacheItemId(key)
+                    .AddCacheItemValue(value)
+                    .AddSlidingExpirationInSeconds(options.SlidingExpiration)
+                    .AddAbsoluteExpirationMono(absoluteExpiration)
+                    .AddWithValue("UtcNow", SqlDbType.DateTime, utcNow.UtcDateTime);
+
+                connection.Open();
+
+                try
+                {
+                    upsertCommand.ExecuteNonQuery();
+                }
+                catch (SqlException ex)
+                {
+                    if (IsDuplicateKeyException(ex))
+                    {
+                        // There is a possibility that multiple requests can try to add the same item to the cache, in
+                        // which case we receive a 'duplicate key' exception on the primary key column.
+                    }
+                    else
+                    {
+                        throw;
+                    }
+                }
+            }
+        }
+
+        public override async Task SetCacheItemAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
+        {
+            token.ThrowIfCancellationRequested();
+
+            var utcNow = SystemClock.UtcNow;
+
+            var absoluteExpiration = GetAbsoluteExpiration(utcNow, options);
+            ValidateOptions(options.SlidingExpiration, absoluteExpiration);
+
+            using (var connection = new SqlConnection(ConnectionString))
+            {
+                var upsertCommand = new SqlCommand(SqlQueries.SetCacheItem, connection);
+                upsertCommand.Parameters
+                    .AddCacheItemId(key)
+                    .AddCacheItemValue(value)
+                    .AddSlidingExpirationInSeconds(options.SlidingExpiration)
+                    .AddAbsoluteExpirationMono(absoluteExpiration)
+                    .AddWithValue("UtcNow", SqlDbType.DateTime, utcNow.UtcDateTime);
+
+                await connection.OpenAsync(token).ConfigureAwait(false);
+
+                try
+                {
+                    await upsertCommand.ExecuteNonQueryAsync(token).ConfigureAwait(false);
+                }
+                catch (SqlException ex)
+                {
+                    if (IsDuplicateKeyException(ex))
+                    {
+                        // There is a possibility that multiple requests can try to add the same item to the cache, in
+                        // which case we receive a 'duplicate key' exception on the primary key column.
+                    }
+                    else
+                    {
+                        throw;
+                    }
+                }
+            }
+        }
+
+        public override void DeleteExpiredCacheItems()
+        {
+            var utcNow = SystemClock.UtcNow;
+
+            using (var connection = new SqlConnection(ConnectionString))
+            {
+                var command = new SqlCommand(SqlQueries.DeleteExpiredCacheItems, connection);
+                command.Parameters.AddWithValue("UtcNow", SqlDbType.DateTime, utcNow.UtcDateTime);
+
+                connection.Open();
+
+                var effectedRowCount = command.ExecuteNonQuery();
+            }
+        }
+    }
+}

+ 46 - 0
src/Caching/SqlServer/src/MonoSqlParameterCollectionExtensions.cs

@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Data;
+using Microsoft.Data.SqlClient;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    // Since Mono currently does not have support for DateTimeOffset, we convert the time to UtcDateTime.
+    // Even though the database column is of type 'datetimeoffset', we can store the UtcDateTime, in which case
+    // the zone is set as 00:00. If you look at the below examples, DateTimeOffset.UtcNow
+    // and DateTimeOffset.UtcDateTime are almost the same.
+    //
+    // Examples:
+    // DateTimeOffset.Now:          6/29/2015 1:20:40 PM - 07:00
+    // DateTimeOffset.UtcNow:       6/29/2015 8:20:40 PM + 00:00
+    // DateTimeOffset.UtcDateTime:  6/29/2015 8:20:40 PM
+    internal static class MonoSqlParameterCollectionExtensions
+    {
+        public static SqlParameterCollection AddExpiresAtTimeMono(
+            this SqlParameterCollection parameters,
+            DateTimeOffset utcTime)
+        {
+            return parameters.AddWithValue(Columns.Names.ExpiresAtTime, SqlDbType.DateTime, utcTime.UtcDateTime);
+        }
+
+
+        public static SqlParameterCollection AddAbsoluteExpirationMono(
+                    this SqlParameterCollection parameters,
+                    DateTimeOffset? utcTime)
+        {
+            if (utcTime.HasValue)
+            {
+                return parameters.AddWithValue(
+                    Columns.Names.AbsoluteExpiration, SqlDbType.DateTime, utcTime.Value.UtcDateTime);
+            }
+            else
+            {
+                return parameters.AddWithValue(
+                Columns.Names.AbsoluteExpiration, SqlDbType.DateTime, DBNull.Value);
+            }
+        }
+    }
+}

+ 21 - 0
src/Caching/SqlServer/src/PlatformHelper.cs

@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal static class PlatformHelper
+    {
+        private static Lazy<bool> _isMono = new Lazy<bool>(() => Type.GetType("Mono.Runtime") != null);
+
+        public static bool IsMono
+        {
+            get
+            {
+                return _isMono.Value;
+            }
+        }
+    }
+}

+ 27 - 0
src/Caching/SqlServer/src/PublicAPI.Shipped.txt

@@ -0,0 +1,27 @@
+#nullable enable
+Microsoft.Extensions.Caching.SqlServer.SqlServerCache
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.DefaultSlidingExpiration.get -> System.TimeSpan
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.DefaultSlidingExpiration.set -> void
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.ExpiredItemsDeletionInterval.get -> System.TimeSpan?
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.ExpiredItemsDeletionInterval.set -> void
+Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.SqlServerCacheOptions() -> void
+Microsoft.Extensions.DependencyInjection.SqlServerCachingServicesExtensions
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.Get(string key) -> byte[]
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.GetAsync(string key, System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<byte[]>
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.Refresh(string key) -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.RefreshAsync(string key, System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.Remove(string key) -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.RemoveAsync(string key, System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.Set(string key, byte[] value, Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions options) -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.SetAsync(string key, byte[] value, Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions options, System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCache.SqlServerCache(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions> options) -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.ConnectionString.get -> string
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.ConnectionString.set -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.SchemaName.get -> string
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.SchemaName.set -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.SystemClock.get -> Microsoft.Extensions.Internal.ISystemClock
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.SystemClock.set -> void
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.TableName.get -> string
+~Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions.TableName.set -> void
+~static Microsoft.Extensions.DependencyInjection.SqlServerCachingServicesExtensions.AddDistributedSqlServerCache(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.Extensions.Caching.SqlServer.SqlServerCacheOptions> setupAction) -> Microsoft.Extensions.DependencyInjection.IServiceCollection

+ 1 - 0
src/Caching/SqlServer/src/PublicAPI.Unshipped.txt

@@ -0,0 +1 @@
+#nullable enable

+ 101 - 0
src/Caching/SqlServer/src/SqlParameterCollectionExtensions.cs

@@ -0,0 +1,101 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Data;
+using Microsoft.Data.SqlClient;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal static class SqlParameterCollectionExtensions
+    {
+        // For all values where the length is less than the below value, try setting the size of the
+        // parameter for better performance.
+        public const int DefaultValueColumnWidth = 8000;
+
+        // Maximum size of a primary key column is 900 bytes (898 bytes from the key + 2 additional bytes required by
+        // the Sql Server).
+        public const int CacheItemIdColumnWidth = 449;
+
+        public static SqlParameterCollection AddCacheItemId(this SqlParameterCollection parameters, string value)
+        {
+            return parameters.AddWithValue(Columns.Names.CacheItemId, SqlDbType.NVarChar, CacheItemIdColumnWidth, value);
+        }
+
+        public static SqlParameterCollection AddCacheItemValue(this SqlParameterCollection parameters, byte[] value)
+        {
+            if (value != null && value.Length < DefaultValueColumnWidth)
+            {
+                return parameters.AddWithValue(
+                    Columns.Names.CacheItemValue,
+                    SqlDbType.VarBinary,
+                    DefaultValueColumnWidth,
+                    value);
+            }
+            else
+            {
+                // do not mention the size
+                return parameters.AddWithValue(Columns.Names.CacheItemValue, SqlDbType.VarBinary, value);
+            }
+        }
+
+        public static SqlParameterCollection AddSlidingExpirationInSeconds(
+            this SqlParameterCollection parameters,
+            TimeSpan? value)
+        {
+            if (value.HasValue)
+            {
+                return parameters.AddWithValue(
+                    Columns.Names.SlidingExpirationInSeconds, SqlDbType.BigInt, value.Value.TotalSeconds);
+            }
+            else
+            {
+                return parameters.AddWithValue(Columns.Names.SlidingExpirationInSeconds, SqlDbType.BigInt, DBNull.Value);
+            }
+        }
+
+        public static SqlParameterCollection AddAbsoluteExpiration(
+            this SqlParameterCollection parameters,
+            DateTimeOffset? utcTime)
+        {
+            if (utcTime.HasValue)
+            {
+                return parameters.AddWithValue(
+                    Columns.Names.AbsoluteExpiration, SqlDbType.DateTimeOffset, utcTime.Value);
+            }
+            else
+            {
+                return parameters.AddWithValue(
+                    Columns.Names.AbsoluteExpiration, SqlDbType.DateTimeOffset, DBNull.Value);
+            }
+        }
+
+        public static SqlParameterCollection AddWithValue(
+            this SqlParameterCollection parameters,
+            string parameterName,
+            SqlDbType dbType,
+            object value)
+        {
+            var parameter = new SqlParameter(parameterName, dbType);
+            parameter.Value = value;
+            parameters.Add(parameter);
+            parameter.ResetSqlDbType();
+            return parameters;
+        }
+
+        public static SqlParameterCollection AddWithValue(
+            this SqlParameterCollection parameters,
+            string parameterName,
+            SqlDbType dbType,
+            int size,
+            object value)
+        {
+            var parameter = new SqlParameter(parameterName, dbType, size);
+            parameter.Value = value;
+            parameters.Add(parameter);
+            parameter.ResetSqlDbType();
+            return parameters;
+        }
+    }
+}

+ 97 - 0
src/Caching/SqlServer/src/SqlQueries.cs

@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Globalization;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    internal class SqlQueries
+    {
+        private const string TableInfoFormat =
+            "SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " +
+            "FROM INFORMATION_SCHEMA.TABLES " +
+            "WHERE TABLE_SCHEMA = '{0}' " +
+            "AND TABLE_NAME = '{1}'";
+
+        private const string UpdateCacheItemFormat =
+        "UPDATE {0} " +
+        "SET ExpiresAtTime = " +
+            "(CASE " +
+                "WHEN DATEDIFF(SECOND, @UtcNow, AbsoluteExpiration) <= SlidingExpirationInSeconds " +
+                "THEN AbsoluteExpiration " +
+                "ELSE " +
+                "DATEADD(SECOND, SlidingExpirationInSeconds, @UtcNow) " +
+            "END) " +
+        "WHERE Id = @Id " +
+        "AND @UtcNow <= ExpiresAtTime " +
+        "AND SlidingExpirationInSeconds IS NOT NULL " +
+        "AND (AbsoluteExpiration IS NULL OR AbsoluteExpiration <> ExpiresAtTime) ;";
+
+        private const string GetCacheItemFormat =
+            "SELECT Value " +
+            "FROM {0} WHERE Id = @Id AND @UtcNow <= ExpiresAtTime;";
+
+        private const string SetCacheItemFormat =
+            "DECLARE @ExpiresAtTime DATETIMEOFFSET; " +
+            "SET @ExpiresAtTime = " +
+            "(CASE " +
+                    "WHEN (@SlidingExpirationInSeconds IS NUll) " +
+                    "THEN @AbsoluteExpiration " +
+                    "ELSE " +
+                    "DATEADD(SECOND, Convert(bigint, @SlidingExpirationInSeconds), @UtcNow) " +
+            "END);" +
+            "UPDATE {0} SET Value = @Value, ExpiresAtTime = @ExpiresAtTime," +
+            "SlidingExpirationInSeconds = @SlidingExpirationInSeconds, AbsoluteExpiration = @AbsoluteExpiration " +
+            "WHERE Id = @Id " +
+            "IF (@@ROWCOUNT = 0) " +
+            "BEGIN " +
+                "INSERT INTO {0} " +
+                "(Id, Value, ExpiresAtTime, SlidingExpirationInSeconds, AbsoluteExpiration) " +
+                "VALUES (@Id, @Value, @ExpiresAtTime, @SlidingExpirationInSeconds, @AbsoluteExpiration); " +
+            "END ";
+
+        private const string DeleteCacheItemFormat = "DELETE FROM {0} WHERE Id = @Id";
+
+        public const string DeleteExpiredCacheItemsFormat = "DELETE FROM {0} WHERE @UtcNow > ExpiresAtTime";
+
+        public SqlQueries(string schemaName, string tableName)
+        {
+            var tableNameWithSchema = string.Format(
+                CultureInfo.InvariantCulture,
+                "{0}.{1}", DelimitIdentifier(schemaName), DelimitIdentifier(tableName));
+
+            // when retrieving an item, we do an UPDATE first and then a SELECT
+            GetCacheItem = string.Format(CultureInfo.InvariantCulture, UpdateCacheItemFormat + GetCacheItemFormat, tableNameWithSchema);
+            GetCacheItemWithoutValue = string.Format(CultureInfo.InvariantCulture, UpdateCacheItemFormat, tableNameWithSchema);
+            DeleteCacheItem = string.Format(CultureInfo.InvariantCulture, DeleteCacheItemFormat, tableNameWithSchema);
+            DeleteExpiredCacheItems = string.Format(CultureInfo.InvariantCulture, DeleteExpiredCacheItemsFormat, tableNameWithSchema);
+            SetCacheItem = string.Format(CultureInfo.InvariantCulture, SetCacheItemFormat, tableNameWithSchema);
+            TableInfo = string.Format(CultureInfo.InvariantCulture, TableInfoFormat, EscapeLiteral(schemaName), EscapeLiteral(tableName));
+        }
+
+        public string TableInfo { get; }
+
+        public string GetCacheItem { get; }
+
+        public string GetCacheItemWithoutValue { get; }
+
+        public string SetCacheItem { get; }
+
+        public string DeleteCacheItem { get; }
+
+        public string DeleteExpiredCacheItems { get; }
+
+        // From EF's SqlServerQuerySqlGenerator
+        private string DelimitIdentifier(string identifier)
+        {
+            return "[" + identifier.Replace("]", "]]") + "]";
+        }
+
+        private string EscapeLiteral(string literal)
+        {
+            return literal.Replace("'", "''");
+        }
+    }
+}

+ 260 - 0
src/Caching/SqlServer/src/SqlServerCache.cs

@@ -0,0 +1,260 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Caching.Distributed;
+using Microsoft.Extensions.Internal;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    /// <summary>
+    /// Distributed cache implementation using Microsoft SQL Server database.
+    /// </summary>
+    public class SqlServerCache : IDistributedCache
+    {
+        private static readonly TimeSpan MinimumExpiredItemsDeletionInterval = TimeSpan.FromMinutes(5);
+        private static readonly TimeSpan DefaultExpiredItemsDeletionInterval = TimeSpan.FromMinutes(30);
+
+        private readonly IDatabaseOperations _dbOperations;
+        private readonly ISystemClock _systemClock;
+        private readonly TimeSpan _expiredItemsDeletionInterval;
+        private DateTimeOffset _lastExpirationScan;
+        private readonly Action _deleteExpiredCachedItemsDelegate;
+        private readonly TimeSpan _defaultSlidingExpiration;
+        private readonly Object _mutex = new Object();
+
+        public SqlServerCache(IOptions<SqlServerCacheOptions> options)
+        {
+            var cacheOptions = options.Value;
+
+            if (string.IsNullOrEmpty(cacheOptions.ConnectionString))
+            {
+                throw new ArgumentException(
+                    $"{nameof(SqlServerCacheOptions.ConnectionString)} cannot be empty or null.");
+            }
+            if (string.IsNullOrEmpty(cacheOptions.SchemaName))
+            {
+                throw new ArgumentException(
+                    $"{nameof(SqlServerCacheOptions.SchemaName)} cannot be empty or null.");
+            }
+            if (string.IsNullOrEmpty(cacheOptions.TableName))
+            {
+                throw new ArgumentException(
+                    $"{nameof(SqlServerCacheOptions.TableName)} cannot be empty or null.");
+            }
+            if (cacheOptions.ExpiredItemsDeletionInterval.HasValue &&
+                cacheOptions.ExpiredItemsDeletionInterval.Value < MinimumExpiredItemsDeletionInterval)
+            {
+                throw new ArgumentException(
+                    $"{nameof(SqlServerCacheOptions.ExpiredItemsDeletionInterval)} cannot be less than the minimum " +
+                    $"value of {MinimumExpiredItemsDeletionInterval.TotalMinutes} minutes.");
+            }
+            if (cacheOptions.DefaultSlidingExpiration <= TimeSpan.Zero)
+            {
+                throw new ArgumentOutOfRangeException(
+                    nameof(cacheOptions.DefaultSlidingExpiration),
+                    cacheOptions.DefaultSlidingExpiration,
+                    "The sliding expiration value must be positive.");
+            }
+
+            _systemClock = cacheOptions.SystemClock ?? new SystemClock();
+            _expiredItemsDeletionInterval =
+                cacheOptions.ExpiredItemsDeletionInterval ?? DefaultExpiredItemsDeletionInterval;
+            _deleteExpiredCachedItemsDelegate = DeleteExpiredCacheItems;
+            _defaultSlidingExpiration = cacheOptions.DefaultSlidingExpiration;
+
+            // SqlClient library on Mono doesn't have support for DateTimeOffset and also
+            // it doesn't have support for apis like GetFieldValue, GetFieldValueAsync etc.
+            // So we detect the platform to perform things differently for Mono vs. non-Mono platforms.
+            if (PlatformHelper.IsMono)
+            {
+                _dbOperations = new MonoDatabaseOperations(
+                    cacheOptions.ConnectionString,
+                    cacheOptions.SchemaName,
+                    cacheOptions.TableName,
+                    _systemClock);
+            }
+            else
+            {
+                _dbOperations = new DatabaseOperations(
+                    cacheOptions.ConnectionString,
+                    cacheOptions.SchemaName,
+                    cacheOptions.TableName,
+                    _systemClock);
+            }
+        }
+
+        public byte[] Get(string key)
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            var value = _dbOperations.GetCacheItem(key);
+
+            ScanForExpiredItemsIfRequired();
+
+            return value;
+        }
+
+        public async Task<byte[]> GetAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            token.ThrowIfCancellationRequested();
+
+            var value = await _dbOperations.GetCacheItemAsync(key, token).ConfigureAwait(false);
+
+            ScanForExpiredItemsIfRequired();
+
+            return value;
+        }
+
+        public void Refresh(string key)
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            _dbOperations.RefreshCacheItem(key);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        public async Task RefreshAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            token.ThrowIfCancellationRequested();
+
+            await _dbOperations.RefreshCacheItemAsync(key, token).ConfigureAwait(false);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        public void Remove(string key)
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            _dbOperations.DeleteCacheItem(key);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        public async Task RemoveAsync(string key, CancellationToken token = default(CancellationToken))
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            token.ThrowIfCancellationRequested();
+
+            await _dbOperations.DeleteCacheItemAsync(key, token).ConfigureAwait(false);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        public void Set(string key, byte[] value, DistributedCacheEntryOptions options)
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            if (value == null)
+            {
+                throw new ArgumentNullException(nameof(value));
+            }
+
+            if (options == null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
+            GetOptions(ref options);
+
+            _dbOperations.SetCacheItem(key, value, options);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        public async Task SetAsync(
+            string key,
+            byte[] value,
+            DistributedCacheEntryOptions options,
+            CancellationToken token = default(CancellationToken))
+        {
+            if (key == null)
+            {
+                throw new ArgumentNullException(nameof(key));
+            }
+
+            if (value == null)
+            {
+                throw new ArgumentNullException(nameof(value));
+            }
+
+            if (options == null)
+            {
+                throw new ArgumentNullException(nameof(options));
+            }
+
+            token.ThrowIfCancellationRequested();
+
+            GetOptions(ref options);
+
+            await _dbOperations.SetCacheItemAsync(key, value, options, token).ConfigureAwait(false);
+
+            ScanForExpiredItemsIfRequired();
+        }
+
+        // Called by multiple actions to see how long it's been since we last checked for expired items.
+        // If sufficient time has elapsed then a scan is initiated on a background task.
+        private void ScanForExpiredItemsIfRequired()
+        {
+            lock(_mutex)
+            {
+                var utcNow = _systemClock.UtcNow;
+                if ((utcNow - _lastExpirationScan) > _expiredItemsDeletionInterval)
+                {
+                    _lastExpirationScan = utcNow;
+                    Task.Run(_deleteExpiredCachedItemsDelegate);
+                }
+            }
+        }
+
+        private void DeleteExpiredCacheItems()
+        {
+            _dbOperations.DeleteExpiredCacheItems();
+        }
+
+        private void GetOptions(ref DistributedCacheEntryOptions options)
+        {
+            if (!options.AbsoluteExpiration.HasValue
+                && !options.AbsoluteExpirationRelativeToNow.HasValue
+                && !options.SlidingExpiration.HasValue)
+            {
+                options = new DistributedCacheEntryOptions()
+                {
+                    SlidingExpiration = _defaultSlidingExpiration
+                };
+            }
+        }
+    }
+}

+ 55 - 0
src/Caching/SqlServer/src/SqlServerCacheOptions.cs

@@ -0,0 +1,55 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using Microsoft.Extensions.Internal;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Extensions.Caching.SqlServer
+{
+    /// <summary>
+    /// Configuration options for <see cref="SqlServerCache"/>.
+    /// </summary>
+    public class SqlServerCacheOptions : IOptions<SqlServerCacheOptions>
+    {
+        /// <summary>
+        /// An abstraction to represent the clock of a machine in order to enable unit testing.
+        /// </summary>
+        public ISystemClock SystemClock { get; set; }
+
+        /// <summary>
+        /// The periodic interval to scan and delete expired items in the cache. Default is 30 minutes.
+        /// </summary>
+        public TimeSpan? ExpiredItemsDeletionInterval { get; set; }
+
+        /// <summary>
+        /// The connection string to the database.
+        /// </summary>
+        public string ConnectionString { get; set; }
+
+        /// <summary>
+        /// The schema name of the table.
+        /// </summary>
+        public string SchemaName { get; set; }
+
+        /// <summary>
+        /// Name of the table where the cache items are stored.
+        /// </summary>
+        public string TableName { get; set; }
+
+        /// <summary>
+        /// The default sliding expiration set for a cache entry if neither Absolute or SlidingExpiration has been set explicitly.
+        /// By default, its 20 minutes.
+        /// </summary>
+        public TimeSpan DefaultSlidingExpiration { get; set; } = TimeSpan.FromMinutes(20);
+
+        SqlServerCacheOptions IOptions<SqlServerCacheOptions>.Value
+        {
+            get
+            {
+                return this;
+            }
+        }
+    }
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов