1
0
mirror of synced 2025-12-19 18:06:02 -05:00
Files
core/release-notes/RunApiDiff.ps1
Copilot 6b610a7544 Fix APIDiff to include NETCore references for AspNetCore and WindowsDesktop (#9989)
* Initial plan

* Add NETCore reference support for AspNetCore and WindowsDesktop API diffs

Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com>

* Run the updated script

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com>
Co-authored-by: Eric StJohn <ericstj@microsoft.com>
2025-07-21 14:15:25 -07:00

709 lines
23 KiB
PowerShell

# This script allows running API-diff to generate the dotnet/core report that compares the APIs introduced between two previews, in the format expected for publishing in the dotnet/core repo.
# Usage:
# RunApiDiff.ps1
# -PreviousDotNetVersion : The 'before' .NET version: '6.0', '7.0', '8.0', etc.
# -PreviousPreviewOrRC : An optional word that indicates if the 'before' version is a Preview, an RC, or GA. Accepted values: "preview", "rc" or "ga".
# -PreviousPreviewNumberVersion : The optional preview or RC number of the 'before' version: '1', '2', '3', etc. For GA, this number is the 3rd one in the released version (7.0.0, 7.0.1, 7.0.2, ...).
# -CurrentDotNetVersion : The 'after' .NET version: '6.0', '7.0', '8.0', etc.
# -CurrentPreviewOrRC : An optional word that indicates if the 'after' version is a Preview, an RC, or GA. Accepted values: "preview", "rc" or "ga".
# -CurrentPreviewNumberVersion : The optional preview or RC number of the 'before' version: '1', '2', '3', etc. For GA, this number is the 3rd one in the released version (7.0.0, 7.0.1, 7.0.2, ...).
# -CoreRepo : The full path to your local clone of the dotnet/core repo.
# -TmpFolder : The full path to the folder where the assets will be downloaded, extracted and compared.
# -AttributesToExcludeFilePath : The full path to the file containing the attributes to exclude from the report. By default, it is "ApiDiffAttributesToExclude.txt" in the same folder as this script.
# -AssembliesToExcludeFilePath : The full path to the file containing the assemblies to exclude from the report. By default, it is "ApiDiffAssembliesToExclude.txt" in the same folder as this script.
# -UseDefaultNuGetFeed : By default, the feed used is https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet10/nuget/v3/index.json , but if this is set to true, the feed used is https://api.nuget.org/v3/index.json
# -ExcludeNetCore : Optional boolean to exclude the NETCore comparison. Default is false.
# -ExcludeAspNetCore : Optional boolean to exclude the AspNetCore comparison. Default is false.
# -ExcludeWindowsDesktop : Optional boolean to exclude the WindowsDesktop comparison. Default is false.
# -InstallApiDiff : Optional boolean to install or update the ApiDiff tool. Default is false.
# Example:
# .\RunApiDiff.ps1 -PreviousDotNetVersion 9.0 -PreviousPreviewOrRC preview -PreviousPreviewNumberVersion 7 -CurrentDotNetVersion 9.0 -CurrentPreviewOrRC rc -CurrentPreviewNumberVersion 1 -CoreRepo C:\Users\calope\source\repos\core\ -SdkRepo C:\Users\calope\source\repos\sdk\ -TmpFolder C:\Users\calope\source\repos\tmp\
Param (
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$PreviousDotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$PreviousPreviewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$PreviousPreviewNumberVersion # 0, 1, 2, 3, ...
,
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$CurrentDotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$CurrentPreviewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$CurrentPreviewNumberVersion # 0, 1, 2, 3, ...
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$CoreRepo #"D:\\core"
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$TmpFolder #"D:\tmp"
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$AttributesToExcludeFilePath = "ApiDiffAttributesToExclude.txt"
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$AssembliesToExcludeFilePath = "ApiDiffAssembliesToExclude.txt"
,
[Parameter(Mandatory = $false)]
[bool]
$UseDefaultNuGetFeed = $false
,
[Parameter(Mandatory = $false)]
[bool]
$ExcludeNetCore = $false
,
[Parameter(Mandatory = $false)]
[bool]
$ExcludeAspNetCore = $false
,
[Parameter(Mandatory = $false)]
[bool]
$ExcludeWindowsDesktop = $false
,
[Parameter(Mandatory = $false)]
[bool]
$InstallApiDiff = $false
)
#######################
### Start Functions ###
#######################
Function Write-Color {
Param (
[ValidateNotNullOrEmpty()]
[string] $newColor
)
$oldColor = $host.UI.RawUI.ForegroundColor
$host.UI.RawUI.ForegroundColor = $newColor
If ($args) {
Write-Output $args
}
Else {
$input | Write-Output
}
$host.UI.RawUI.ForegroundColor = $oldColor
}
Function VerifyPathOrExit {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$path
)
If (-Not (Test-Path -Path $path)) {
Write-Error "The path '$path' does not exist." -ErrorAction Stop
}
}
Function RemoveFolderIfExists {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$path
)
If (Test-Path -Path $path) {
Write-Color yellow "Removing existing folder: $path"
Remove-Item -Recurse -Path $path
}
}
Function RecreateFolder {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$path
)
RemoveFolderIfExists $path
Write-Color cyan "Creating new folder: $path"
New-Item -ItemType Directory -Path $path
}
Function VerifyCountDlls {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$path
)
VerifyPathOrExit $path
$count = (Get-ChildItem -Path $path -Filter "*.dll" | Measure-Object).Count
If ($count -eq 0) {
Write-Error "There are no DLL files inside the folder." -ErrorAction Stop
}
}
Function RunCommand {
Param (
[Parameter(Mandatory = $True)]
[ValidateNotNullOrEmpty()]
[string]
$command
)
Write-Color yellow $command
Invoke-Expression "$command"
}
Function GetDotNetFullName {
Param (
[Parameter(Mandatory = $true)]
[bool]
$IsComparingReleases
,
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$dotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$previewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$previewNumberVersion # 0, 1, 2, 3, ...
)
If ($IsComparingReleases) {
Return "$dotNetVersion.$previewNumberVersion"
}
If ($previewOrRC -eq "ga") {
If ($previewNumberVersion -eq "0") {
# Example: Don't return "7.0-ga0", instead just return "7.0-ga"
Return "$dotNetVersion-$previewOrRC"
}
# Examples: Don't include "ga", instead just return "7.0.1", "7.0.2"
Return "$dotNetVersion.$previewNumberVersion"
}
# Examples: "7.0-preview5", "7.0-rc2", "7.0-ga"
Return "$dotNetVersion-$previewOrRC$previewNumberVersion"
}
Function GetDotNetFriendlyName {
Param (
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$DotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$PreviewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$PreviewNumberVersion # 0, 1, 2, 3, ...
)
$friendlyPreview = ""
If ($PreviewOrRC -eq "preview") {
$friendlyPreview = "Preview"
}
ElseIf ($PreviewOrRC -eq "rc") {
$friendlyPreview = "RC"
}
ElseIf ($PreviewOrRC -eq "ga") {
$friendlyPreview = "GA"
If ($PreviewNumberVersion -eq 0) {
# Example: Don't return "7.0 GA 0", instead just return "7.0 GA"
Return ".NET $DotNetVersion $friendlyPreview"
}
# Examples: Don't include "ga", instead just return "7.0.1", "7.0.2"
Return ".NET $DotNetVersion.$PreviewNumberVersion"
}
# Examples: "7.0 Preview 5", "7.0 RC 2"
Return ".NET $DotNetVersion $friendlyPreview $PreviewNumberVersion"
}
Function GetPreviewOrRCFolderName {
Param (
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$dotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$previewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$previewNumberVersion # 0, 1, 2, 3, ...
)
If ($previewOrRC -eq "ga") {
If ($previewNumberVersion -eq "0") {
# return "ga", not "ga0"
Return $previewOrRC
}
# return "7.0.1", "7.0.2", not "ga1, ga2"
Return "$dotNetVersion$previewNumberVersion"
}
Return "$previewOrRC$previewNumberVersion"
}
Function GetPreviewFolderPath {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$rootFolder #"D:\\core"
,
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$dotNetVersion # 7.0, 8.0, 9.0, ...
,
[Parameter(Mandatory = $true)]
[string]
[ValidateSet("preview", "rc", "ga")]
$previewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$previewNumberVersion # 0, 1, 2, 3, ...
,
[Parameter(Mandatory = $true)]
[bool]
$IsComparingReleases # True when comparing 8.0 GA with 9.0 GA
)
$prefixFolder = [IO.Path]::Combine($rootFolder, "release-notes", $dotNetVersion)
$apiDiffFolderName = "api-diff"
If ($IsComparingReleases) {
Return [IO.Path]::Combine($prefixFolder, "$dotNetVersion.$previewNumberVersion", $apiDiffFolderName)
}
$previewOrRCFolderName = GetPreviewOrRCFolderName $dotNetVersion $previewOrRC $previewNumberVersion
Return [IO.Path]::Combine($prefixFolder, "preview", $previewOrRCFolderName, $apiDiffFolderName)
}
Function RunApiDiff {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$apiDiffExe
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$outputFolder
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$beforeFolder
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$afterFolder
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$tableOfContentsFileNamePrefix
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$assembliesToExclude
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$attributesToExclude
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$beforeFriendlyName
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$afterFriendlyName
,
[Parameter(Mandatory = $false)]
[string]
$beforeReferenceFolder = ""
,
[Parameter(Mandatory = $false)]
[string]
$afterReferenceFolder = ""
)
VerifyPathOrExit $apiDiffExe
VerifyPathOrExit $beforeFolder
VerifyPathOrExit $afterFolder
$referenceParams = ""
if (-not [string]::IsNullOrEmpty($beforeReferenceFolder) -and -not [string]::IsNullOrEmpty($afterReferenceFolder)) {
VerifyPathOrExit $beforeReferenceFolder
VerifyPathOrExit $afterReferenceFolder
$referenceParams = " -rb '$beforeReferenceFolder' -ra '$afterReferenceFolder'"
}
RunCommand "$apiDiffExe -b '$beforeFolder' -a '$afterFolder' -o '$outputFolder' -tc '$tableOfContentsFileNamePrefix' -eas '$assembliesToExclude' -eattrs '$attributesToExclude' -bfn '$beforeFriendlyName' -afn '$afterFriendlyName'$referenceParams"
}
Function CreateReadme {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$previewFolderPath
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$dotNetFriendlyName
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$dotNetFullName
)
$readmePath = [IO.Path]::Combine($previewFolderPath, "README.md")
If (Test-Path -Path $readmePath) {
Remove-Item -Path $readmePath
}
New-Item -ItemType File $readmePath
Add-Content $readmePath "# $dotNetFriendlyName API Changes"
Add-Content $readmePath ""
Add-Content $readmePath "The following API changes were made in $($dotNetFriendlyName):"
Add-Content $readmePath ""
Add-Content $readmePath "- [Microsoft.NETCore.App](./Microsoft.NETCore.App/$dotNetFullName.md)"
Add-Content $readmePath "- [Microsoft.AspNetCore.App](./Microsoft.AspNetCore.App/$dotNetFullName.md)"
Add-Content $readmePath "- [Microsoft.WindowsDesktop.App](./Microsoft.WindowsDesktop.App/$dotNetFullName.md)"
}
Function RebuildIfExeNotFound {
Param (
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$exePath
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$projectPath
,
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$artifactsPath
)
VerifyPathOrExit $projectPath
If (-Not (Test-Path -Path $exePath)) {
# Building the project
Write-Color cyan "Building project '$projectPath'"
RunCommand "$SdkRepo/.dotnet/dotnet build -c release $projectPath"
# Verifying expected output from building
VerifyPathOrExit $artifactsPath
VerifyPathOrExit $exePath
}
}
Function DownloadPackage {
Param
(
[Parameter(Mandatory = $true)]
[bool]
$useDefaultNuGetFeed
,
[Parameter(Mandatory = $true)]
[ValidateSet("NETCore", "AspNetCore", "WindowsDesktop")]
[string]
$sdkName
,
[Parameter(Mandatory = $true)]
[ValidateSet("Before", "After")]
[string]
$beforeOrAfter
,
[Parameter(Mandatory = $true)]
[ValidatePattern("\d+\.\d")]
[string]
$dotNetVersion
,
[Parameter(Mandatory = $true)]
[ValidateSet("preview", "rc", "ga")]
[string]
$previewOrRC
,
[Parameter(Mandatory = $true)]
[ValidatePattern("(\d+)?")]
[string]
$previewNumberVersion
,
[ref]
$resultingPath
)
$fullSdkName = "Microsoft.$sdkName.App"
$destinationFolder = [IO.Path]::Combine($TmpFolder, "$fullSdkName.$beforeOrAfter")
RecreateFolder $destinationFolder
$refPackageName = "$fullSdkName.Ref"
$feed = "https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet10/nuget/v3/index.json"
if ($useDefaultNuGetFeed) {
$feed = "https://api.nuget.org/v3/index.json"
}
$searchTerm = ""
If ($previewOrRC -eq "ga") {
$searchTerm = "$dotNetversion.$previewNumberVersion"
}
ElseIf (-Not ([System.String]::IsNullOrWhiteSpace($previewOrRC)) -And -Not ([System.String]::IsNullOrWhiteSpace($previewNumberVersion))) {
$searchTerm = "$dotNetversion.*-$previewOrRC.$previewNumberVersion*"
}
$foundPackages = Find-Package -AllVersions -Source $feed -Name $refPackageName -AllowPrereleaseVersions -ErrorAction Continue
If ($foundPackages.Count -eq 0) {
Write-Error "No NuGet packages found with ref package name '$refPackageName' in feed '$feed'"
Get-PackageSource -Name $refPackageName | Format-Table -Property Name, SourceUri
Write-Error "Exiting" -ErrorAction Stop
}
$results = $foundPackages | Where-Object -Property Version -Like $searchTerm | Sort-Object Version -Descending
If ($results.Count -eq 0) {
Write-Error "No NuGet packages found with search term '$searchTerm'." -ErrorAction Stop
}
$version = $results[0].Version
$nupkgFile = [IO.Path]::Combine($TmpFolder, "$refPackageName.$version.nupkg")
If (-Not(Test-Path -Path $nupkgFile)) {
$href = $results[0].Links | Where-Object -Property Relationship -Eq "icon" | Select-Object -ExpandProperty HRef
$link = $href.AbsoluteUri.Replace("?extract=Icon.png", "")
$nupkgUrl = $link
if ($useDefaultNuGetFeed) {
$nupkgUrl = "https://www.nuget.org/api/v2/package/$refPackageName/$version"
}
Write-Color yellow "Downloading '$nupkgUrl' to '$nupkgFile'..."
Invoke-WebRequest -Uri $nupkgUrl -OutFile $nupkgFile
VerifyPathOrExit $nupkgFile
}
Else {
Write-Color green "File '$nupkgFile' already exists locally. Skipping re-download."
}
Expand-Archive -Path $nupkgFile -DestinationPath $destinationFolder -ErrorAction Stop
$dllPath = [IO.Path]::Combine($destinationFolder, "ref", "net$dotNetVersion")
VerifyPathOrExit $dllPath
VerifyCountDlls $dllPath
$resultingPath.value = $dllPath
}
Function ProcessSdk
{
Param(
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$sdkName
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$apiDiffExe
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$currentDotNetFullName
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$assembliesToExclude
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$attributesToExclude
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$previousDotNetFriendlyName
,
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]
$currentDotNetFriendlyName
)
$beforeDllFolder = ""
DownloadPackage $UseDefaultNuGetFeed $sdkName "Before" $PreviousDotNetVersion $PreviousPreviewOrRC $PreviousPreviewNumberVersion ([ref]$beforeDllFolder)
VerifyPathOrExit $beforeDllFolder
$afterDllFolder = ""
DownloadPackage $UseDefaultNuGetFeed $sdkName "After" $CurrentDotNetVersion $CurrentPreviewOrRC $CurrentPreviewNumberVersion ([ref]$afterDllFolder)
VerifyPathOrExit $afterDllFolder
# For AspNetCore and WindowsDesktop, also download NETCore references to provide core assemblies
$beforeReferenceFolder = ""
$afterReferenceFolder = ""
if ($sdkName -eq "AspNetCore" -or $sdkName -eq "WindowsDesktop") {
DownloadPackage $UseDefaultNuGetFeed "NETCore" "Before" $PreviousDotNetVersion $PreviousPreviewOrRC $PreviousPreviewNumberVersion ([ref]$beforeReferenceFolder)
VerifyPathOrExit $beforeReferenceFolder
DownloadPackage $UseDefaultNuGetFeed "NETCore" "After" $CurrentDotNetVersion $CurrentPreviewOrRC $CurrentPreviewNumberVersion ([ref]$afterReferenceFolder)
VerifyPathOrExit $afterReferenceFolder
}
$targetFolder = [IO.Path]::Combine($previewFolderPath, "Microsoft.$sdkName.App")
RecreateFolder $targetFolder
RunApiDiff $apiDiffExe $targetFolder $beforeDllFolder $afterDllFolder $currentDotNetFullName $assembliesToExclude $attributesToExclude $previousDotNetFriendlyName $currentDotNetFriendlyName $beforeReferenceFolder $afterReferenceFolder
}
#####################
### End Functions ###
#####################
#######################
### Start Execution ###
#######################
if ($PSVersionTable.PSVersion.Major -lt 7) {
Write-Error "This script requires PowerShell 7.0 or later. See https://aka.ms/PSWindows for instructions." -ErrorAction Stop
}
## Generate strings with no whitespace
# True when comparing 8.0 GA with 9.0 GA
$IsComparingReleases = ($PreviousDotNetVersion -Ne $CurrentDotNetVersion) -And ($PreviousPreviewOrRC -Eq "ga") -And ($CurrentPreviewOrRC -eq "ga")
## Check folders passed as parameters exist
VerifyPathOrExit $CoreRepo
VerifyPathOrExit $TmpFolder
$currentMajorVersion = $CurrentDotNetVersion.Split(".")[0]
$InstallApiDiffCommand = "dotnet tool install --global Microsoft.DotNet.ApiDiff.Tool --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet$currentMajorVersion-transport/nuget/v3/index.json --prerelease"
if ($InstallApiDiff) {
Write-Color white "Installing ApiDiff tool..."
RunCommand $InstallApiDiffCommand
}
$apiDiffCommand = get-command "apidiff" -ErrorAction SilentlyContinue
if (-Not $apiDiffCommand)
{
Write-Error "The command apidiff could not be found. Please first install the tool using the following command: $InstallApiDiffCommand" -ErrorAction Stop
}
$apiDiffExe = $apiDiffCommand.Source
## Recreate api-diff folder in core repo folder
$previewFolderPath = GetPreviewFolderPath $CoreRepo $CurrentDotNetVersion $CurrentPreviewOrRC $CurrentPreviewNumberVersion $IsComparingReleases
If (-Not (Test-Path -Path $previewFolderPath))
{
Write-Color white "Creating new diff folder: $previewFolderPath"
New-Item -ItemType Directory -Path $previewFolderPath
}
## Run the ApiDiff commands
# Example: "10.0-preview2"
$currentDotNetFullName = GetDotNetFullName $IsComparingReleases $CurrentDotNetVersion $CurrentPreviewOrRC $CurrentPreviewNumberVersion
# Examples: ".NET 10 Preview 1" and ".NET 10 Preview 2"
$previousDotNetFriendlyName = GetDotNetFriendlyName $PreviousDotNetVersion $PreviousPreviewOrRC $PreviousPreviewNumberVersion
$currentDotNetFriendlyName = GetDotNetFriendlyName $CurrentDotNetVersion $CurrentPreviewOrRC $CurrentPreviewNumberVersion
If (-Not $ExcludeNetCore)
{
ProcessSdk "NETCore" $apiDiffExe $currentDotNetFullName $AssembliesToExcludeFilePath $AttributesToExcludeFilePath $previousDotNetFriendlyName $currentDotNetFriendlyName
}
If (-Not $ExcludeAspNetCore)
{
ProcessSdk "AspNetCore" $apiDiffExe $currentDotNetFullName $AssembliesToExcludeFilePath $AttributesToExcludeFilePath $previousDotNetFriendlyName $currentDotNetFriendlyName
}
If (-Not $ExcludeWindowsDesktop)
{
ProcessSdk "WindowsDesktop" $apiDiffExe $currentDotNetFullName $AssembliesToExcludeFilePath $AttributesToExcludeFilePath $previousDotNetFriendlyName $currentDotNetFriendlyName
}
CreateReadme $previewFolderPath $currentDotNetFriendlyName $currentDotNetFullName
#####################
### End Execution ###
#####################