Summary
MSBuild's multi-threaded mode (-mt) runs all build nodes as threads inside a single process. Any task not marked with Microsoft.Build.Framework.MSBuildMultiThreadableTaskAttribute is routed to an out-of-proc sidecar TaskHost for isolation, so every invocation pays cross-process serialization of its inputs and outputs.
No task in this repository is currently annotated, so all ~136 Arcade tasks are marshalled out-of-proc in -mt builds. This measurably eats into the gains from -mt + MSBuild Server + node reuse.
Measured impact
A/B of the runtime inner repo build inside the dotnet/dotnet VMR (win-x64, same source SHA 2eebfbf, same SDK 11.0.100-rc.1.26420.103, MSBuild 18.11.0-1.26420.103). Command lines were identical except:
- A (baseline):
/nr:False, no -mt -> MSBuild Server was requested but not used for this build: node reuse is disabled
- B:
/nr:True -mt -> Reusing the running MSBuild Server node for this build
Wall time went 51.50 min -> 49.64 min, only 1.86 min (3.6%). Meanwhile:
| metric |
A (baseline) |
B (-mt+server+nodereuse) |
| TaskHost invocations |
849 |
14,125 (16.6x) |
| distinct caller processes |
8 |
1 (all nodes are threads) |
| total node-busy time |
13,622 s |
12,189 s (-10.5%) |
| effective parallelism (of 8 nodes) |
4.41x |
4.09x |
| sum of non-nesting task time |
4,026 s |
4,124 s (+98 s) |
Engine overhead genuinely dropped (MSBuild task inclusive 126,987s -> 106,276s), but ~100s of that was handed straight back as TaskHost marshalling. Arcade-owned tasks are the bulk of it:
| task |
A |
B |
ratio |
invocations |
ChooseBestP2PTargetFrameworkTask |
1.5 s |
17.6 s |
11.8x |
1,740 |
GetLicenseFilePath |
0.4 s |
15.0 s |
36x |
1,542 |
ChooseBestTargetFrameworksTask |
0.4 s |
12.6 s |
32x |
1,195 |
GeneratePackageReport |
1.7 s |
13.6 s |
8.0x |
11 |
ValidateLicense |
0.4 s |
10.8 s |
30x |
1,542 |
GetLastStablePackage |
0.1 s |
6.3 s |
61x |
130 |
GenerateResxSource |
1.6 s |
6.2 s |
3.8x |
606 |
GetMinimumNETStandard |
0.3 s |
3.0 s |
10.3x |
60 |
ApplyPreReleaseSuffix |
0.03 s |
2.5 s |
77x |
109 |
TranslateSource |
1.8 s |
3.1 s |
1.7x |
208 |
That is ~82 s of pure added overhead from 10 Arcade tasks in a single repo build, and it repeats for every repo in the VMR.
Proposed change
Audit each task and add [MSBuildMultiThreadableTask] where it is genuinely thread-safe.
Per MSBuildMultiThreadableTaskAttribute, a task qualifies only if it:
- does not modify global process state (env vars, current working directory, etc.), and
- does not depend on global process state, including relative path resolution.
Most of the P1 tasks above are pure item/string transforms, so they should qualify easily.
Implementation note
Arcade currently pins the MSBuild packages at 17.12.50 (eng/Version.Details.props, flowed from dotnet-msbuild), which predates the attribute. Step 1 is simply to flow up the MSBuild package versions to 18.x so MSBuildMultiThreadableTaskAttribute is available from Microsoft.Build.Framework directly:
<MicrosoftBuildPackageVersion>17.12.50</MicrosoftBuildPackageVersion>
<MicrosoftBuildFrameworkPackageVersion>17.12.50</MicrosoftBuildFrameworkPackageVersion>
<MicrosoftBuildTasksCorePackageVersion>17.12.50</MicrosoftBuildTasksCorePackageVersion>
<MicrosoftBuildUtilitiesCorePackageVersion>17.12.50</MicrosoftBuildUtilitiesCorePackageVersion>
The attribute is non-inheritable (Inherited = false), so it must be applied to each concrete task class - not to a shared base such as BuildTask / MSBuildTaskBase / XlfTask.
Task inventory
All concrete MSBuild task classes under src/ (excluding eng/common, abstract bases and test-only stubs). 136 tasks.
P1 - measured hot path (do these first)
P2 / P3 - remaining tasks by package
Microsoft.DotNet.Arcade.Sdk (15)
Microsoft.DotNet.Build.Tasks.Feed (12)
Microsoft.DotNet.Build.Tasks.FileCatalog (1)
Microsoft.DotNet.Build.Tasks.Installers (13)
Microsoft.DotNet.Build.Tasks.Packaging (27)
Microsoft.DotNet.Build.Tasks.Templating (1)
Microsoft.DotNet.Build.Tasks.VisualStudio (6)
Microsoft.DotNet.Build.Tasks.Workloads (4)
Microsoft.DotNet.CMake.Sdk (2)
Microsoft.DotNet.Deployment.Tasks.Links (2)
Microsoft.DotNet.GenAPI (1)
Microsoft.DotNet.GenFacades (3)
Microsoft.DotNet.Helix (16)
Microsoft.DotNet.NuGetRepack (2)
Microsoft.DotNet.PackageTesting (3)
Microsoft.DotNet.SharedFramework.Sdk (5)
Microsoft.DotNet.SignCheckTask (1)
Microsoft.DotNet.SignTool (1)
Microsoft.DotNet.SourceBuild (4)
Microsoft.DotNet.SwaggerGenerator (1)
Microsoft.DotNet.XliffTasks (6)
/cc @dotnet/dnceng
Summary
MSBuild's multi-threaded mode (
-mt) runs all build nodes as threads inside a single process. Any task not marked withMicrosoft.Build.Framework.MSBuildMultiThreadableTaskAttributeis routed to an out-of-proc sidecar TaskHost for isolation, so every invocation pays cross-process serialization of its inputs and outputs.No task in this repository is currently annotated, so all ~136 Arcade tasks are marshalled out-of-proc in
-mtbuilds. This measurably eats into the gains from-mt+ MSBuild Server + node reuse.Measured impact
A/B of the runtime inner repo build inside the dotnet/dotnet VMR (win-x64, same source SHA
2eebfbf, same SDK11.0.100-rc.1.26420.103, MSBuild18.11.0-1.26420.103). Command lines were identical except:/nr:False, no-mt->MSBuild Server was requested but not used for this build: node reuse is disabled/nr:True -mt->Reusing the running MSBuild Server node for this buildWall time went 51.50 min -> 49.64 min, only 1.86 min (3.6%). Meanwhile:
-mt+server+nodereuse)Engine overhead genuinely dropped (
MSBuildtask inclusive 126,987s -> 106,276s), but ~100s of that was handed straight back as TaskHost marshalling. Arcade-owned tasks are the bulk of it:ChooseBestP2PTargetFrameworkTaskGetLicenseFilePathChooseBestTargetFrameworksTaskGeneratePackageReportValidateLicenseGetLastStablePackageGenerateResxSourceGetMinimumNETStandardApplyPreReleaseSuffixTranslateSourceThat is ~82 s of pure added overhead from 10 Arcade tasks in a single repo build, and it repeats for every repo in the VMR.
Proposed change
Audit each task and add
[MSBuildMultiThreadableTask]where it is genuinely thread-safe.Per
MSBuildMultiThreadableTaskAttribute, a task qualifies only if it:Most of the P1 tasks above are pure item/string transforms, so they should qualify easily.
Implementation note
Arcade currently pins the MSBuild packages at
17.12.50(eng/Version.Details.props, flowed from dotnet-msbuild), which predates the attribute. Step 1 is simply to flow up the MSBuild package versions to 18.x soMSBuildMultiThreadableTaskAttributeis available fromMicrosoft.Build.Frameworkdirectly:The attribute is non-inheritable (
Inherited = false), so it must be applied to each concrete task class - not to a shared base such asBuildTask/MSBuildTaskBase/XlfTask.Task inventory
All concrete MSBuild task classes under
src/(excludingeng/common, abstract bases and test-only stubs). 136 tasks.P1 - measured hot path (do these first)
ChooseBestP2PTargetFrameworkTask-src\Microsoft.DotNet.Build.Tasks.TargetFramework\src\ChooseBestP2PTargetFrameworkTask.csGetLicenseFilePath-src\Microsoft.DotNet.Arcade.Sdk\src\GetLicenseFilePath.csChooseBestTargetFrameworksTask-src\Microsoft.DotNet.Build.Tasks.TargetFramework\src\ChooseBestTargetFrameworksTask.csGeneratePackageReport-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GeneratePackageReport.csValidateLicense-src\Microsoft.DotNet.Arcade.Sdk\src\ValidateLicense.csGetLastStablePackage-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetLastStablePackage.csGenerateResxSource-src\Microsoft.DotNet.Arcade.Sdk\src\GenerateResxSource.csGetMinimumNETStandard-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetMinimumNETStandard.csApplyPreReleaseSuffix-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ApplyPreReleaseSuffix.csTranslateSource-src\Microsoft.DotNet.XliffTasks\Tasks\TranslateSource.csP2 / P3 - remaining tasks by package
Microsoft.DotNet.Arcade.Sdk (15)
CalculateAssemblyAndFileVersions-src\Microsoft.DotNet.Arcade.Sdk\src\CalculateAssemblyAndFileVersions.csCheckRequiredDotNetVersion-src\Microsoft.DotNet.Arcade.Sdk\src\CheckRequiredDotNetVersion.csCompareVersions-src\Microsoft.DotNet.Arcade.Sdk\src\CompareVersions.csDownloadFile-src\Microsoft.DotNet.Arcade.Sdk\src\DownloadFile.csExtractNgenMethodList-src\Microsoft.DotNet.Arcade.Sdk\src\ExtractNgenMethodList.csGenerateChecksums-src\Microsoft.DotNet.Arcade.Sdk\src\GenerateChecksums.csGenerateSourcePackageSourceLinkTargetsFile-src\Microsoft.DotNet.Arcade.Sdk\src\GenerateSourcePackageSourceLinkTargetsFile.csGetAssemblyFullName-src\Microsoft.DotNet.Arcade.Sdk\src\GetAssemblyFullName.csGroupItemsBy-src\Microsoft.DotNet.Arcade.Sdk\src\GroupItemsBy.csInstallDotNetCore-src\Microsoft.DotNet.Arcade.Sdk\src\InstallDotNetCore.csLocateDotNet-src\Microsoft.DotNet.Arcade.Sdk\src\LocateDotNet.csSaveItems-src\Microsoft.DotNet.Arcade.Sdk\src\SaveItems.csSetCorFlags-src\Microsoft.DotNet.Arcade.Sdk\src\SetCorFlags.csSingleError-src\Microsoft.DotNet.Arcade.Sdk\src\SingleError.csUnsign-src\Microsoft.DotNet.Arcade.Sdk\src\Unsign.csMicrosoft.DotNet.Build.Tasks.Feed (12)
ConfigureInputFeed-src\Microsoft.DotNet.Build.Tasks.Feed\src\ConfigureInputFeed.csCreateAzureContainerIfNotExists-src\Microsoft.DotNet.Build.Tasks.Feed\src\common\CreateAzureContainerIfNotExists.csCreateAzureDevOpsFeed-src\Microsoft.DotNet.Build.Tasks.Feed\src\CreateAzureDevOpsFeed.csCreateNewAzureContainer-src\Microsoft.DotNet.Build.Tasks.Feed\src\common\CreateNewAzureContainer.csLaunchDebugger-src\Microsoft.DotNet.Build.Tasks.Feed\src\LaunchDebugger.csPublishArtifactsInManifest-src\Microsoft.DotNet.Build.Tasks.Feed\src\PublishArtifactsInManifest.csPublishArtifactsInManifestV3-src\Microsoft.DotNet.Build.Tasks.Feed\src\PublishArtifactsInManifestV3.csPublishArtifactsInManifestV4-src\Microsoft.DotNet.Build.Tasks.Feed\src\PublishArtifactsInManifestV4.csPublishBuildToMaestro-src\Microsoft.DotNet.Build.Tasks.Feed\src\PublishBuildToMaestro.csPublishSignedAssets-src\Microsoft.DotNet.Build.Tasks.Feed\src\PublishSignedAssets.csPushToBuildStorage-src\Microsoft.DotNet.Build.Tasks.Feed\src\PushToBuildStorage.csUploadToAzure-src\Microsoft.DotNet.Build.Tasks.Feed\src\common\UploadToAzure.csMicrosoft.DotNet.Build.Tasks.FileCatalog (1)
GenerateFileCatalog-src\Microsoft.DotNet.Build.Tasks.FileCatalog\GenerateFileCatalog.csMicrosoft.DotNet.Build.Tasks.Installers (13)
CreateChangelogFile-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateChangelogFile.csCreateControlFile-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateControlFile.csCreateDebPackage-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateDebPackage.csCreateLightCommandPackageDrop-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateLightCommandPackageDrop.csCreateMD5SumsFile-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateMD5SumsFile.csCreateRpmPackage-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateRpmPackage.csCreateWixBuildWixpack-src\Microsoft.DotNet.Build.Tasks.Installers\src\CreateWixBuildWixpack.csExecWithRetries-src\Microsoft.DotNet.Build.Tasks.Installers\src\ExecWithRetries.csGenerateCurrentVersion-src\Microsoft.DotNet.Build.Tasks.Installers\src\GenerateCurrentVersion.csGenerateGuidFromName-src\Microsoft.DotNet.Build.Tasks.Installers\src\GenerateGuidFromName.csGenerateMacOSDistributionFile-src\Microsoft.DotNet.Build.Tasks.Installers\src\GenerateMacOSDistributionFile.csGenerateMsiVersion-src\Microsoft.DotNet.Build.Tasks.Installers\src\GenerateMsiVersion.csStabilizeWixFileId-src\Microsoft.DotNet.Build.Tasks.Installers\src\StabilizeWixFileId.csMicrosoft.DotNet.Build.Tasks.Packaging (27)
ApplyBaseLine-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ApplyBaseLine.csApplyMetaPackages-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ApplyMetaPackages.csCreateTrimDependencyGroups-src\Microsoft.DotNet.Build.Tasks.Packaging\src\CreateTrimDependencyGroups.csFilterUnknownPackages-src\Microsoft.DotNet.Build.Tasks.Packaging\src\FilterUnknownPackages.csGenerateNuSpec-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GenerateNuSpec.csGenerateRuntimeDependencies-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GenerateRuntimeDependencies.csGetApplicableAssetsFromPackageReports-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetApplicableAssetsFromPackageReports.csGetApplicableAssetsFromPackages-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetApplicableAssetsFromPackages.csGetAssemblyReferences-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetAssemblyReferences.csGetInboxFrameworks-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetInboxFrameworks.csGetLayoutFiles-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetLayoutFiles.csGetPackageDescription-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetPackageDescription.csGetPackageDestination-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetPackageDestination.csGetPackageFromModule-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetPackageFromModule.csGetPackageVersion-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetPackageVersion.csGetRuntimeJsonValues-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetRuntimeJsonValues.csGetRuntimeTargets-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetRuntimeTargets.csGetSupportedPackagesFromPackageReports-src\Microsoft.DotNet.Build.Tasks.Packaging\src\GetSupportedPackagesFromPackageReports.csHarvestPackage-src\Microsoft.DotNet.Build.Tasks.Packaging\src\HarvestPackage.csNuGetPack-src\Microsoft.DotNet.Build.Tasks.Packaging\src\NuGetPack.csPromoteDependencies-src\Microsoft.DotNet.Build.Tasks.Packaging\src\PromoteDependencies.csSplitDependenciesBySupport-src\Microsoft.DotNet.Build.Tasks.Packaging\src\SplitDependenciesBySupport.csSplitReferences-src\Microsoft.DotNet.Build.Tasks.Packaging\src\SplitReferences.csUpdatePackageIndex-src\Microsoft.DotNet.Build.Tasks.Packaging\src\UpdatePackageIndex.csValidateFrameworkPackage-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ValidateFrameworkPackage.csValidateHarvestVersionIsLatestForRelease-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ValidateHarvestVersionIsLatestForRelease.csValidatePackage-src\Microsoft.DotNet.Build.Tasks.Packaging\src\ValidatePackage.csMicrosoft.DotNet.Build.Tasks.Templating (1)
GenerateFileFromTemplate-src\Microsoft.DotNet.Build.Tasks.Templating\src\GenerateFileFromTemplate.csMicrosoft.DotNet.Build.Tasks.VisualStudio (6)
FinalizeInsertionVsixFile-src\Microsoft.DotNet.Build.Tasks.VisualStudio\Vsix\FinalizeInsertionVsixFile.csFindLatestDrop-src\Microsoft.DotNet.Build.Tasks.VisualStudio\OptProf\FindLatestDrop.csGenerateTrainingInputFiles-src\Microsoft.DotNet.Build.Tasks.VisualStudio\OptProf\GenerateTrainingInputFiles.csGenerateTrainingPropsFile-src\Microsoft.DotNet.Build.Tasks.VisualStudio\OptProf\GenerateTrainingPropsFile.csGetPkgDefAssemblyDependencyGuid-src\Microsoft.DotNet.Build.Tasks.VisualStudio\Vsix\GetPkgDefAssemblyDependencyGuid.csGetRunSettingsSessionConfiguration-src\Microsoft.DotNet.Build.Tasks.VisualStudio\OptProf\GetRunSettingsSessionConfiguration.csMicrosoft.DotNet.Build.Tasks.Workloads (4)
CreateVisualStudioWorkload-src\Microsoft.DotNet.Build.Tasks.Workloads\src\CreateVisualStudioWorkload.wix.csCreateVisualStudioWorkloadSet-src\Microsoft.DotNet.Build.Tasks.Workloads\src\CreateVisualStudioWorkloadSet.wix.csHarvesterToolTask-src\Microsoft.DotNet.Build.Tasks.Workloads\src\Wix\HarvesterToolTask.csWixToolTask-src\Microsoft.DotNet.Build.Tasks.Workloads\src\Wix\WixToolTask.csMicrosoft.DotNet.CMake.Sdk (2)
CreateCMakeFileApiQuery-src\Microsoft.DotNet.CMake.Sdk\src\CreateCMakeFileApiQuery.csGetCMakeArtifactsFromFileApi-src\Microsoft.DotNet.CMake.Sdk\src\GetCMakeArtifactsFromFileApi.csMicrosoft.DotNet.Deployment.Tasks.Links (2)
CreateAkaMSLinks-src\Microsoft.DotNet.Deployment.Tasks.Links\src\CreateAkaMSLinks.csDeleteAkaMSLinks-src\Microsoft.DotNet.Deployment.Tasks.Links\src\DeleteAkaMSLinks.csMicrosoft.DotNet.GenAPI (1)
GenAPITask-src\Microsoft.DotNet.GenAPI\GenAPITask.csMicrosoft.DotNet.GenFacades (3)
ClearAssemblyReferenceVersions-src\Microsoft.DotNet.GenFacades\ClearAssemblyReferenceVersions.csGenPartialFacadeSource-src\Microsoft.DotNet.GenFacades\GenPartialFacadeSource.csNotSupportedAssemblyGenerator-src\Microsoft.DotNet.GenFacades\NotSupportedAssemblyGenerator.csMicrosoft.DotNet.Helix (16)
CancelHelixJobs-src\Microsoft.DotNet.Helix\Sdk\CancelHelixJob.csCheckAzurePipelinesTestResults-src\Microsoft.DotNet.Helix\Sdk\CheckAzurePipelinesTestResults.csCheckHelixJobStatus-src\Microsoft.DotNet.Helix\Sdk\CheckHelixJobStatus.csCreateMTPWorkItems-src\Microsoft.DotNet.Helix\Sdk\CreateMTPWorkItems.csCreateTestsForWorkItems-src\Microsoft.DotNet.Helix\Sdk\CreateFailedTestsForFailedWorkItems.csCreateXHarnessAndroidWorkItems-src\Microsoft.DotNet.Helix\Sdk\CreateXHarnessAndroidWorkItems.csCreateXHarnessAppleWorkItems-src\Microsoft.DotNet.Helix\Sdk\CreateXHarnessAppleWorkItems.csCreateXUnitWorkItems-src\Microsoft.DotNet.Helix\Sdk\CreateXUnitWorkItems.csDownloadFromResultsContainer-src\Microsoft.DotNet.Helix\Sdk\DownloadFromResultsContainer.csFindDotNetCliPackage-src\Microsoft.DotNet.Helix\Sdk\FindDotNetCliPackage.csGetHelixWorkItems-src\Microsoft.DotNet.Helix\Sdk\GetHelixWorkItems.csInstallDotNetTool-src\Microsoft.DotNet.Helix\Sdk\InstallDotNetTool.csSendHelixJob-src\Microsoft.DotNet.Helix\Sdk\SendHelixJob.csStartAzurePipelinesTestRun-src\Microsoft.DotNet.Helix\Sdk\StartAzurePipelinesTestRun.csStopAzurePipelinesTestRun-src\Microsoft.DotNet.Helix\Sdk\StopAzurePipelinesTestRun.csWaitForHelixJobCompletion-src\Microsoft.DotNet.Helix\Sdk\WaitForHelixJobCompletion.csMicrosoft.DotNet.NuGetRepack (2)
ReplacePackageParts-src\Microsoft.DotNet.NuGetRepack\tasks\src\ReplacePackageParts.csUpdatePackageVersionTask-src\Microsoft.DotNet.NuGetRepack\tasks\src\UpdatePackageVersionTask.csMicrosoft.DotNet.PackageTesting (3)
GetCompatiblePackageTargetFrameworks-src\Microsoft.DotNet.PackageTesting\GetCompatiblePackageTargetFrameworks.csVerifyClosure-src\Microsoft.DotNet.PackageTesting\VerifyClosure.csVerifyTypes-src\Microsoft.DotNet.PackageTesting\VerifyTypes.csMicrosoft.DotNet.SharedFramework.Sdk (5)
CreateFrameworkListFile-src\Microsoft.DotNet.SharedFramework.Sdk\src\CreateFrameworkListFile.csGeneratePlatformManifestEntriesFromFileList-src\Microsoft.DotNet.SharedFramework.Sdk\src\GeneratePlatformManifestEntriesFromFileList.csGeneratePlatformManifestEntriesFromTemplate-src\Microsoft.DotNet.SharedFramework.Sdk\src\GeneratePlatformManifestEntriesFromTemplate.csGenerateSharedFrameworkDepsFile-src\Microsoft.DotNet.SharedFramework.Sdk\src\GenerateSharedFrameworkDepsFile.csValidateFileVersions-src\Microsoft.DotNet.SharedFramework.Sdk\src\ValidateFileVersions.csMicrosoft.DotNet.SignCheckTask (1)
SignCheckTask-src\Microsoft.DotNet.SignCheckTask\SignCheckTask.csMicrosoft.DotNet.SignTool (1)
SignToolTask-src\Microsoft.DotNet.SignTool\src\SignToolTask.csMicrosoft.DotNet.SourceBuild (4)
ReadNuGetPackageInfos-src\Microsoft.DotNet.SourceBuild\tasks\src\ReadNuGetPackageInfos.csWriteBuildOutputProps-src\Microsoft.DotNet.SourceBuild\tasks\src\WriteBuildOutputProps.csWritePackageUsageData-src\Microsoft.DotNet.SourceBuild\tasks\src\UsageReport\WritePackageUsageData.csWriteUsageReports-src\Microsoft.DotNet.SourceBuild\tasks\src\UsageReport\WriteUsageReports.csMicrosoft.DotNet.SwaggerGenerator (1)
GenerateSwaggerCode-src\Microsoft.DotNet.SwaggerGenerator\Microsoft.DotNet.SwaggerGenerator.MSBuild\GenerateSwaggerCode.csMicrosoft.DotNet.XliffTasks (6)
EnsureAllResourcesTranslated-src\Microsoft.DotNet.XliffTasks\Tasks\EnsureAllResourcesTranslated.csGatherTranslatedSource-src\Microsoft.DotNet.XliffTasks\Tasks\GatherTranslatedSource.csGatherXlf-src\Microsoft.DotNet.XliffTasks\Tasks\GatherXlf.csSortXlf-src\Microsoft.DotNet.XliffTasks\Tasks\SortXlf.csTransformTemplates-src\Microsoft.DotNet.XliffTasks\Tasks\TransformTemplates.csUpdateXlf-src\Microsoft.DotNet.XliffTasks\Tasks\UpdateXlf.cs/cc @dotnet/dnceng