From b67a14126326cec4c74ff844500b3bd830dde880 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 17 Aug 2018 10:01:57 -0700 Subject: [PATCH] Add code for building the Windows Hosting Bundle and ASP.NET Core runtime installers into this repo This code previously was in private repos because it had references to internal locations and drop shares. This code has been modified to remove these internal-only pieces. --- .gitignore | 10 +- Directory.Build.props | 13 +- Directory.Build.targets | 2 + build/common.props | 3 +- build/Key.snk => eng/AspNetCore.snk | Bin eng/targets/MicroBuild.Plugin.props | 29 +++++ eng/targets/Wix.Common.props | 31 +++++ eng/targets/Wix.Common.targets | 34 +++++ scripts/common.psm1 | 81 ++++++++++-- src/Installers/Windows/.gitignore | 1 + src/Installers/Windows/Directory.Build.props | 20 +++ .../Windows/Directory.Build.targets | 7 ++ .../SharedFramework/DependencyProvider.wxs | 14 +++ .../Windows/SharedFramework/Product.props | 11 ++ .../Windows/SharedFramework/Product.wxs | 81 ++++++++++++ .../SharedFramework/SharedFramework.wixproj | 51 ++++++++ .../Windows/SharedFramework/Strings.wxl | 5 + .../Windows/SharedFrameworkBundle/Bundle.wxs | 29 +++++ .../SharedFrameworkBundle/DotNetLogo.bmp | Bin 0 -> 12342 bytes .../SharedFrameworkBundle/Product.props | 31 +++++ .../SharedFrameworkBundle.wixproj | 36 ++++++ .../Windows/SharedFrameworkBundle/thm.wxl | 61 +++++++++ .../Windows/SharedFrameworkBundle/thm.xml | 80 ++++++++++++ .../Windows/SharedFrameworkLib/Library.wxs | 28 +++++ .../SharedFrameworkLib.wixproj | 27 ++++ .../Windows/WindowsHostingBundle/ANCM.wxs | 112 +++++++++++++++++ .../Windows/WindowsHostingBundle/Bundle.wxs | 43 +++++++ .../WindowsHostingBundle/DotNetCore.wxs | 42 +++++++ .../WindowsHostingBundle/DotNetLogo.bmp | Bin 0 -> 12342 bytes .../WindowsHostingBundle/Product.props | 31 +++++ .../WindowsHostingBundle/Product.targets | 90 ++++++++++++++ .../Windows/WindowsHostingBundle/Strings.wxl | 10 ++ .../WindowsHostingBundle.wixproj | 43 +++++++ .../Windows/WindowsHostingBundle/thm.wxl | 61 +++++++++ .../Windows/WindowsHostingBundle/thm.xml | 84 +++++++++++++ src/Installers/Windows/WindowsInstallers.proj | 21 ++++ src/Installers/Windows/Wix.props | 38 ++++++ src/Installers/Windows/Wix.targets | 42 +++++++ src/Installers/Windows/build.ps1 | 89 +++++++++++++ .../Windows/clone_and_build_ancm.ps1 | 117 ++++++++++++++++++ src/Installers/Windows/files/eula.rtf | 113 +++++++++++++++++ src/Installers/Windows/tasks/GenerateGuid.cs | 38 ++++++ .../Windows/tasks/GetMsiProperty.cs | 38 ++++++ .../Windows/tasks/InstallerTasks.csproj | 23 ++++ src/Installers/Windows/tasks/Uuid.cs | 79 ++++++++++++ version.props | 1 + 46 files changed, 1780 insertions(+), 20 deletions(-) rename build/Key.snk => eng/AspNetCore.snk (100%) create mode 100644 eng/targets/MicroBuild.Plugin.props create mode 100644 eng/targets/Wix.Common.props create mode 100644 eng/targets/Wix.Common.targets create mode 100644 src/Installers/Windows/.gitignore create mode 100644 src/Installers/Windows/Directory.Build.props create mode 100644 src/Installers/Windows/Directory.Build.targets create mode 100644 src/Installers/Windows/SharedFramework/DependencyProvider.wxs create mode 100644 src/Installers/Windows/SharedFramework/Product.props create mode 100644 src/Installers/Windows/SharedFramework/Product.wxs create mode 100644 src/Installers/Windows/SharedFramework/SharedFramework.wixproj create mode 100644 src/Installers/Windows/SharedFramework/Strings.wxl create mode 100644 src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs create mode 100644 src/Installers/Windows/SharedFrameworkBundle/DotNetLogo.bmp create mode 100644 src/Installers/Windows/SharedFrameworkBundle/Product.props create mode 100644 src/Installers/Windows/SharedFrameworkBundle/SharedFrameworkBundle.wixproj create mode 100644 src/Installers/Windows/SharedFrameworkBundle/thm.wxl create mode 100644 src/Installers/Windows/SharedFrameworkBundle/thm.xml create mode 100644 src/Installers/Windows/SharedFrameworkLib/Library.wxs create mode 100644 src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj create mode 100644 src/Installers/Windows/WindowsHostingBundle/ANCM.wxs create mode 100644 src/Installers/Windows/WindowsHostingBundle/Bundle.wxs create mode 100644 src/Installers/Windows/WindowsHostingBundle/DotNetCore.wxs create mode 100644 src/Installers/Windows/WindowsHostingBundle/DotNetLogo.bmp create mode 100644 src/Installers/Windows/WindowsHostingBundle/Product.props create mode 100644 src/Installers/Windows/WindowsHostingBundle/Product.targets create mode 100644 src/Installers/Windows/WindowsHostingBundle/Strings.wxl create mode 100644 src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj create mode 100644 src/Installers/Windows/WindowsHostingBundle/thm.wxl create mode 100644 src/Installers/Windows/WindowsHostingBundle/thm.xml create mode 100644 src/Installers/Windows/WindowsInstallers.proj create mode 100644 src/Installers/Windows/Wix.props create mode 100644 src/Installers/Windows/Wix.targets create mode 100644 src/Installers/Windows/build.ps1 create mode 100644 src/Installers/Windows/clone_and_build_ancm.ps1 create mode 100644 src/Installers/Windows/files/eula.rtf create mode 100644 src/Installers/Windows/tasks/GenerateGuid.cs create mode 100644 src/Installers/Windows/tasks/GetMsiProperty.cs create mode 100644 src/Installers/Windows/tasks/InstallerTasks.csproj create mode 100644 src/Installers/Windows/tasks/Uuid.cs diff --git a/.gitignore b/.gitignore index 19ef7b5771..9f2e95e1d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -bin -obj +bin/ +obj/ .vs/ *.suo *.user @@ -11,11 +11,9 @@ _ReSharper.* *.psess *.binlog *.log -packages -target -artifacts +artifacts/ StyleCop.Cache -node_modules +node_modules/ *.snk .nuget .r diff --git a/Directory.Build.props b/Directory.Build.props index 153d8f33f9..92c51ec97c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,10 +1,21 @@ + + + $(MSBuildThisFileDirectory) + + - $(MSBuildThisFileDirectory) + $(RepositoryRoot)artifacts\ + $(ArtifactsDir)obj\ + $(ArtifactsDir)$(Configuration)\ + $(ArtifactsConfigurationDir)bin\ + $(ArtifactsConfigurationDir)packages\ + + diff --git a/Directory.Build.targets b/Directory.Build.targets index 73b97f2807..3a0a9e498f 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -6,4 +6,6 @@ 99.9 + + diff --git a/build/common.props b/build/common.props index b34f91a0b1..f9a6c8672f 100644 --- a/build/common.props +++ b/build/common.props @@ -5,9 +5,8 @@ https://github.com/aspnet/Universe git false - ..\..\build\Key.snk + $(RepositoryRoot)eng\AspNetCore.snk true - true true diff --git a/build/Key.snk b/eng/AspNetCore.snk similarity index 100% rename from build/Key.snk rename to eng/AspNetCore.snk diff --git a/eng/targets/MicroBuild.Plugin.props b/eng/targets/MicroBuild.Plugin.props new file mode 100644 index 0000000000..2d75c7dc4b --- /dev/null +++ b/eng/targets/MicroBuild.Plugin.props @@ -0,0 +1,29 @@ + + + + + packages\MicroBuild.Core.Sentinel.1.0.0\sentinel.txt + MicroBuild.Core.Sentinel\1.0.0\sentinel.txt + + $([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), $(MicroBuildSentinelFile))) + $(MicroBuildPluginDirectory)\packages + + + $(NUGET_PACKAGES) + $(USERPROFILE)\.nuget\packages + + + $(MicroBuildOverridePluginDirectory) + + \ No newline at end of file diff --git a/eng/targets/Wix.Common.props b/eng/targets/Wix.Common.props new file mode 100644 index 0000000000..5c66285a6e --- /dev/null +++ b/eng/targets/Wix.Common.props @@ -0,0 +1,31 @@ + + + + + 2.0 + 3.11 + 3.11.1 + + + + + net461 + $(BaseIntermediateOutputPath) + $(MSBuildProjectDir)\obj\ + $(MSBuildExtensionsPath)\..\Common7\IDE\CommonExtensions\Microsoft\NuGet\NuGet.targets + + + + + + + + + + $(WixExtDir)dark.exe + + + + + + diff --git a/eng/targets/Wix.Common.targets b/eng/targets/Wix.Common.targets new file mode 100644 index 0000000000..c232bd932a --- /dev/null +++ b/eng/targets/Wix.Common.targets @@ -0,0 +1,34 @@ + + + + + + + + + + yes + $(OutputName.Replace('-', '_')).cab + $(ProductName) + + $(DefineConstants);Debug + $(DefineConstants);EmbedCab=$(EmbedCab) + $(DefineConstants);Cabinet=$(Cabinet) + + + + en-US + $(Culture) + $(Platform) + $(Platform) + $(OutputPath) + $(DefineConstants);BinPath=$(OutputPath)$(Culture)\ + $(WixVariables);$(DefineConstants) + + + + + + + + diff --git a/scripts/common.psm1 b/scripts/common.psm1 index 6abff9e039..97b5216f85 100644 --- a/scripts/common.psm1 +++ b/scripts/common.psm1 @@ -7,19 +7,31 @@ function Assert-Git { } } -function Invoke-Block([scriptblock]$cmd) { - $cmd | Out-String | Write-Verbose - & $cmd +function Invoke-Block([scriptblock]$cmd, [string]$WorkingDir = $null) { + if ($WorkingDir) { + Push-Location $WorkingDir + } - # Need to check both of these cases for errors as they represent different items - # - $?: did the powershell script block throw an error - # - $lastexitcode: did a windows command executed by the script block end in error - if ((-not $?) -or ($lastexitcode -ne 0)) { - if ($error -ne $null) - { - Write-Warning $error[0] + try { + + $cmd | Out-String | Write-Verbose + & $cmd + + # Need to check both of these cases for errors as they represent different items + # - $?: did the powershell script block throw an error + # - $lastexitcode: did a windows command executed by the script block end in error + if ((-not $?) -or ($lastexitcode -ne 0)) { + if ($error -ne $null) + { + Write-Warning $error[0] + } + throw "Command failed to execute: $cmd" + } + } + finally { + if ($WorkingDir) { + Pop-Location } - throw "Command failed to execute: $cmd" } } @@ -229,3 +241,50 @@ function UpdateVersions([hashtable]$variables, [xml]$dependencies, [string]$deps return $updatedVars } +function Get-MSBuildPath { + param( + [switch]$Prerelease, + [string[]]$Requires + ) + + $vsInstallDir = $null + if ($env:VSINSTALLDIR -and (Test-Path $env:VSINSTALLDIR)) { + $vsInstallDir = $env:VSINSTALLDIR + Write-Verbose "Using VSINSTALLDIR=$vsInstallDir" + } + else { + $vswhere = "${env:ProgramFiles(x86)}/Microsoft Visual Studio/Installer/vswhere.exe" + Write-Verbose "Using vswhere.exe from $vswhere" + + if (-not (Test-Path $vswhere)) { + Write-Error "Missing prerequisite: could not find vswhere" + } + + [string[]] $vswhereArgs = @() + + if ($Prerelease) { + $vswhereArgs += '-prerelease' + } + + if ($Requires) { + foreach ($r in $Requires) { + $vswhereArgs += '-requires', $r + } + } + + $installs = & $vswhere -format json -version '[15.0, 16.0)' -latest -products * @vswhereArgs | ConvertFrom-Json + if (!$installs) { + Write-Error "Missing prerequisite: could not find any installations of Visual Studio" + } + + $vs = $installs | Select-Object -First 1 + $vsInstallDir = $vs.installationPath + Write-Host "Using $($vs.displayName)" + } + + $msbuild = Join-Path $vsInstallDir 'MSBuild/15.0/bin/msbuild.exe' + if (!(Test-Path $msbuild)) { + Write-Error "Missing prerequisite: could not find msbuild.exe" + } + return $msbuild +} diff --git a/src/Installers/Windows/.gitignore b/src/Installers/Windows/.gitignore new file mode 100644 index 0000000000..fe67cac916 --- /dev/null +++ b/src/Installers/Windows/.gitignore @@ -0,0 +1 @@ +ancm/ diff --git a/src/Installers/Windows/Directory.Build.props b/src/Installers/Windows/Directory.Build.props new file mode 100644 index 0000000000..096863e245 --- /dev/null +++ b/src/Installers/Windows/Directory.Build.props @@ -0,0 +1,20 @@ + + + + $([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)..\..\..\')) + $(RepositoryRoot)artifacts/ + $(RootOutputPath)bin/$(Configuration)/$(MSBuildProjectName)/ + $(BaseOutputPath) + $(RootOutputPath)obj/$(MSBuildProjectName)/ + $(BaseIntermediateOutputPath)$(Configuration)/ + $(IntermediateOutputPath)$(Platform)/ + + aspnetcore-runtime + + $(RuntimeInstallerBaseName)-internal + + + + + + diff --git a/src/Installers/Windows/Directory.Build.targets b/src/Installers/Windows/Directory.Build.targets new file mode 100644 index 0000000000..8dc63cace9 --- /dev/null +++ b/src/Installers/Windows/Directory.Build.targets @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/Installers/Windows/SharedFramework/DependencyProvider.wxs b/src/Installers/Windows/SharedFramework/DependencyProvider.wxs new file mode 100644 index 0000000000..d62c3dfe7d --- /dev/null +++ b/src/Installers/Windows/SharedFramework/DependencyProvider.wxs @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Installers/Windows/SharedFramework/Product.props b/src/Installers/Windows/SharedFramework/Product.props new file mode 100644 index 0000000000..a6a29c3f80 --- /dev/null +++ b/src/Installers/Windows/SharedFramework/Product.props @@ -0,0 +1,11 @@ + + + Microsoft ASP.NET Core Shared Framework + Microsoft ASP.NET Core $(PackageBrandingVersion) Shared Framework ($(Platform)) + AspNetCore.SharedFramework + + $(DefineConstants);ProductName=$(ProductName) + $(DefineConstants);ProductNameShort=$(ProductNameShort) + $(DefineConstants);ProductNameFolder=$(ProductNameFolder) + + diff --git a/src/Installers/Windows/SharedFramework/Product.wxs b/src/Installers/Windows/SharedFramework/Product.wxs new file mode 100644 index 0000000000..c97b12e5c4 --- /dev/null +++ b/src/Installers/Windows/SharedFramework/Product.wxs @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/SharedFramework/SharedFramework.wixproj b/src/Installers/Windows/SharedFramework/SharedFramework.wixproj new file mode 100644 index 0000000000..5dd1ce6809 --- /dev/null +++ b/src/Installers/Windows/SharedFramework/SharedFramework.wixproj @@ -0,0 +1,51 @@ + + + + + + + + AspNetCoreSharedFramework + $(RuntimeInstallerBaseName)-$(PackageVersion)-win-$(Platform) + Package + no + sfx_$(Platform).cab + C681D730-4505-42C6-9E6C-87F757C4FB32 + true + 5150;5151 + true + $(SharedFrameworkHarvestRootPath)\$(Platform)\ + $(DefineConstants);AspNetCoreSharedFrameworkSource=$(HarvestSource) + $(SharedFrameworkNamespaceGuid) + + + + + $(WixExtDir)\WixDependencyExtension.dll + WixDependencyExtension + + + $(WixExtDir)\WixNetFxExtension.dll + WixNetFxExtension + + + $(WixExtDir)\WixUtilExtension.dll + WixUtilExtension + + + $(WixExtDir)\WixUIExtension.dll + WixUIExtension + + + + + + true + CG_AspNetCoreSharedFramework + DotNetFolder + var.AspNetCoreSharedFrameworkSource + + + + + diff --git a/src/Installers/Windows/SharedFramework/Strings.wxl b/src/Installers/Windows/SharedFramework/Strings.wxl new file mode 100644 index 0000000000..ffac28752f --- /dev/null +++ b/src/Installers/Windows/SharedFramework/Strings.wxl @@ -0,0 +1,5 @@ + + + ASP.NET Core Shared Framework + ASP.NET Core Shared Framework + \ No newline at end of file diff --git a/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs b/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs new file mode 100644 index 0000000000..2ca506b46e --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Installers/Windows/SharedFrameworkBundle/DotNetLogo.bmp b/src/Installers/Windows/SharedFrameworkBundle/DotNetLogo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f652d049e83e5d3dc39d897c094562c3683befdf GIT binary patch literal 12342 zcmeI12~bm46o#YLwp!QXu2frVTSx6O&ghI*+uG?ew${4Ug*CDyECE6wge3w}C?GB< zf?5?2v>@Vw3ree~R0I__zy&0b6fh(q5F$ue`^QJ$ydhwxk}@)LnMdZn`!4r==RfD3 zdu~{?WX{K|XFqfB`2l`E@A&P<8iy8s@H}f6^-FcISiWyNl8Y!n6d(!^1&9Jf0ipm= zfG9u|APV$#1$?GBc)!KPXJ0hLXR?FmI9u^FXW=+o$^@UuT$eY@JjU2`XO8z|uImtU z*P-T2lifyG@&=n3UhX5U4CmpGuyPx2Y1sc?djP;6VOg46+}_?E^JAEBf*s&RrkvK6 z*5kg1x-JN1~U80=`k((A?b0OeZ9{_*- zw?7d%hEsvRFyl4`FzcUcsREf3yYuOwBlMLKabnY_eyIBPtlE4o>^RkbOq8fqXms_u zqh1|@Q7gt;Y&VJtIGaGRwzl?~O10}y3mgXw`BDGprDWIF)O(IuPiNH9YsF1Zo7zxS zGcMQ|YZZl)&c*1nXw#3L*6EK4^ev^8esk&ZKe@nzoR1NdYf`whgqN#x42LTb~FaAb{yEzHWs|^ zJB|?xH;5+LgL&gDcMt~87NQ}3*ExK?FD!B!ZV|IAJnFj;fNfb600+SYc;uHkBE$g3 zqd#yaA8q`h$5Wwq`vb+*V zhjUX!z6@Ky?^{kL@%BY56yG~{+m5wNEmdBP&%7FU5f-T=RfspiX!cRB1XXEOnmDOW zQHy@m8|fjblANMl%QxXzilQRTKUpnPZv8R-mALl*kb+2=%509k;)pf9DUO*A8W+@Z%&o4}pzz zietXWl&j~T7gUiCO;#KXQxoW(jEZ&e(u<_ zmX}<82uEbcW+I*uGj~tk*u7#?f^7^q5kIIo;X!24{L?p)b0QY_?N}UAr_iMNCux?kbEkl8{+ z3r@ILyud(D!~!wGIP&Wt)Yw5E2>^q6@FfhEGwl6!^%mSB`HQFV;;f?rrn@1@gwFMD zsHsOPNcB8WdhHRF6R5ZM{1cjsr#c}UhtKx|9&#oY8g8LKYM~^T{fHJSf9ju3aX^Gn zCmOsONfMhZW}qMx>21_501cR&*7;FF+aW_!kqL= gNrNar6d(!^1&9Jf0ipm=fG9u|APNu#ULFPh2K|pB%>V!Z literal 0 HcmV?d00001 diff --git a/src/Installers/Windows/SharedFrameworkBundle/Product.props b/src/Installers/Windows/SharedFrameworkBundle/Product.props new file mode 100644 index 0000000000..a77dc7a3df --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkBundle/Product.props @@ -0,0 +1,31 @@ + + + Microsoft ASP.NET Core $(PackageBrandingVersion) + + + + Shared Framework + $(BundleNameShort) - $(BundleNameSub) + $(BundleName) ($(Platform)) + Microsoft Corporation + dd_AspNetCoreSharedFramework_ + + + Microsoft + .NET Core + Microsoft ASP.NET Core $(PackageBrandingVersion) Shared Framework + $(BundleNameFull) + + + + $(DefineConstants);BundleName=$(BundleName) + $(DefineConstants);BundleNameFull=$(BundleNameFull) + $(DefineConstants);BundleNameShort=$(BundleNameShort) + $(DefineConstants);BundleNameSub=$(BundleNameSub) + $(DefineConstants);BundleManufacturer=$(BundleManufacturer) + $(DefineConstants);BundleLogPrefix=$(BundleLogPrefix) + $(DefineConstants);BundleRegManufacturer=$(BundleRegManufacturer) + $(DefineConstants);BundleRegFamily=$(BundleRegFamily) + $(DefineConstants);BundleRegName=$(BundleRegName) + + diff --git a/src/Installers/Windows/SharedFrameworkBundle/SharedFrameworkBundle.wixproj b/src/Installers/Windows/SharedFrameworkBundle/SharedFrameworkBundle.wixproj new file mode 100644 index 0000000000..e4d3697989 --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkBundle/SharedFrameworkBundle.wixproj @@ -0,0 +1,36 @@ + + + + + + + + AspNetCoreSharedFrameworkBundle + Bundle + $(RuntimeInstallerBaseName)-$(PackageVersion)-win-$(Platform) + $(SharedFrameworkNamespaceGuid) + D6C54D8B-043F-4877-B751-60E7390F9EC6 + + + + + $(WixExtDir)\WixDependencyExtension.dll + WixDependencyExtension + + + $(WixExtDir)\WixBalExtension.dll + WixBalExtension + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/SharedFrameworkBundle/thm.wxl b/src/Installers/Windows/SharedFrameworkBundle/thm.wxl new file mode 100644 index 0000000000..bb88e23d9e --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkBundle/thm.wxl @@ -0,0 +1,61 @@ + + + [BundleNameFull] Setup + [BundleNameShort] + [BundleNameSub] + Welcome + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Repair Successfully Completed + Uninstall Successfully Completed + Installation Successfully Completed + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Setup Failed + Uninstall Failed + Repair Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + \ No newline at end of file diff --git a/src/Installers/Windows/SharedFrameworkBundle/thm.xml b/src/Installers/Windows/SharedFrameworkBundle/thm.xml new file mode 100644 index 0000000000..f9323a366f --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkBundle/thm.xml @@ -0,0 +1,80 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + #(loc.SubTitle) + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + Welcome to the #(loc.Caption). + [WixBundleName] <a href="https://go.microsoft.com/fwlink/?LinkId=320539">license terms</a> and <a href="https://go.microsoft.com/fwlink/?LinkId=786378">privacy statement</a>. + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + #(loc.FilesInUseHeader) + #(loc.FilesInUseLabel) + + + + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.ModifyHeader) + + + + + + #(loc.SuccessHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.FailureHeader) + #(loc.FailureInstallHeader) + #(loc.FailureUninstallHeader) + #(loc.FailureRepairHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/src/Installers/Windows/SharedFrameworkLib/Library.wxs b/src/Installers/Windows/SharedFrameworkLib/Library.wxs new file mode 100644 index 0000000000..e3a367a7e4 --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkLib/Library.wxs @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj b/src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj new file mode 100644 index 0000000000..672ca7de66 --- /dev/null +++ b/src/Installers/Windows/SharedFrameworkLib/SharedFrameworkLib.wixproj @@ -0,0 +1,27 @@ + + + + + + AspNetCoreSharedFrameworkLib$(Platform) + $(WixlibBaseFileName)-$(PackageVersion)-win-$(Platform) + Library + true + $(SharedFrameworkNamespaceGuid) + 5244BC49-2568-4701-80A6-EAB8950AB5FA + + + + $(DefineConstants);Debug + + + + + + $(WixExtDir)\WixBalExtension.dll + WixBalExtension + + + + + diff --git a/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs b/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs new file mode 100644 index 0000000000..2b1087d3b4 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/ANCM.wxs @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/WindowsHostingBundle/Bundle.wxs b/src/Installers/Windows/WindowsHostingBundle/Bundle.wxs new file mode 100644 index 0000000000..96f43c5515 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/Bundle.wxs @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Installers/Windows/WindowsHostingBundle/DotNetCore.wxs b/src/Installers/Windows/WindowsHostingBundle/DotNetCore.wxs new file mode 100644 index 0000000000..5f017547dd --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/DotNetCore.wxs @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/WindowsHostingBundle/DotNetLogo.bmp b/src/Installers/Windows/WindowsHostingBundle/DotNetLogo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f652d049e83e5d3dc39d897c094562c3683befdf GIT binary patch literal 12342 zcmeI12~bm46o#YLwp!QXu2frVTSx6O&ghI*+uG?ew${4Ug*CDyECE6wge3w}C?GB< zf?5?2v>@Vw3ree~R0I__zy&0b6fh(q5F$ue`^QJ$ydhwxk}@)LnMdZn`!4r==RfD3 zdu~{?WX{K|XFqfB`2l`E@A&P<8iy8s@H}f6^-FcISiWyNl8Y!n6d(!^1&9Jf0ipm= zfG9u|APV$#1$?GBc)!KPXJ0hLXR?FmI9u^FXW=+o$^@UuT$eY@JjU2`XO8z|uImtU z*P-T2lifyG@&=n3UhX5U4CmpGuyPx2Y1sc?djP;6VOg46+}_?E^JAEBf*s&RrkvK6 z*5kg1x-JN1~U80=`k((A?b0OeZ9{_*- zw?7d%hEsvRFyl4`FzcUcsREf3yYuOwBlMLKabnY_eyIBPtlE4o>^RkbOq8fqXms_u zqh1|@Q7gt;Y&VJtIGaGRwzl?~O10}y3mgXw`BDGprDWIF)O(IuPiNH9YsF1Zo7zxS zGcMQ|YZZl)&c*1nXw#3L*6EK4^ev^8esk&ZKe@nzoR1NdYf`whgqN#x42LTb~FaAb{yEzHWs|^ zJB|?xH;5+LgL&gDcMt~87NQ}3*ExK?FD!B!ZV|IAJnFj;fNfb600+SYc;uHkBE$g3 zqd#yaA8q`h$5Wwq`vb+*V zhjUX!z6@Ky?^{kL@%BY56yG~{+m5wNEmdBP&%7FU5f-T=RfspiX!cRB1XXEOnmDOW zQHy@m8|fjblANMl%QxXzilQRTKUpnPZv8R-mALl*kb+2=%509k;)pf9DUO*A8W+@Z%&o4}pzz zietXWl&j~T7gUiCO;#KXQxoW(jEZ&e(u<_ zmX}<82uEbcW+I*uGj~tk*u7#?f^7^q5kIIo;X!24{L?p)b0QY_?N}UAr_iMNCux?kbEkl8{+ z3r@ILyud(D!~!wGIP&Wt)Yw5E2>^q6@FfhEGwl6!^%mSB`HQFV;;f?rrn@1@gwFMD zsHsOPNcB8WdhHRF6R5ZM{1cjsr#c}UhtKx|9&#oY8g8LKYM~^T{fHJSf9ju3aX^Gn zCmOsONfMhZW}qMx>21_501cR&*7;FF+aW_!kqL= gNrNar6d(!^1&9Jf0ipm=fG9u|APNu#ULFPh2K|pB%>V!Z literal 0 HcmV?d00001 diff --git a/src/Installers/Windows/WindowsHostingBundle/Product.props b/src/Installers/Windows/WindowsHostingBundle/Product.props new file mode 100644 index 0000000000..64492e50c9 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/Product.props @@ -0,0 +1,31 @@ + + + Microsoft .NET Core $(PackageBrandingVersion) + + + + Windows Server Hosting + $(BundleNameShort) - $(BundleNameSub) + $(BundleName) ($(Platform)) + Microsoft Corporation + dd_DotNetCoreWinSvrHosting + + + Microsoft + .NET Core + Microsoft .NET Core $(PackageBrandingVersion) - Windows Server Hosting + $(BundleNameFull) + + + + $(DefineConstants);BundleName=$(BundleName) + $(DefineConstants);BundleNameFull=$(BundleNameFull) + $(DefineConstants);BundleNameShort=$(BundleNameShort) + $(DefineConstants);BundleNameSub=$(BundleNameSub) + $(DefineConstants);BundleManufacturer=$(BundleManufacturer) + $(DefineConstants);BundleLogPrefix=$(BundleLogPrefix) + $(DefineConstants);BundleRegManufacturer=$(BundleRegManufacturer) + $(DefineConstants);BundleRegFamily=$(BundleRegFamily) + $(DefineConstants);BundleRegName=$(BundleRegName) + + diff --git a/src/Installers/Windows/WindowsHostingBundle/Product.targets b/src/Installers/Windows/WindowsHostingBundle/Product.targets new file mode 100644 index 0000000000..038dd250ff --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/Product.targets @@ -0,0 +1,90 @@ + + + $(IntermediateOutputPath)d\ + $(BaseIntermediateOutputPath) + $(DefineConstants);DepsPath=$(DepsPath) + + + + + + x64 + DotNetRedistLtsInstallerx64 + $(MicrosoftNETCoreAppPackageVersion) + + + x86 + DotNetRedistLtsInstallerx86 + $(MicrosoftNETCoreAppPackageVersion) + + + + + + https://dotnetcli.azureedge.net/dotnet/ + $(DotNetAssetRootUrl)/ + + + + + dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-win-x64.exe + + + dotnet-runtime-$(MicrosoftNETCoreAppPackageVersion)-win-x86.exe + + + + + + + + + + + + + + + + + + + + + + + + + DotNetRedistLtsInstallerProductVersion%(Platforms.Identity) + DotNetRedistLtsInstallerProductCode%(Platforms.Identity) + DotNetRedistLtsInstallerUpgradeCode%(Platforms.Identity) + + + + + + + + + + + + + + + + $(DefineConstants);DotNetRedistLtsInstallerx64=$(DotNetRedistLtsInstallerx64) + $(DefineConstants);DotNetRedistLtsInstallerProductVersionx64=$(DotNetRedistLtsInstallerProductVersionx64) + $(DefineConstants);DotNetRedistLtsInstallerProductCodex64=$(DotNetRedistLtsInstallerProductCodex64) + $(DefineConstants);DotNetRedistLtsInstallerUpgradeCodex64=$(DotNetRedistLtsInstallerUpgradeCodex64) + $(DefineConstants);DotNetRedistLtsInstallerx86=$(DotNetRedistLtsInstallerx86) + $(DefineConstants);DotNetRedistLtsInstallerProductVersionx86=$(DotNetRedistLtsInstallerProductVersionx86) + $(DefineConstants);DotNetRedistLtsInstallerProductCodex86=$(DotNetRedistLtsInstallerProductCodex86) + $(DefineConstants);DotNetRedistLtsInstallerUpgradeCodex86=$(DotNetRedistLtsInstallerUpgradeCodex86) + + + diff --git a/src/Installers/Windows/WindowsHostingBundle/Strings.wxl b/src/Installers/Windows/WindowsHostingBundle/Strings.wxl new file mode 100644 index 0000000000..069fdd7451 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/Strings.wxl @@ -0,0 +1,10 @@ + + + Some features that were selected requires .NET 4.5.1. Please install .NET 4.5.1, then install this product again. + This product requires IIS 7.5. Please install IIS, then install this product again. + This product requires Visual Studio 2015 Update 2 or later. Please install Visual Studio 2015 Update 2 or later, then install this product again. + This product requires Visual Studio 2015 Update 3 or later. Please install Visual Studio 2015 Update 3 or later, then install this product again. + Setup has detected that Visual Studio 2015 Update 3 may not be completely installed. Please repair Visual Studio 2015 Update 3, then install this product again. + This product requires the Web Developer Tools feature in Visual Studio 2015. Please enable the feature by going to Programs and Features in Windows, then modify Visual Studio 2015. + This product requires Visual Studio 2015 or Visual Studio Express 2015 for Web to be installed. Please install the missing product, then install this product again. + diff --git a/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj b/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj new file mode 100644 index 0000000000..70d2362433 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/WindowsHostingBundle.wixproj @@ -0,0 +1,43 @@ + + + + + + + + + WindowsServerHostingBundle + dotnet-hosting-$(PackageVersion)-win + 6F1B115C-1903-40CB-837D-7961AB610F4E + Bundle + x86 + + + $(HostingBundleNamespaceGuid) + + + + + + + $(WixExtDir)\WixUtilExtension.dll + WixUtilExtension + + + $(WixExtDir)\WixDependencyExtension.dll + WixDependencyExtension + + + $(WixExtDir)\WixBalExtension.dll + WixBalExtension + + + + + + + + + + + diff --git a/src/Installers/Windows/WindowsHostingBundle/thm.wxl b/src/Installers/Windows/WindowsHostingBundle/thm.wxl new file mode 100644 index 0000000000..87ae937c7d --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/thm.wxl @@ -0,0 +1,61 @@ + + + [WixBundleName] Setup + [BundleNameShort] + [BundleNameSub] + Welcome + Setup will install [WixBundleName] on your computer. Click install to continue, options to set the install directory or Close to exit. + Version [WixBundleVersion] + Are you sure you want to cancel? + Previous version + Setup Help + /install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or + creates a complete local copy of the bundle in directory. Install is the default. + +/passive | /quiet - displays minimal UI with no prompts or displays no UI and + no prompts. By default UI and all prompts are displayed. + +/norestart - suppress any attempts to restart. By default UI will prompt before restart. +/log log.txt - logs to a specific file. By default a log file is created in %TEMP%. + &Close + [WixBundleName] <a href="#">license terms</a>. + I &agree to the license terms and conditions + &Options + &Install + &Close + Setup Options + Install location: + &Browse + &OK + &Cancel + Setup Progress + Processing: + Initializing... + &Cancel + Modify Setup + &Repair + &Uninstall + &Close + Repair Successfully Completed + Uninstall Successfully Completed + Installation Successfully Completed + Setup Successful + &Launch + You must restart your computer before you can use the software. + &Restart + &Close + Setup Failed + Setup Failed + Uninstall Failed + Repair Failed + One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>. + You must restart your computer to complete the rollback of the software. + &Restart + &Close + Files In Use + The following applications are using files that need to be updated: + Close the &applications and attempt to restart them. + &Do not close applications. A reboot will be required. + &OK + &Cancel + \ No newline at end of file diff --git a/src/Installers/Windows/WindowsHostingBundle/thm.xml b/src/Installers/Windows/WindowsHostingBundle/thm.xml new file mode 100644 index 0000000000..8ca4905b72 --- /dev/null +++ b/src/Installers/Windows/WindowsHostingBundle/thm.xml @@ -0,0 +1,84 @@ + + + #(loc.Caption) + Segoe UI + Segoe UI + Segoe UI + Segoe UI + Segoe UI + + + #(loc.Title) + #(loc.SubTitle) + + + #(loc.HelpHeader) + #(loc.HelpText) + + + + Welcome to the #(loc.Caption). + Please restart IIS after the installation completes. You can find additional information <a href="https://go.microsoft.com/fwlink/?LinkId=798277">here</a>. + IIS is not enabled on this machine. If you intend to run ASP.NET Core applications with IIS, you must install IIS before running this installer. You can find additional information <a href="https://go.microsoft.com/fwlink/?LinkId=798277">here</a>. + [WixBundleName] <a href="https://go.microsoft.com/fwlink/?LinkId=320539">license terms</a> and <a href="https://go.microsoft.com/fwlink/?LinkId=786378">privacy statement</a>. + #(loc.InstallAcceptCheckbox) + + + + + + #(loc.OptionsHeader) + #(loc.OptionsLocationLabel) + + + + + + + #(loc.FilesInUseHeader) + #(loc.FilesInUseLabel) + + + + + + + + + + #(loc.ProgressHeader) + #(loc.ProgressLabel) + #(loc.OverallProgressPackageText) + + + + + #(loc.ModifyHeader) + Please restart IIS after the installation completes. You can find additional information <a href="https://go.microsoft.com/fwlink/?LinkId=798277">here</a>. + IIS is not enabled on this machine. If you intend to run ASP.NET Core applications with IIS, you must install IIS before running this installer. You can find additional information <a href="https://go.microsoft.com/fwlink/?LinkId=798277">here</a>. + + + + + + #(loc.SuccessHeader) + #(loc.SuccessInstallHeader) + #(loc.SuccessRepairHeader) + #(loc.SuccessUninstallHeader) + + #(loc.SuccessRestartText) + + + + + #(loc.FailureHeader) + #(loc.FailureInstallHeader) + #(loc.FailureUninstallHeader) + #(loc.FailureRepairHeader) + #(loc.FailureHyperlinkLogText) + + #(loc.FailureRestartText) + + + + \ No newline at end of file diff --git a/src/Installers/Windows/WindowsInstallers.proj b/src/Installers/Windows/WindowsInstallers.proj new file mode 100644 index 0000000000..bf0011cca0 --- /dev/null +++ b/src/Installers/Windows/WindowsInstallers.proj @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Installers/Windows/Wix.props b/src/Installers/Windows/Wix.props new file mode 100644 index 0000000000..61c4ca9f6c --- /dev/null +++ b/src/Installers/Windows/Wix.props @@ -0,0 +1,38 @@ + + + + $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion).0 + + Release + x64 + ENU + en-US + $(RootOutputPath)bin/$(Configuration)/installers/ + $(BaseOutputPath) + + + + + -fv + ICE61 + 1033 + + + + false + + + E1FD1271-E0F0-4B8B-B4BE-01F2EBA58F4E + C43D5520-11B3-4D62-B6FE-5D6840B04101 + + + + $(DefineConstants);files=$(MSBuildThisFileDirectory)files + $(DefineConstants);Version=$(Version) + $(DefineConstants);Culture=$(Cultures) + $(DefineConstants);MajorVersion=$(AspNetCoreMajorVersion) + $(DefineConstants);MinorVersion=$(AspNetCoreMinorVersion) + $(DefineConstants);PackageVersion=$(PackageVersion) + + + diff --git a/src/Installers/Windows/Wix.targets b/src/Installers/Windows/Wix.targets new file mode 100644 index 0000000000..a40275cd06 --- /dev/null +++ b/src/Installers/Windows/Wix.targets @@ -0,0 +1,42 @@ + + + $(ProductName) + Microsoft.$(ProductNameShort)_$(Platform)_$(Lang),v$(PackageVersion) + $(DefineConstants);DepProviderKey=$(DepProviderKey) + + + + $(Version);$(Platform) + $(GuidInputs);$(BuildNumber) + + + + + + + + + + + + + + + + $(DefineConstants);ProductCode=$(ProductCode);UpgradeCode=$(UpgradeCode) + + + + + + + + + + + + + $(DefineConstants);BundleProviderKey=$(BundleProviderKey);BundleUpgradeCode=$(BundleUpgradeCode) + + + diff --git a/src/Installers/Windows/build.ps1 b/src/Installers/Windows/build.ps1 new file mode 100644 index 0000000000..1c81d92339 --- /dev/null +++ b/src/Installers/Windows/build.ps1 @@ -0,0 +1,89 @@ +# +# This script requires internal-only access to the code which generates ANCM installers. +# + +#requires -version 4 +[cmdletbinding()] +param( + [string]$Configuration = 'Debug', + [Parameter(Mandatory = $true)] + [Alias("x86")] + [string]$Runtime86Zip, + [Parameter(Mandatory = $true)] + [Alias("x64")] + [string]$Runtime64Zip, + [string]$BuildNumber = 't000', + + [string]$AccessTokenSuffix = $null, + [string]$AssetRootUrl = $null, + + [switch]$clean +) + +$ErrorActionPreference = 'Stop' +$repoRoot = Resolve-Path "$PSScriptRoot/../../../" +Import-Module -Scope Local "$repoRoot/scripts/common.psm1" -Force +$msbuild = Get-MSBuildPath -Prerelease -requires 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64' + +$harvestRoot = "$repoRoot/obj/sfx/" +if ($clean) { + Remove-Item -Recurse -Force $harvestRoot -ErrorAction Ignore | Out-Null +} + +New-Item "$harvestRoot/x86", "$harvestRoot/x64" -ItemType Directory -ErrorAction Ignore | Out-Null + +if (-not (Test-Path "$harvestRoot/x86/shared/")) { + Expand-Archive $Runtime86Zip -DestinationPath "$harvestRoot/x86" +} + +if (-not (Test-Path "$harvestRoot/x64/shared/")) { + Expand-Archive $Runtime64Zip -DestinationPath "$harvestRoot/x64" +} + +Push-Location $PSScriptRoot +try { + Invoke-Block { & $msbuild ` + tasks/InstallerTasks.csproj ` + -nologo ` + -m ` + -v:m ` + -nodeReuse:false ` + -restore ` + -t:Build ` + "-p:Configuration=$Configuration" + } + + [string[]] $msbuildArgs = @() + + if ($clean) { + $msbuildArgs += '-t:Clean' + } + + if ($AssetRootUrl) { + $msbuildArgs += "-p:DotNetAssetRootUrl=$AssetRootUrl" + } + + if ($AccessTokenSuffix) { + $msbuildArgs += "-p:DotNetAccessTokenSuffix=$AccessTokenSuffix" + } + + $msbuildArgs += '-t:Build' + + Invoke-Block { & $msbuild ` + WindowsInstallers.proj ` + -restore ` + -nologo ` + -m ` + -v:m ` + -nodeReuse:false ` + -clp:Summary ` + "-p:SharedFrameworkHarvestRootPath=$repoRoot/obj/sfx/" ` + "-p:Configuration=$Configuration" ` + "-p:BuildNumber=$BuildNumber" ` + -bl ` + @msbuildArgs + } +} +finally { + Pop-Location +} diff --git a/src/Installers/Windows/clone_and_build_ancm.ps1 b/src/Installers/Windows/clone_and_build_ancm.ps1 new file mode 100644 index 0000000000..8cffdbe3f2 --- /dev/null +++ b/src/Installers/Windows/clone_and_build_ancm.ps1 @@ -0,0 +1,117 @@ +# +# This builds installers for AspNetCoreModule. +# This script requires internal-only access to the code which generates ANCM installers. +# +#requires -version 4 +[cmdletbinding()] +param( + [string]$GitCredential, + [string]$Configuration = 'Release', + [string]$DepsZip, + [string]$BuildNumber = 't000', + [string]$AncmSourceBranch = 'release/2.2' +) + +$ErrorActionPreference = 'Stop' + +$repoRoot = Resolve-Path "$PSScriptRoot/../../../" + +Import-Module -Scope Local "$repoRoot/scripts/common.psm1" -Force + +$msbuild = Get-MSBuildPath -Prerelease -requires 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64' + +# get wix +[version] $wixVer = '3.11.1' +$wixToolSetRoot = "$repoRoot/obj/tools/wix/$wixVer/" +$downloadFile = "$wixToolSetRoot/wix-binaries.zip" +if (-not (Test-Path $downloadFile)) { + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $downloadUrl = "https://github.com/wixtoolset/wix3/releases/download/wix$($wixVer.Major)$($wixVer.Minor)$($wixVer.Build)rtm/wix$($wixVer.Major)$($wixVer.Minor)-binaries.zip" + Write-Host "Downloading fix $wixVer from $downloadUrl" + New-Item -Type Directory $wixToolSetRoot -ErrorAction Ignore | Out-Null + Invoke-WebRequest -UseBasicParsing -Uri $downloadUrl -OutFile $downloadFile + Expand-Archive $downloadFile -DestinationPath $wixToolSetRoot +} + +# get nuget.exe +$nuget = "$repoRoot/obj/tools/nuget.exe" +if (-not (Test-Path $nuget)) { + Invoke-WebRequest -UseBasicParsing -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile $nuget +} + +if (-not $DepsZip) { + $DepsZip = "$repoRoot/modules/IISIntegration/artifacts/build/AspNetCoreModule.zip" +} + +$deps = "$repoRoot/obj/ancm" +Remove-Item -Recurse $deps -Force -ErrorAction Ignore | Out-Null +New-Item -ItemType Directory -ErrorAction Ignore $deps | Out-Null +Expand-Archive $DepsZip -DestinationPath $deps -Force + +Push-Location $PSScriptRoot + +try { + if ($GitCredential) { + # Disable prompts for passwords + $env:GIT_TERMINAL_PROMPT = 0 + } + + if (-not (Test-Path ancm/)) { + $gitSource = "https://${GitCredential}@devdiv.visualstudio.com/DefaultCollection/DevDiv/_git" + Invoke-Block { + & git clone $gitSource/AspNetCoreModule-Setup ` + --branch $AncmSourceBranch ` + ancm/ + } + Invoke-Block { + & git clone $gitSource/IIS-Setup ` + ancm/IIS-Setup + } + Invoke-Block { + & git clone $gitSource/IIS-Common ` + ancm/IIS-Common + } + Invoke-Block { + & git clone $gitSource/IIS-Common ` + ancm/IIS-Setup/IIS-Common + } + } + + Invoke-Block -WorkingDir ancm/ { + & git submodule update --init --recursive + } + + Invoke-Block -WorkingDir ancm/ { + & $nuget restore ANCM-Setup.sln + } + + Invoke-Block -WorkingDir ancm/IIS-Common/lib/ { + & $nuget restore packages.config + } + + Invoke-Block { & $msbuild ` + ancm/Setup.msbuild ` + -m ` + -v:m ` + -nodeReuse:false ` + -clp:Summary ` + "-t:BuildCustomAction;Build" ` + "-p:PrebuiltAspnetCoreRoot=$deps" ` + "-p:WixToolPath=$wixToolSetRoot" ` + "-p:WixTargetsPath=$wixToolSetRoot\Wix.targets" ` + "-p:WixTasksPath=$wixToolSetRoot\wixtasks.dll" ` + "-p:WixNativeCATargetsPath=$wixToolSetRoot\sdk\wix.nativeca.targets" ` + "-p:Configuration=$Configuration" ` + "-p:BuildNumber=$BuildNumber" + } + + $outputPath = "$repoRoot/artifacts/bin/$Configuration/installers/en-US/" + New-Item $outputPath -ItemType Directory -ErrorAction Ignore | Out-Null + Copy-Item -Recurse "ancm/bin/AspNetCoreModuleV1/$Configuration/x64/en-us/*" $outputPath + Copy-Item -Recurse "ancm/bin/AspNetCoreModuleV1/$Configuration/x86/en-us/*" $outputPath + Copy-Item -Recurse "ancm/bin/AspNetCoreModuleV2/$Configuration/x64/en-us/*" $outputPath + Copy-Item -Recurse "ancm/bin/AspNetCoreModuleV2/$Configuration/x86/en-us/*" $outputPath +} +finally { + Pop-Location +} diff --git a/src/Installers/Windows/files/eula.rtf b/src/Installers/Windows/files/eula.rtf new file mode 100644 index 0000000000..70fb842c6c --- /dev/null +++ b/src/Installers/Windows/files/eula.rtf @@ -0,0 +1,113 @@ +{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Calibri;}{\f3\fnil\fcharset2 Symbol;}} +{\colortbl ;\red31\green73\blue125;\red0\green0\blue255;} +{\*\listtable +{\list\listhybrid +{\listlevel\levelnfc0\leveljc0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\jclisttab\tx360} +{\listlevel\levelnfc4\leveljc0\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\jclisttab\tx363} +{\listlevel\levelnfc2\leveljc0\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\jclisttab\tx720}\listid1 } +{\list\listhybrid +{\listlevel\levelnfc0\leveljc0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\jclisttab\tx363} +{\listlevel\levelnfc4\leveljc0\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\jclisttab\tx363}\listid2 }} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}} +{\*\generator Riched20 6.3.9600}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 +\pard\nowidctlpar\sb120\sa120\b\f0\fs24 MICROSOFT SOFTWARE LICENSE TERMS\par + +\pard\brdrb\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 MICROSOFT .NET LIBRARY \par + +\pard\nowidctlpar\sb120\sa120\fs19 These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120\b0 updates,\par +{\pntext\f3\'B7\tab}supplements,\par +{\pntext\f3\'B7\tab}Internet-based services, and\par +{\pntext\f3\'B7\tab}support services\par + +\pard\nowidctlpar\sb120\sa120\b for this software, unless other terms accompany those items. If so, those terms apply.\par +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.\par + +\pard\brdrt\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.\par + +\pard +{\listtext\f0 1.\tab}\jclisttab\tx360\ls1\nowidctlpar\fi-357\li357\sb120\sa120 INSTALLATION AND USE RIGHTS. \par + +\pard +{\listtext\f0 a.\tab}\jclisttab\tx363\ls1\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 Installation and Use.\b0\fs20 You may install and use any number of copies of the software to design, develop and test your programs.\par +{\listtext\f0 b.\tab}\b\fs19 Third Party Programs.\b0\fs20 The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only.\b\fs19\par + +\pard +{\listtext\f0 2.\tab}\jclisttab\tx360\ls1\nowidctlpar\fi-357\li357\sb120\sa120\fs20 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\par + +\pard +{\listtext\f0 a.\tab}\jclisttab\tx363\ls1\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 DISTRIBUTABLE CODE.\~ \b0 The software is comprised of Distributable Code. \f1\ldblquote\f0 Distributable Code\f1\rdblquote\f0 is code that you are permitted to distribute in programs you develop if you comply with the terms below.\b\par + +\pard +{\listtext\f0 i.\tab}\jclisttab\tx720\ls1\ilvl2\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077 Right to Use and Distribute. \par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 You may copy and distribute the object code form of the software.\par +{\pntext\f3\'B7\tab}Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.\par + +\pard\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077\b ii.\tab Distribution Requirements.\b0 \b For any Distributable Code you distribute, you must\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 add significant primary functionality to it in your programs;\par +{\pntext\f3\'B7\tab}require distributors and external end users to agree to terms that protect it at least as much as this agreement;\par +{\pntext\f3\'B7\tab}display your valid copyright notice on your programs; and\par +{\pntext\f3\'B7\tab}indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote fees, related to the distribution or use of your programs.\par + +\pard\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077\b iii.\tab Distribution Restrictions.\b0 \b You may not\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 alter any copyright, trademark or patent notice in the Distributable Code;\par +{\pntext\f3\'B7\tab}use Microsoft\rquote s trademarks in your programs\rquote names or in a way that suggests your programs come from or are endorsed by Microsoft;\par +{\pntext\f3\'B7\tab}include Distributable Code in malicious, deceptive or unlawful programs; or\par +{\pntext\f3\'B7\tab}modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-358\li1792\sb120\sa120 the code be disclosed or distributed in source code form; or\cf1\f2\par +{\pntext\f3\'B7\tab}\cf0\f0 others have the right to modify it.\cf1\f2\par + +\pard\nowidctlpar\fi-357\li357\sb120\sa120\cf0\b\f0 3.\tab\fs19 SCOPE OF LICENSE. \b0 The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120 work around any technical limitations in the software;\par +{\pntext\f3\'B7\tab}reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;\par +{\pntext\f3\'B7\tab}publish the software for others to copy;\par +{\pntext\f3\'B7\tab}rent, lease or lend the software;\par +{\pntext\f3\'B7\tab}transfer the software or this agreement to any third party; or\par +{\pntext\f3\'B7\tab}use the software for commercial software hosting services.\par + +\pard\nowidctlpar\fi-357\li357\sb120\sa120\b\fs20 4.\tab\fs19 BACKUP COPY. \b0 You may make one backup copy of the software. You may use it only to reinstall the software.\par +\b\fs20 5.\tab\fs19 DOCUMENTATION. \b0 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.\par +\b\fs20 6.\tab\fs19 EXPORT RESTRICTIONS. \b0 The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see {\fs20{\field{\*\fldinst{HYPERLINK www.microsoft.com/exporting }}{\fldrslt{www.microsoft.com/exporting\ul0\cf0}}}}\f0\fs19 .\fs20\par +\b 7.\tab\fs19 SUPPORT SERVICES. \b0 Because this software is \ldblquote as is,\rdblquote we may not provide support services for it.\par +\b\fs20 8.\tab\fs19 ENTIRE AGREEMENT. \b0 This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\par +\b\fs20 9.\tab\fs19 APPLICABLE LAW.\par + +\pard +{\listtext\f0 a.\tab}\jclisttab\tx363\ls2\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 United States. \b0 If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\par +{\listtext\f0 b.\tab}\b Outside the United States. If you acquired the software in any other country, the laws of that country apply.\par + +\pard +{\pntext\f0 1.\tab}{\*\pn\pnlvlbody\pnf0\pnindent360\pnstart1\pndec{\pntxta.}} +\nowidctlpar\fi-357\li357\sb120\sa120 LEGAL EFFECT. \b0 This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\par +{\pntext\f0 2.\tab}\b DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \ldblquote AS-IS.\rdblquote YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\par + +\pard\nowidctlpar\li357\sb120\sa120 FOR AUSTRALIA \endash YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.\par + +\pard\nowidctlpar\fi-357\li357\sb120\sa120\fs20 12.\tab\fs19 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.\par + +\pard\nowidctlpar\li357\sb120\sa120\b0 This limitation applies to\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120 anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\par +{\pntext\f3\'B7\tab}claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\par + +\pard\nowidctlpar\sb120\sa120 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.\par +\lang9 Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French.\par +Remarque : Ce logiciel \'e9tant distribu\'e9 au Qu\'e9bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7ais.\par +\b\lang1033 EXON\'c9RATION DE GARANTIE. \b0 Le logiciel vis\'e9 par une licence est offert \'ab tel quel \'bb. Toute utilisation de ce logiciel est \'e0 votre seule risque et p\'e9ril. Microsoft n\rquote accorde aucune autre garantie expresse. Vous pouvez b\'e9n\'e9ficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9 marchande, d\rquote ad\'e9quation \'e0 un usage particulier et d\rquote absence de contrefa\'e7on sont exclues.\par +\b LIMITATION DES DOMMAGES-INT\'c9R\'caTS ET EXCLUSION DE RESPONSABILIT\'c9 POUR LES DOMMAGES. \b0 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9tendre \'e0 aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9ciaux, indirects ou accessoires et pertes de b\'e9n\'e9fices.\par +\lang9 Cette limitation concerne :\par + +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\li720\sb120\sa120 tout ce qui est reli\'e9 au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et\par +{\pntext\f3\'B7\tab}les r\'e9clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9 stricte, de n\'e9gligence ou d\rquote une autre faute dans la limite autoris\'e9e par la loi en vigueur.\par + +\pard\nowidctlpar\sb120\sa120 Elle s\rquote applique \'e9galement, m\'eame si Microsoft connaissait ou devrait conna\'eetre l\rquote\'e9ventualit\'e9 d\rquote un tel dommage. Si votre pays n\rquote autorise pas l\rquote exclusion ou la limitation de responsabilit\'e9 pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\rquote exclusion ci-dessus ne s\rquote appliquera pas \'e0 votre \'e9gard.\par +\b\lang1033 EFFET JURIDIQUE. \b0 Le pr\'e9sent contrat d\'e9crit certains droits juridiques. Vous pourriez avoir d\rquote autres droits pr\'e9vus par les lois de votre pays. Le pr\'e9sent contrat ne modifie pas les droits que vous conf\'e8rent les lois de votre pays si celles-ci ne le permettent pas.\par +\b\fs20\lang1036\par +} + \ No newline at end of file diff --git a/src/Installers/Windows/tasks/GenerateGuid.cs b/src/Installers/Windows/tasks/GenerateGuid.cs new file mode 100644 index 0000000000..f6e8039864 --- /dev/null +++ b/src/Installers/Windows/tasks/GenerateGuid.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace RepoTasks +{ + public class GenerateGuid : Task + { + [Output] + public string Guid { get; private set; } + + [Required] + public string NamespaceGuid { get; set; } + + [Required] + public ITaskItem[] Values { get; set; } + + public override bool Execute() + { + try + { + var value = string.Join(",", Values.Select(o => o.ItemSpec).ToArray()).ToLowerInvariant(); + + Guid = Uuid.Create(new Guid(NamespaceGuid), value).ToString(); + } + catch (Exception e) + { + Log.LogErrorFromException(e); + } + + return !Log.HasLoggedErrors; + } + } +} diff --git a/src/Installers/Windows/tasks/GetMsiProperty.cs b/src/Installers/Windows/tasks/GetMsiProperty.cs new file mode 100644 index 0000000000..90f3cd3d24 --- /dev/null +++ b/src/Installers/Windows/tasks/GetMsiProperty.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Microsoft.Deployment.WindowsInstaller.Package; + +namespace RepoTasks +{ + public class GetMsiProperty : Task + { + [Required] + public string InstallPackage { get; set; } + + [Required] + public string Property { get; set; } + + [Output] + public string Value { get; set; } + + public override bool Execute() + { + try + { + using (var package = new InstallPackage(InstallPackage, 0)) + { + Value = package.Property[Property]; + } + } + catch (Exception exception) + { + Log.LogErrorFromException(exception); + } + return !Log.HasLoggedErrors; + } + } +} diff --git a/src/Installers/Windows/tasks/InstallerTasks.csproj b/src/Installers/Windows/tasks/InstallerTasks.csproj new file mode 100644 index 0000000000..a6d3ce18f1 --- /dev/null +++ b/src/Installers/Windows/tasks/InstallerTasks.csproj @@ -0,0 +1,23 @@ + + + + net461 + false + false + + + + + + + + + + $(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.dll + + + $(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.Package.dll + + + + diff --git a/src/Installers/Windows/tasks/Uuid.cs b/src/Installers/Windows/tasks/Uuid.cs new file mode 100644 index 0000000000..8083117d38 --- /dev/null +++ b/src/Installers/Windows/tasks/Uuid.cs @@ -0,0 +1,79 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Net; +using System.Security.Cryptography; +using System.Text; + +namespace RepoTasks +{ + /// + /// Implementation of RFC 4122 - A Universally Unique Identifier (UUID) URN Namespace. + /// + internal sealed class Uuid + { + /// + /// Generates a version 3 UUID given a namespace UUID and name. This is based on the algorithm described in + /// RFC 4122 (http://www.apps.ietf.org/rfc/rfc4122.html), section 4.3. + /// + /// + /// + /// + public static Guid Create(Guid namespaceId, string name) + { + // 1. Convert the name to a canonical sequence of octets (as defined by the standards or conventions of its name space); put the name space ID in network byte order. + byte[] namespaceBytes = namespaceId.ToByteArray(); + // Octet 0-3 + int timeLow = IPAddress.HostToNetworkOrder(BitConverter.ToInt32(namespaceBytes, 0)); + // Octet 4-5 + short timeMid = IPAddress.HostToNetworkOrder(BitConverter.ToInt16(namespaceBytes, 4)); + // Octet 6-7 + short timeHiVersion = IPAddress.HostToNetworkOrder(BitConverter.ToInt16(namespaceBytes, 6)); + + // 2. Compute the hash of the namespace ID concatenated with the name + byte[] nameBytes = Encoding.Unicode.GetBytes(name); + byte[] hashBuffer = new byte[namespaceBytes.Length + nameBytes.Length]; + + Buffer.BlockCopy(BitConverter.GetBytes(timeLow), 0, hashBuffer, 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(timeMid), 0, hashBuffer, 4, 2); + Buffer.BlockCopy(BitConverter.GetBytes(timeHiVersion), 0, hashBuffer, 6, 2); + Buffer.BlockCopy(namespaceBytes, 8, hashBuffer, 8, 8); + Buffer.BlockCopy(nameBytes, 0, hashBuffer, 16, nameBytes.Length); + byte[] hash; + + using (SHA256 sha256 = new SHA256Managed()) + { + hash = sha256.ComputeHash(hashBuffer); + } + + Array.Resize(ref hash, 16); + + // 3. Set octets zero through 3 of the time_low field to octets zero through 3 of the hash. + timeLow = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(hash, 0)); + Buffer.BlockCopy(BitConverter.GetBytes(timeLow), 0, hash, 0, 4); + + // 4. Set octets zero and one of the time_mid field to octets 4 and 5 of the hash. + timeMid = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(hash, 4)); + Buffer.BlockCopy(BitConverter.GetBytes(timeMid), 0, hash, 4, 2); + + // 5. Set octets zero and one of the time_hi_and_version field to octets 6 and 7 of the hash. + timeHiVersion = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(hash, 6)); + + // 6. Set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3. + timeHiVersion = (short)((timeHiVersion & 0x0fff) | 0x3000); + Buffer.BlockCopy(BitConverter.GetBytes(timeHiVersion), 0, hash, 6, 2); + + // 7. Set the clock_seq_hi_and_reserved field to octet 8 of the hash. + // 8. Set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively. + hash[8] = (byte)((hash[8] & 0x3f) | 0x80); + + // Steps 9-11 are essentially no-ops, but provided for completion sake + // 9. Set the clock_seq_low field to octet 9 of the hash. + // 10. Set octets zero through five of the node field to octets 10 through 15 of the hash. + // 11. Convert the resulting UUID to local byte order. + + return new Guid(hash); + } + } +} diff --git a/version.props b/version.props index b2e7e63c8d..8fe06ca125 100644 --- a/version.props +++ b/version.props @@ -9,6 +9,7 @@ $(VersionPrefix) Preview 1 + $(PackageBrandingVersion) Build $(BuildNumber) 0.2.0 alpha1