Create WindowsDesktop sharedfx bundle installer (dotnet/core-setup#7540)
authorDavis Goodin <dagood@users.noreply.github.com>
Fri, 2 Aug 2019 16:00:46 +0000 (11:00 -0500)
committerGitHub <noreply@github.com>
Fri, 2 Aug 2019 16:00:46 +0000 (11:00 -0500)
* Copy ExecWithRetries from BuildTools

Adds working dir, log importance to ExecWithRetries. Also Inline attemptMessage and add log importance comment.

* Add WindowsDesktop sfx bundle installer, refactor

Adds bundle creation support to the packaging-tools, and factors the framework pack and runtime WiX files into a single, more flexible, "product" set of WiX files.

The old MSI generation directory is removed entirely: with the new "product" WiX files, the host and hostfxr MSI creation can move to the new system. The VS insertion nupkg generation code is also ported from PowerShell to MSBuild to fit the new system.

The old system is still used for some macOS pkgs and the macOS bundle installer, some Debian/RPM packages, and some tarballs/zips.

Commit migrated from https://github.com/dotnet/core-setup/commit/ccf0024ba099103a5b759613c48b8cd46af8754a

92 files changed:
src/installer/Subsets.props
src/installer/pkg/Directory.Build.props
src/installer/pkg/Directory.Build.targets
src/installer/pkg/packaging-tools/acquire-nuget-exe/acquire-nuget-exe.proj [new file with mode: 0644]
src/installer/pkg/packaging-tools/framework.bundle.props [new file with mode: 0644]
src/installer/pkg/packaging-tools/framework.bundle.targets [new file with mode: 0644]
src/installer/pkg/packaging-tools/framework.packaging.props
src/installer/pkg/packaging-tools/framework.packaging.targets
src/installer/pkg/packaging-tools/framework.sharedfx.props
src/installer/pkg/packaging-tools/framework.sharedfx.targets
src/installer/pkg/packaging-tools/installer.targets
src/installer/pkg/packaging-tools/packaging-tools.props
src/installer/pkg/packaging-tools/packaging-tools.targets
src/installer/pkg/packaging-tools/windows/bundle/bundle.wxs [new file with mode: 0644]
src/installer/pkg/packaging-tools/windows/bundle/dummyEula.rtf [moved from src/installer/pkg/packaging/windows/sharedframework/dummyEula.rtf with 100% similarity]
src/installer/pkg/packaging-tools/windows/eula.rtf [moved from src/installer/pkg/packaging/windows/eula.rtf with 100% similarity]
src/installer/pkg/packaging-tools/windows/pack/product.wxs [deleted file]
src/installer/pkg/packaging-tools/windows/product/breadcrumbstorefolder.wxs [moved from src/installer/pkg/packaging-tools/windows/sharedFramework/breadcrumbstorefolder.wxs with 100% similarity]
src/installer/pkg/packaging-tools/windows/product/product.common.wxi [moved from src/installer/pkg/packaging-tools/windows/product.common.wxi with 100% similarity]
src/installer/pkg/packaging-tools/windows/product/product.wxs [moved from src/installer/pkg/packaging-tools/windows/sharedFramework/product.wxs with 52% similarity]
src/installer/pkg/packaging-tools/windows/product/provider.wxs [moved from src/installer/pkg/packaging/windows/host/provider.wxs with 88% similarity]
src/installer/pkg/packaging-tools/windows/product/registrykeys.wxs [new file with mode: 0644]
src/installer/pkg/packaging-tools/windows/product/sharedfxdir.wxs [new file with mode: 0644]
src/installer/pkg/packaging-tools/windows/product/werrelatedkeys.wxs [moved from src/installer/pkg/packaging-tools/windows/sharedFramework/werrelatedkeys.wxs with 100% similarity]
src/installer/pkg/packaging-tools/windows/provider.wxs [deleted file]
src/installer/pkg/packaging-tools/windows/sharedFramework/registrykeys.wxs [deleted file]
src/installer/pkg/packaging-tools/windows/vs/VS.Redist.Common.Component.nuspec [moved from src/installer/pkg/packaging/windows/vscomponents/VS.Redist.Common.Component.nuspec with 100% similarity]
src/installer/pkg/packaging-tools/windows/wix.targets
src/installer/pkg/packaging/installers.proj
src/installer/pkg/packaging/vs-insertion-packages.proj [new file with mode: 0644]
src/installer/pkg/packaging/windows/host/generatemsi.ps1 [deleted file]
src/installer/pkg/packaging/windows/host/host.wxs [deleted file]
src/installer/pkg/packaging/windows/host/variables.wxi [deleted file]
src/installer/pkg/packaging/windows/hostfxr/generatemsi.ps1 [deleted file]
src/installer/pkg/packaging/windows/hostfxr/hostfxr.wxs [deleted file]
src/installer/pkg/packaging/windows/hostfxr/provider.wxs [deleted file]
src/installer/pkg/packaging/windows/hostfxr/registrykeys.wxs [deleted file]
src/installer/pkg/packaging/windows/hostfxr/variables.wxi [deleted file]
src/installer/pkg/packaging/windows/package.props [deleted file]
src/installer/pkg/packaging/windows/package.targets [deleted file]
src/installer/pkg/packaging/windows/sharedframework/bundle.wxs [deleted file]
src/installer/pkg/packaging/windows/sharedframework/generatebundle.ps1 [deleted file]
src/installer/pkg/packaging/windows/sharedframework/variables.wxi [deleted file]
src/installer/pkg/packaging/windows/vscomponents/generatenupkg.ps1 [deleted file]
src/installer/pkg/projects/Directory.Build.props
src/installer/pkg/projects/Microsoft.NETCore.DotNetHost/Microsoft.NETCore.DotNetHost.pkgproj
src/installer/pkg/projects/Microsoft.NETCore.DotNetHost/host.wxs [new file with mode: 0644]
src/installer/pkg/projects/Microsoft.NETCore.DotNetHostResolver/Microsoft.NETCore.DotNetHostResolver.pkgproj
src/installer/pkg/projects/netcoreapp/sfx/Microsoft.NETCore.App.Bundle.bundleproj [new file with mode: 0644]
src/installer/pkg/projects/netcoreapp/sfx/Microsoft.NETCore.App.SharedFx.sfxproj
src/installer/pkg/projects/netcoreapp/sfx/bundle.thm [moved from src/installer/pkg/packaging/windows/sharedframework/bundle.thm with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1033/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1028/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1028/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1029/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1029/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1031/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1031/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1033/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1036/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1036/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1040/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1040/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1041/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1041/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1042/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1042/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1045/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1045/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1046/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1046/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1049/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1049/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/1055/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/1055/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/2052/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/2052/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netcoreapp/sfx/theme/3082/bundle.wxl [moved from src/installer/pkg/packaging/windows/sharedframework/theme/3082/bundle.wxl with 100% similarity]
src/installer/pkg/projects/netstandard/pkg/Directory.Build.props
src/installer/pkg/projects/windowsdesktop/Directory.Build.props
src/installer/pkg/projects/windowsdesktop/sfx/Microsoft.WindowsDesktop.App.Bundle.bundleproj [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/Microsoft.WindowsDesktop.App.SharedFx.sfxproj
src/installer/pkg/projects/windowsdesktop/sfx/bundle.thm [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1028/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1029/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1031/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1033/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1036/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1040/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1041/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1042/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1045/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1046/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1049/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/1055/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/2052/bundle.wxl [new file with mode: 0644]
src/installer/pkg/projects/windowsdesktop/sfx/theme/3082/bundle.wxl [new file with mode: 0644]
src/installer/signing/Directory.Build.targets
src/installer/signing/SignBurnBundleFiles.proj
src/installer/signing/SignBurnEngineFiles.proj
src/installer/signing/SignMsiFiles.proj
tools-local/tasks/ExecWithRetries.cs [new file with mode: 0644]
tools-local/tasks/core-setup.tasks.csproj

index 867d300..24624b8 100644 (file)
 
   <ItemGroup>
     <SubsetName
+      Include="Bundle"
+      Description="The shared framework bundle installer projects. Produces .exe installers for Windows." />
+  </ItemGroup>
+  <ItemGroup Condition="'$(SubsetToLower)' == '' or $(SubsetToLower.Contains('bundle'))">
+    <BundleProjectToBuild Include="$(RepoRoot)src\pkg\projects\**\*.bundleproj" SignPhase="BundleInstallerFiles" />
+    <ProjectToBuild Include="@(BundleProjectToBuild)" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <SubsetName
       Include="Installer"
       Description="Generates additional installers. This produces the shared frameworks and their installers." />
   </ItemGroup>
   <ItemGroup Condition="'$(SubsetToLower)' == '' or $(SubsetToLower.Contains('installer'))">
     <InstallerProjectToBuild Include="$(RepoRoot)src\pkg\packaging\installers.proj" />
+    <InstallerProjectToBuild Include="$(RepoRoot)src\pkg\packaging\vs-insertion-packages.proj" />
     <ProjectToBuild Include="@(InstallerProjectToBuild)" />
   </ItemGroup>
 
index 7c741f2..701b232 100644 (file)
     <WixObjRoot>$(IntermediateOutputRootPath)wix/</WixObjRoot>
     <WixObjDir>$(WixObjRoot)$(MSBuildProjectName)/</WixObjDir>
     <MsiArch>$(TargetArchitecture)</MsiArch>
-    <MicrosoftEulaFile>$(MSBuildThisFileDirectory)packaging/windows/eula.rtf</MicrosoftEulaFile>
-
-    <GenerateMSI>true</GenerateMSI>
-    <GenerateMSI Condition="'$(TargetArchitecture)' == 'arm' or '$(TargetArchitecture)' == 'arm64'">false</GenerateMSI>
-    <GenerateMSI Condition="'$(OSGroup)' != 'Windows_NT'">false</GenerateMSI>
-
-    <GeneratePkg Condition="'$(OSGroup)' == 'OSX'">true</GeneratePkg>
 
     <!--
       Allow packaging one build's outputs for a different RID. For example, package portable bits
index 3bbe3ac..aa53021 100644 (file)
@@ -95,8 +95,7 @@
     Acquire WiX tools, if not present.
   -->
   <Target Name="AcquireWix"
-          DependsOnTargets="GetAcquireWixProperties"
-          Condition="'$(GenerateMSI)' == 'true'">
+          DependsOnTargets="GetAcquireWixProperties">
     <MSBuild Projects="$(AcquireWixProjectFile)" Targets="AcquireWixCore" />
   </Target>
 
diff --git a/src/installer/pkg/packaging-tools/acquire-nuget-exe/acquire-nuget-exe.proj b/src/installer/pkg/packaging-tools/acquire-nuget-exe/acquire-nuget-exe.proj
new file mode 100644 (file)
index 0000000..a71039f
--- /dev/null
@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <UsingTask TaskName="DownloadFile" AssemblyFile="$(ArcadeSdkBuildTasksAssembly)" />
+
+  <!--
+    Acquire NuGet.exe, if not present.
+  -->
+  <Target Name="AcquireNuGetExeCore"
+          Condition="!Exists('$(NuGetExeFile)')"
+          DependsOnTargets="GetAcquireNuGetExeProperties">
+    <MakeDir Directories="$(NuGetExeToolDir)" />
+    <DownloadFile
+      Uri="$(NuGetExeDownloadUrl)"
+      DestinationPath="$(NuGetExeFile)"
+      Overwrite="true" />
+  </Target>
+
+  <Import Project="$(MSBuildThisFileDirectory)..\packaging-tools.targets" />
+
+</Project>
diff --git a/src/installer/pkg/packaging-tools/framework.bundle.props b/src/installer/pkg/packaging-tools/framework.bundle.props
new file mode 100644 (file)
index 0000000..f9d91dc
--- /dev/null
@@ -0,0 +1,10 @@
+<Project>
+  <!--
+    Shared properties specific to bundle projects (bundleproj).
+  -->
+
+  <PropertyGroup>
+    <GenerateExeBundle>true</GenerateExeBundle>
+  </PropertyGroup>
+
+</Project>
diff --git a/src/installer/pkg/packaging-tools/framework.bundle.targets b/src/installer/pkg/packaging-tools/framework.bundle.targets
new file mode 100644 (file)
index 0000000..11fdd23
--- /dev/null
@@ -0,0 +1,23 @@
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <!--
+    Shared targets specific to bundle projects (bundleproj).
+  -->
+
+  <Target Name="GetSharedFrameworkBundleInstallerProperties"
+          BeforeTargets="GetInstallerProperties">
+    <Error
+      Condition="'@(BundleComponentReference)' == ''"
+      Text="Bundle project lacks references to components that it should bundle." />
+
+    <PropertyGroup>
+      <InstallerName>$(ShortFrameworkName)-runtime</InstallerName>
+      <WixProductMoniker>$(SharedFrameworkBrandName)</WixProductMoniker>
+    </PropertyGroup>
+  </Target>
+
+  <!-- Target overrides (can't be shared with other package projects) -->
+
+  <Target Name="Build"
+          DependsOnTargets="GenerateInstallers" />
+
+</Project>
index 672ed07..b76183c 100644 (file)
@@ -3,6 +3,13 @@
     Shared properties specific to packaging projects (pkgproj).
   -->
 
+  <PropertyGroup>
+    <GenerateDeb>true</GenerateDeb>
+    <GenerateRpm>true</GenerateRpm>
+    <GeneratePkg>true</GeneratePkg>
+    <GenerateMSI>true</GenerateMSI>
+  </PropertyGroup>
+
   <ItemGroup>
     <PackageReference Include="Microsoft.DotNet.Build.Tasks.Packaging" Version="$(MicrosoftDotNetBuildTasksPackagingPackageVersion)" />
   </ItemGroup>
index 1dcd7ce..5bcaf46 100644 (file)
@@ -3,6 +3,60 @@
     Shared targets specific to projects building 'Microsoft.*.App*' packages.
   -->
 
+  <Target Name="GetTargetingPackInstallerProperties"
+          Condition="'$(FrameworkPackType)' == 'targeting'"
+          BeforeTargets="GetInstallerProperties">
+    <PropertyGroup>
+      <InstallerName>$(ShortFrameworkName)-targeting-pack</InstallerName>
+      <WixProductMoniker>$(TargetingPackBrandName)</WixProductMoniker>
+      <VSInsertionShortComponentName>TargetingPack</VSInsertionShortComponentName>
+    </PropertyGroup>
+  </Target>
+
+  <Target Name="GetAppHostPackInstallerProperties"
+          Condition="'$(FrameworkPackType)' == 'apphost'"
+          BeforeTargets="GetInstallerProperties">
+    <PropertyGroup>
+      <InstallerName>$(ShortFrameworkName)-apphost-pack</InstallerName>
+      <WixProductMoniker>$(AppHostPackBrandName)</WixProductMoniker>
+      <VSInsertionShortComponentName>AppHostPack</VSInsertionShortComponentName>
+    </PropertyGroup>
+  </Target>
+
+  <Target Name="GetRuntimePackInstallerProperties"
+          Condition="'$(FrameworkPackType)' == 'runtime'"
+          BeforeTargets="GetInstallerGenerationFlags">
+    <!-- Runtime packs are obtained only through NuGet. -->
+    <PropertyGroup>
+      <GenerateDeb>false</GenerateDeb>
+      <GenerateRpm>false</GenerateRpm>
+      <GeneratePkg>false</GeneratePkg>
+      <GenerateMSI>false</GenerateMSI>
+    </PropertyGroup>
+  </Target>
+
+  <!--
+    This targets file is imported for all pkgproj files, but some (like DotNetHostPolicy) don't need
+    installers and just use the normal packaging tooling.
+  -->
+  <Target Name="DisableInstallerGenerationForPkgprojWithoutInstallers"
+          Condition="'$(FrameworkPackType)' == ''"
+          BeforeTargets="GetInstallerGenerationFlags">
+    <PropertyGroup>
+      <GenerateDeb>false</GenerateDeb>
+      <GenerateRpm>false</GenerateRpm>
+      <GeneratePkg>false</GeneratePkg>
+    </PropertyGroup>
+
+    <!--
+      Generate MSIs for projects that build a part of the shared framework (host, hostfxr) with this
+      tooling. Other installer types are not supported and Core-Setup infra generates them.
+    -->
+    <PropertyGroup Condition="'$(GenerateSharedFrameworkPart)' != 'true'">
+      <GenerateMSI>false</GenerateMSI>
+    </PropertyGroup>
+  </Target>
+
   <!--
     Copy the files in the package's data/ dir to a layout directory. This is what the pack installer
     will place in the dotnet install dir.
index 0293dd9..26fa4a4 100644 (file)
@@ -4,6 +4,11 @@
   -->
 
   <PropertyGroup>
+    <GenerateMSI>true</GenerateMSI>
+    <GenerateCompressedArchive>true</GenerateCompressedArchive>
+  </PropertyGroup>
+
+  <PropertyGroup>
     <TargetFramework>$(NETCoreAppFramework)</TargetFramework>
     <PackageId>unused</PackageId>
 
index 7fa7e5d..44602c2 100644 (file)
@@ -5,6 +5,19 @@
 
   <UsingTask TaskName="ProcessSharedFrameworkDeps" AssemblyFile="$(LocalBuildToolsTaskFile)" />
 
+  <Target Name="GetSharedFrameworkInstallerProperties"
+          Condition="'$(GenerateSharedFramework)' == 'true'"
+          DependsOnTargets="GetInstallerBrandingNames"
+          BeforeTargets="
+            GetInstallerGenerationFlags;
+            GetInstallerProperties">
+    <PropertyGroup>
+      <InstallerName>$(ShortFrameworkName)-runtime</InstallerName>
+      <WixProductMoniker>$(SharedFrameworkBrandName)</WixProductMoniker>
+      <VSInsertionShortComponentName>SharedFramework</VSInsertionShortComponentName>
+    </PropertyGroup>
+  </Target>
+
   <Target Name="GetPackageReference"
           DependsOnTargets="GetProductVersions"
           BeforeTargets="CollectPackageReferences">
index 2088085..ba1ae21 100644 (file)
 
   <Target Name="GenerateInstallers"
           DependsOnTargets="
-            GetInstallerProperties;
+            GetInstallerGenerationFlags;
             GenerateDeb;
             GenerateRpm;
             GenerateMsi;
+            GenerateExeBundle;
             GeneratePkg;
             GenerateCompressedArchive" />
 
-  <Target Name="GenerateDeb" DependsOnTargets="TestDebuild;CreateDeb" Condition="'$(BuildDebPackage)' == 'true'"/>
-  <Target Name="GenerateRpm" DependsOnTargets="TestFPMTool;CreateRpm" Condition="'$(BuildRpmPackage)' == 'true'"/>
-  <Target Name="GenerateMsi" DependsOnTargets="CreateMsi" Condition="'$(GenerateMSI)' == 'true'"/>
+  <Target Name="GenerateDeb" DependsOnTargets="TestDebuild;CreateDeb" Condition="'$(GenerateDeb)' == 'true'"/>
+  <Target Name="GenerateRpm" DependsOnTargets="TestFPMTool;CreateRpm" Condition="'$(GenerateRpm)' == 'true'"/>
+  <Target Name="GenerateMsi" DependsOnTargets="CreateWixInstaller" Condition="'$(GenerateMSI)' == 'true'"/>
+  <Target Name="GenerateExeBundle" DependsOnTargets="CreateWixInstaller" Condition="'$(GenerateExeBundle)' == 'true'"/>
   <Target Name="GeneratePkg" DependsOnTargets="CreatePkg" Condition="'$(GeneratePkg)' == 'true'"/>
   <Target Name="GenerateCompressedArchive" DependsOnTargets="CreateCompressedArchive" Condition="'$(GenerateCompressedArchive)' == 'true'"/>
 
   <!--
     Create MSI installer, using WiX tools.
   -->
-  <Target Name="CreateMsi"
+  <Target Name="CreateWixInstaller"
           DependsOnTargets="
             GetInstallerProperties;
             RunLightLinker">
-    <Message Text="$(MSBuildProjectName) -> $(InstallerFile)" Importance="high" />
+    <Error
+      Condition="'$(GenerateExeBundle)' == 'true' and '$(GenerateMSI)' == 'true'"
+      Text="GenerateExeBundle and GenerateMSI are both set, but only one can be created at a time." />
+
+    <Message Text="$(MSBuildProjectName) -> $(OutInstallerFile)" Importance="high" />
   </Target>
 
   <Target Name="CreateCompressedArchive"
             GetInstallerProperties;
             FixLayoutPermissions">
     <PropertyGroup>
+      <MacOSComponentName>com.microsoft.$(ShortFrameworkName).pack.$(FrameworkPackType).$(ProductVersion).component.osx.x64</MacOSComponentName>
+      <MacOSSharedInstallDir>/usr/local/share/dotnet</MacOSSharedInstallDir>
+
       <_pkgArgs></_pkgArgs>
       <_pkgArgs>$(_pkgArgs) --root $(PackLayoutDir)</_pkgArgs>
       <_pkgArgs>$(_pkgArgs) --identifier $(MacOSComponentName)</_pkgArgs>
index 2f2ce2b..a3436a0 100644 (file)
@@ -1,5 +1,6 @@
 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 
+  <Import Project="framework.bundle.props" Condition="'$(MSBuildProjectExtension)' == '.bundleproj'" />
   <Import Project="framework.dependency.props" Condition="'$(MSBuildProjectExtension)' == '.depproj'" />
   <Import Project="framework.packaging.props" Condition="'$(MSBuildProjectExtension)' == '.pkgproj'" />
   <Import Project="framework.sharedfx.props" Condition="'$(MSBuildProjectExtension)' == '.sfxproj'" />
index 853f605..68bfe61 100644 (file)
@@ -4,6 +4,7 @@
     Include common targets for specific project types. These files include BuildTools target
     overrides that shouldn't be applied to other projects.
   -->
+  <Import Project="framework.bundle.targets" Condition="'$(MSBuildProjectExtension)' == '.bundleproj'" />
   <Import Project="framework.dependency.targets" Condition="'$(MSBuildProjectExtension)' == '.depproj'" />
   <Import Project="framework.packaging.targets" Condition="'$(MSBuildProjectExtension)' == '.pkgproj'" />
   <Import Project="framework.sharedfx.targets" Condition="'$(MSBuildProjectExtension)' == '.sfxproj'" />
   <Target Name="CreateManifestResourceNames" />
   <Target Name="CoreCompile" />
 
-  <!--
-    Set up properties for installer file. These depend on properties defined in the project file.
-    (Unlike properties set up in packaging-tools.props, which shouldn't.)
-  -->
-  <Target Name="GetInstallerProperties"
-          DependsOnTargets="
-            GetInstallerBrandingNames;
-            GetProductVersions">
-    <!-- Detect framework pack suffix and apply defaults. -->
-    <PropertyGroup Condition="'$(FrameworkPackType)' == 'targeting'">
-      <InstallerName>$(ShortFrameworkName)-targeting-pack</InstallerName>
-      <WixProductMoniker>$(TargetingPackBrandName)</WixProductMoniker>
-    </PropertyGroup>
+  <Target Name="GetInstallerGenerationFlags">
+    <!-- Filter the installer generation/build flags for the current build machine. -->
+    <PropertyGroup>
+      <_supportsWixBasedInstallers>true</_supportsWixBasedInstallers>
+      <_supportsWixBasedInstallers Condition="'$(TargetArchitecture)' == 'arm' or '$(TargetArchitecture)' == 'arm64'">false</_supportsWixBasedInstallers>
+      <_supportsWixBasedInstallers Condition="'$(OSGroup)' != 'Windows_NT'">false</_supportsWixBasedInstallers>
 
-    <PropertyGroup Condition="'$(FrameworkPackType)' == 'apphost'">
-      <InstallerName>$(ShortFrameworkName)-apphost-pack</InstallerName>
-      <WixProductMoniker>$(AppHostPackBrandName)</WixProductMoniker>
-    </PropertyGroup>
+      <GenerateMSI Condition="'$(_supportsWixBasedInstallers)' != 'true'">false</GenerateMSI>
+      <GenerateExeBundle Condition="'$(_supportsWixBasedInstallers)' != 'true'">false</GenerateExeBundle>
 
-    <!-- Runtime packs are obtained only through NuGet. -->
-    <PropertyGroup Condition="'$(FrameworkPackType)' == 'runtime'">
-      <BuildDebPackage>false</BuildDebPackage>
-      <BuildRpmPackage>false</BuildRpmPackage>
-      <GeneratePkg>false</GeneratePkg>
-      <GenerateMSI>false</GenerateMSI>
+      <GeneratePkg Condition="'$(OSGroup)' != 'OSX'">false</GeneratePkg>
     </PropertyGroup>
 
-    <!-- Non-framework pkgproj shouldn't build MSIs. -->
-    <PropertyGroup Condition="'$(FrameworkPackType)' == '' and '$(MSBuildProjectExtension)' == '.pkgproj'">
-      <GenerateMSI>false</GenerateMSI>
-    </PropertyGroup>
+    <!--
+      Apply the global Build*Package properties. These use distro-specific logic to determine if the
+      current distro should build RPM packages or Debian packages.
 
-    <PropertyGroup Condition="'$(GenerateSharedFramework)' == 'true'">
-      <InstallerName>$(ShortFrameworkName)-runtime</InstallerName>
-      <WixProductMoniker>$(SharedFrameworkBrandName)</WixProductMoniker>
+      This logic is external because the legacy infra needs the values.
+    -->
+    <PropertyGroup>
+      <GenerateDeb Condition="'$(BuildDebPackage)' != 'true'">false</GenerateDeb>
+      <GenerateRpm Condition="'$(BuildRpmPackage)' != 'true'">false</GenerateRpm>
     </PropertyGroup>
+  </Target>
 
+  <!--
+    Set up properties for installer generation. Project-type-specific properties are set up in
+    targets that use BeforeTargets="GetInstallerProperties".
+  -->
+  <Target Name="GetInstallerProperties"
+          DependsOnTargets="
+            GetInstallerBrandingNames;
+            GetProductVersions">
     <Error
-      Text="InstallerName starts with a '-': missing ShortFrameworkName value."
-      Condition="$(InstallerName.StartsWith('-'))" />
+      Text="InstallerName '$(InstallerName)' is empty or starts with a '-': expected a value like 'dotnet-runtime'."
+      Condition="'$(InstallerName)' == '' or $(InstallerName.StartsWith('-'))" />
 
     <PropertyGroup>
-      <MacOSComponentName>com.microsoft.$(ShortFrameworkName).pack.$(FrameworkPackType).$(ProductVersion).component.osx.x64</MacOSComponentName>
-      <MacOSSharedInstallDir>/usr/local/share/dotnet</MacOSSharedInstallDir>
-
       <VersionedInstallerName>$(InstallerName)-$(ProductBandVersion)</VersionedInstallerName>
       <VersionedInstallerName>$(VersionedInstallerName.ToLowerInvariant())</VersionedInstallerName>
       <InstallerPackageRelease>1</InstallerPackageRelease>
       <InstallerBuildPart Condition="'$(InstallerExtension)' == '.deb' or '$(InstallerExtension)' == '.rpm'"
         >$(ProductVersion)-$(TargetArchitecture)</InstallerBuildPart>
 
-      <!-- Location to place the installer, in bin. -->
+      <!-- Location to place the installer, in artifacts. -->
       <InstallerFileNameWithoutExtension>$(InstallerName)-$(InstallerBuildPart)</InstallerFileNameWithoutExtension>
       <InstallerFile Condition="'$(InstallerFile)' == ''">$(AssetOutputPath)$(InstallerFileNameWithoutExtension)$(InstallerExtension)</InstallerFile>
+      <ExeBundleInstallerFile>$(AssetOutputPath)$(InstallerFileNameWithoutExtension).exe</ExeBundleInstallerFile>
       <CompressedArchiveFile>$(AssetOutputPath)$(InstallerFileNameWithoutExtension)$(CompressedFileExtension)</CompressedArchiveFile>
     </PropertyGroup>
 
     <PropertyGroup>
       <SharedFrameworkArchiveSourceDir Condition="'$(SharedFrameworkArchiveSourceDir)' == ''">$(SharedFrameworkLayoutDir)shared/</SharedFrameworkArchiveSourceDir>
     </PropertyGroup>
-
-    <!-- Only generate installers for packs and sfxproj. -->
-    <PropertyGroup Condition="'$(FrameworkPackType)' == '' and '$(GenerateSharedFramework)' != 'true'">
-      <GeneratePkg>false</GeneratePkg>
-      <BuildDebPackage>false</BuildDebPackage>
-      <BuildRpmPackage>false</BuildRpmPackage>
-      <GenerateMSI>false</GenerateMSI>
-    </PropertyGroup>
-
-    <!-- Use existing infra for non-Windows shared framework installers. -->
-    <PropertyGroup Condition="'$(GenerateSharedFramework)' == 'true'">
-      <GeneratePkg>false</GeneratePkg>
-      <BuildDebPackage>false</BuildDebPackage>
-      <BuildRpmPackage>false</BuildRpmPackage>
-    </PropertyGroup>
   </Target>
 
   <Target Name="GetSkipBuildProps">
   </Target>
 
   <!--
+    Acquire NuGet.exe, if not present.
+  -->
+  <Target Name="AcquireNuGetExe"
+          DependsOnTargets="GetAcquireNuGetExeProperties">
+    <MSBuild Projects="$(AcquireNuGetExeProjectFile)" Targets="AcquireNuGetExeCore" />
+  </Target>
+
+  <Target Name="GetAcquireNuGetExeProperties">
+    <PropertyGroup>
+      <AcquireNuGetExeProjectFile>$(PackagingToolsDir)acquire-nuget-exe\acquire-nuget-exe.proj</AcquireNuGetExeProjectFile>
+      <!-- Using 3.5.0 to workaround https://github.com/NuGet/Home/issues/5016 -->
+      <NuGetExeDownloadUrl>https://dist.nuget.org/win-x86-commandline/v3.5.0/nuget.exe</NuGetExeDownloadUrl>
+      <NuGetExeToolDir>$(IntermediateOutputRootPath)nuget\</NuGetExeToolDir>
+      <NuGetExeFile>$(NuGetExeToolDir)NuGet.exe</NuGetExeFile>
+    </PropertyGroup>
+  </Target>
+
+  <!--
     By default, shared frameworks are generated based on the package. This can be overridden by the
     project, and in the future, the runtime pack is likely to be used to assemble the sfx.
   -->
diff --git a/src/installer/pkg/packaging-tools/windows/bundle/bundle.wxs b/src/installer/pkg/packaging-tools/windows/bundle/bundle.wxs
new file mode 100644 (file)
index 0000000..ae9d812
--- /dev/null
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
+     xmlns:swid="http://schemas.microsoft.com/wix/TagExtension"
+     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
+
+  <?include "..\variables.wxi" ?>
+
+  <Bundle
+    Name="$(var.ProductName)"
+    Manufacturer="$(var.Manufacturer)"
+    Version="$(var.DisplayVersion)"
+    UpgradeCode="$(var.UpgradeCode)"
+    AboutUrl="https://dot.net/core"
+    Compressed="yes">
+    
+    <bal:Condition Message="#(loc.FailureNotSupportedCurrentOperatingSystem)">
+      ((VersionNT &gt; v6.1) OR (VersionNT = v6.1 AND ServicePackLevel &gt;= 1))
+    </bal:Condition>
+
+    <?if $(var.Platform)=x64?>
+      <bal:Condition Message="#(loc.FailureNotSupportedX86OperatingSystem)">
+        VersionNT64
+      </bal:Condition>
+    <?endif?>
+
+    <!--
+      List of bundles that this bundle is an upgrade for. Used to support upgrade from bundles
+      that were produced before UpdateCode was standardized per major-minor channel.
+    -->
+    <?ifdef RelatedDotNetBundleIds?>
+      <?foreach relatedId in $(var.RelatedDotNetBundleIds)?>
+        <RelatedBundle Action="Upgrade" Id="$(var.relatedId)"/>
+      <?endforeach?>
+    <?endif?>
+
+    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.Foundation">
+      <bal:WixStandardBootstrapperApplication
+        LicenseFile="$(var.DotNetDummyEulaFile)"
+        ShowFilesInUse="yes"
+        ShowVersion="yes" />
+
+      <PayloadGroupRef Id="DotnetCoreBAPayloads" />
+    </BootstrapperApplicationRef>
+
+    <swid:Tag Regid="microsoft.com" InstallPath="[DOTNETHOME]" />
+
+    <Variable Name="DOTNETHOME" Type="string" Value="[$(var.Program_Files)]dotnet" bal:Overridable="no" />
+
+    <!-- Variables used solely for localization. -->
+    <Variable Name="BUNDLEMONIKER" Type="string" Value="$(var.ProductMoniker) ($(var.TargetArchitecture))" bal:Overridable="no" />
+    <Variable Name="PRODUCT_NAME" Type="string" Value="$(var.ProductName)" bal:Overridable="no" />
+    <Variable Name="LINK_PREREQ_PAGE" Type="string" Value="https://go.microsoft.com/fwlink/?linkid=846817" bal:Overridable="no" />
+
+    <Chain DisableSystemRestore="yes" ParallelCache="yes">
+      <?foreach chainedFile in $(var.ChainedDotNetPackageFiles)?>
+        <MsiPackage SourceFile="$(var.chainedFile)">
+          <MsiProperty Name="DOTNETHOME" Value="[DOTNETHOME]" />
+        </MsiPackage>
+      <?endforeach?>
+    </Chain>
+  </Bundle>
+
+  <Fragment>
+    <PayloadGroup Id="DotnetCoreBAPayloads">
+      <Payload Name="thm.xml" Compressed="yes" SourceFile="$(var.BundleThmDir)\bundle.thm" />
+      <Payload Name="thm.wxl" Compressed="yes" SourceFile="$(var.BundleThmDir)\bundle.wxl" />
+
+      <Payload Name="bg.png" Compressed="yes" SourceFile="$(var.DotNetBackgroundPngFile)" />
+
+      <?foreach LCID in $(var.LcidList)?>
+        <Payload Id="thm-$(var.LCID)" Compressed="yes" Name="$(var.LCID)\thm.wxl" SourceFile="$(var.BundleThmDir)\theme\$(var.LCID)\bundle.wxl" />
+      <?endforeach?>
+
+      <Payload Name='eula.rtf' Compressed='yes' SourceFile='!(wix.WixStdbaLicenseRtf)' />
+    </PayloadGroup>
+
+    <CustomTable Id='WixStdbaInformation'>
+      <Row>
+        <Data Column='LicenseFile'>eula.rtf</Data>
+      </Row>
+    </CustomTable>
+  </Fragment>
+
+</Wix>
diff --git a/src/installer/pkg/packaging-tools/windows/pack/product.wxs b/src/installer/pkg/packaging-tools/windows/pack/product.wxs
deleted file mode 100644 (file)
index ce6f91a..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-  <?include "..\variables.wxi" ?>
-
-  <Product
-    Id="*"
-    Name="$(var.ProductName)"
-    Language="$(var.ProductLanguage)"
-    Version="$(var.ProductVersion)"
-    Manufacturer="$(var.Manufacturer)"
-    UpgradeCode="$(var.UpgradeCode)">
-
-    <?include "..\product.common.wxi" ?>
-
-    <Feature Id="MainFeature" Title="Main Feature" Level="1">
-      <ComponentGroupRef Id="InstallFiles" />
-    </Feature>
-  </Product>
-
-  <Fragment>
-    <Directory Id="TARGETDIR" Name="SourceDir">
-      <Directory Id="$(var.Program_Files)">
-        <Directory Id="DOTNETHOME" Name="dotnet"/>
-      </Directory>
-    </Directory>
-  </Fragment>
-
-</Wix>
     Manufacturer="$(var.Manufacturer)"
     UpgradeCode="$(var.UpgradeCode)">
 
-    <?include "..\product.common.wxi" ?>
+    <?include "product.common.wxi" ?>
 
     <Feature Id="MainFeature" Title="Main Feature" Level="1">
-      <ComponentGroupRef Id="InstallFiles" />
-      <ComponentGroupRef Id="AuthoredRegistryKeys"/>
+      <?ifdef InstallFiles ?>
+        <ComponentGroupRef Id="InstallFiles" />
+      <?endif?>
+
+      <?ifdef AuthoredRegistryKeys ?>
+        <ComponentGroupRef Id="AuthoredRegistryKeys"/>
+      <?endif?>
 
       <?ifdef WerRelatedKeys ?>
         <ComponentGroupRef Id="WerRelatedKeys"/>
       <?ifdef BreadcrumbStoreFolder ?>
         <ComponentRef Id="BreadcrumbStoreFolder"/>
       <?endif?>
+
+      <?ifdef ExtraComponentGroupRefIds ?>
+        <?foreach extraComponentGroupRefId in $(var.ExtraComponentGroupRefIds)?>
+          <ComponentGroupRef Id="$(var.extraComponentGroupRefId)"/>
+        <?endforeach?>
+      <?endif?>
     </Feature>
+
+    <?ifdef ExtraPropertyRefIds ?>
+      <?foreach extraPropertyRefId in $(var.ExtraPropertyRefIds)?>
+        <PropertyRef Id="$(var.extraPropertyRefId)" />
+      <?endforeach?>
+    <?endif?>
+
   </Product>
 
   <Fragment>
     <Directory Id="TARGETDIR" Name="SourceDir">
       <Directory Id="$(var.Program_Files)">
-        <Directory Id="DOTNETHOME" Name="dotnet" >
-          <Directory Id="SHARED" Name="shared" />
-        </Directory>
+        <Directory Id="DOTNETHOME" Name="dotnet" />
       </Directory>
     </Directory>
   </Fragment>
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension">
-  <?include "Variables.wxi" ?>
+  <?include "..\variables.wxi" ?>
   <Fragment>
     <Component Id="$(var.DependencyKeyId)" Directory="TARGETDIR" Win64="no">
       <dep:Provides Key="$(var.DependencyKey)" />
diff --git a/src/installer/pkg/packaging-tools/windows/product/registrykeys.wxs b/src/installer/pkg/packaging-tools/windows/product/registrykeys.wxs
new file mode 100644 (file)
index 0000000..5711e2a
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <?include "..\variables.wxi" ?>
+
+  <Fragment>
+    <ComponentGroup Id="AuthoredRegistryKeys">
+      <Component Id="SetupRegistry_x86" Directory="TARGETDIR" Win64="no">
+        <RegistryKey Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.Platform)\$(var.RegKeyProductName)">
+
+          <?ifdef RegKeyNugetVersionExistence?>
+            <RegistryValue Action="write" Name="$(var.NugetVersion)" Type="integer" Value="1" KeyPath="yes"/>
+          <?endif?>
+
+          <?ifdef RegKeyNugetVersionValue?>
+            <RegistryValue Action="write" Name="Version" Type="string" Value="$(var.NugetVersion)" KeyPath="yes"/>
+          <?endif?>
+
+        </RegistryKey>
+      </Component>
+    </ComponentGroup>
+  </Fragment>
+</Wix>
diff --git a/src/installer/pkg/packaging-tools/windows/product/sharedfxdir.wxs b/src/installer/pkg/packaging-tools/windows/product/sharedfxdir.wxs
new file mode 100644 (file)
index 0000000..49c02a5
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Fragment>
+    <DirectoryRef Id="DOTNETHOME">
+      <Directory Id="SHARED" Name="shared" />
+    </DirectoryRef>
+  </Fragment>
+
+</Wix>
diff --git a/src/installer/pkg/packaging-tools/windows/provider.wxs b/src/installer/pkg/packaging-tools/windows/provider.wxs
deleted file mode 100644 (file)
index 67f61e3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension">
-  <?include "Variables.wxi" ?>
-  <Fragment>
-    <Component Id="$(var.DependencyKeyId)" Directory="TARGETDIR" Win64="no">
-      <dep:Provides Key="$(var.DependencyKey)" />
-    </Component>
-  </Fragment>
-</Wix>
\ No newline at end of file
diff --git a/src/installer/pkg/packaging-tools/windows/sharedFramework/registrykeys.wxs b/src/installer/pkg/packaging-tools/windows/sharedFramework/registrykeys.wxs
deleted file mode 100644 (file)
index 95cd684..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <?include "..\Variables.wxi" ?>
-  <Fragment>
-    <ComponentGroup Id="AuthoredRegistryKeys">
-      <Component Id="SetupRegistry_x86" Directory="TARGETDIR" Win64="no">
-        <RegistryKey Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.Platform)\sharedfx\$(var.FrameworkName)">
-          <RegistryValue Action="write" Name="$(var.NugetVersion)" Type="integer" Value="1" KeyPath="yes"/>
-        </RegistryKey>
-      </Component>
-    </ComponentGroup>
-  </Fragment>
-</Wix>
index 4fb931a..1d08273 100644 (file)
@@ -6,38 +6,79 @@
     this file and switch to wixproj. See https://github.com/wixtoolset/issues/issues/5627
   -->
 
+  <UsingTask TaskName="ExecWithRetries" AssemblyFile="$(LocalBuildToolsTaskFile)" />
   <UsingTask TaskName="StabilizeWixFileId" AssemblyFile="$(LocalBuildToolsTaskFile)" />
 
   <!--
-    If UpgradeCode isn't manually set, generate based on installer full path. Not suitable for
-    bundles.
+    Generate bundle upgrade code. This code needs to be constant within a product band for upgrades.
+  -->
+  <Target Name="GetBundleUpgradeCode"
+          DependsOnTargets="GetWixBuildConfiguration"
+          Condition="
+            '$(GenerateExeBundle)' == 'true' and
+            '$(UpgradeCode)' == ''">
+    <Error
+      Condition="'$(BundleInstallerUpgradeCodeSeed)' == ''"
+      Text="BundleInstallerUpgradeCodeSeed not defined. Required to produce a stable bundle upgrade code." />
+
+    <PropertyGroup>
+      <BundleInstallerOutputGuidString>$(BundleInstallerUpgradeCodeSeed) $(ProductBandVersion) $(PackageTargetRid)</BundleInstallerOutputGuidString>
+    </PropertyGroup>
+
+    <GenerateGuidFromName Name="$(BundleInstallerOutputGuidString)">
+      <Output TaskParameter="GeneratedGuid" PropertyName="UpgradeCode" />
+    </GenerateGuidFromName>
+  </Target>
+
+  <!--
+    If UpgradeCode isn't already set, generate one based on installer full path.
   -->
   <Target Name="GetUpgradeCode"
-          DependsOnTargets="GetInstallerProperties"
+          DependsOnTargets="GetWixBuildConfiguration"
           Condition="'$(UpgradeCode)' == ''">
-    <GenerateGuidFromName Name="$(InstallerFile)">
+    <GenerateGuidFromName Name="$(OutInstallerFile)">
       <Output TaskParameter="GeneratedGuid" PropertyName="UpgradeCode" />
     </GenerateGuidFromName>
   </Target>
 
-  <!-- Set up information to pass to WiX, depending on the type of installer being created. -->
-  <Target Name="GetWixBuildConfiguration"
-          DependsOnTargets="
-            AcquireWix;
-            GetInstallerProperties">
+  <Target Name="UseProductWixProject">
+    <ItemGroup>
+      <WixExtensions Include="WixUIExtension.dll" />
+      <WixExtensions Include="WixDependencyExtension.dll" />
+      <WixExtensions Include="WixUtilExtension.dll" />
+
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/product.wxs" />
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/provider.wxs" />
+    </ItemGroup>
+  </Target>
 
-    <ItemGroup Condition="'$(FrameworkPackType)' != ''">
+  <Target Name="UseBundleWixProject">
+    <ItemGroup>
+      <WixExtensions Include="WixBalExtension.dll" />
+      <WixExtensions Include="WixTagExtension.dll" />
+      <WixExtensions Include="WixUtilExtension.dll" />
+
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)bundle/bundle.wxs" />
+    </ItemGroup>
+  </Target>
+
+  <Target Name="GetFrameworkPackWixConfiguration"
+          Condition="'$(FrameworkPackType)' != ''"
+          DependsOnTargets="UseProductWixProject">
+    <ItemGroup>
       <DirectoryToHarvest
         Include="$(PackLayoutDir)"
         Name="install-files"
         SubstituteVar="PackSrc"
         ComponentGroupName="InstallFiles"
         DirectoryRef="DOTNETHOME" />
-
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)pack/product.wxs" />
     </ItemGroup>
+  </Target>
 
-    <ItemGroup Condition="'$(GenerateSharedFramework)' == 'true'">
+  <Target Name="GetSharedFrameworkWixConfiguration"
+          Condition="'$(GenerateSharedFramework)' == 'true'"
+          DependsOnTargets="UseProductWixProject">
+    <ItemGroup>
       <DirectoryToHarvest
         Include="$(SharedFrameworkLayoutDir)shared/"
         Name="install-shared-framework"
         ComponentGroupName="InstallFiles"
         DirectoryRef="SHARED" />
 
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)sharedFramework/product.wxs" />
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)sharedFramework/registrykeys.wxs" />
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/sharedfxdir.wxs" />
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/registrykeys.wxs" />
+
+      <CandleVariables Include="AuthoredRegistryKeys" Value="true" />
+      <CandleVariables Include="RegKeyNugetVersionExistence" Value="true" />
     </ItemGroup>
 
     <ItemGroup Condition="'$(IncludeWerRelatedKeys)' == 'true'">
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)sharedFramework/werrelatedkeys.wxs" />
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/werrelatedkeys.wxs" />
       <CandleVariables Include="WerRelatedKeys" Value="true" />
     </ItemGroup>
 
     <ItemGroup Condition="'$(IncludeBreadcrumbStoreFolder)' == 'true'">
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)sharedFramework/breadcrumbstorefolder.wxs" />
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/breadcrumbstorefolder.wxs" />
       <CandleVariables Include="BreadcrumbStoreFolder" Value="true" />
     </ItemGroup>
+  </Target>
+
+  <Target Name="GetSharedFrameworkPartWixConfiguration"
+          Condition="'$(GenerateSharedFrameworkPart)' == 'true'"
+          DependsOnTargets="UseProductWixProject">
+    <ItemGroup>
+      <WixSrcFile Include="$(MSBuildThisFileDirectory)product/registrykeys.wxs" />
+    </ItemGroup>
+  </Target>
 
+  <Target Name="GetBundleWixConfiguration"
+          Condition="'$(GenerateExeBundle)' == 'true'"
+          DependsOnTargets="
+            UseBundleWixProject;
+            GetBundledMsiFiles">
     <ItemGroup>
-      <WixSrcFile Include="$(MSBuildThisFileDirectory)provider.wxs" />
+      <LocFile Include="theme\**\bundle.wxl" />
+      <LocDirName Include="$([System.String]::new('%(LocFile.RecursiveDir)').TrimEnd('\'))" />
+
+      <CandleVariables Include="DisplayVersion" Value="$(MajorVersion).$(MinorVersion).$(PatchVersion).$(BuildNumberMajor)" />
+      <CandleVariables Include="ProductBandVersion" Value="$(ProductBandVersion)" />
+      <CandleVariables Include="FrameworkDisplayVersion" Value="$(ProductVersion)" />
+      <CandleVariables Include="LcidList" Value="@(LocDirName)" />
+
+      <CandleVariables Include="DotNetBackgroundPngFile" Value="$(MSBuildThisFileDirectory)..\..\packaging\osx\sharedframework\resources\dotnetbackground.png" />
+      <CandleVariables Include="DotNetDummyEulaFile" Value="$(MSBuildThisFileDirectory)bundle\dummyEula.rtf" />
+    </ItemGroup>
+
+    <PropertyGroup>
+      <OutInstallerFile>$(ExeBundleInstallerFile)</OutInstallerFile>
+    </PropertyGroup>
+  </Target>
+
+  <!-- Set up information to pass to WiX, depending on the type of installer being created. -->
+  <Target Name="GetWixBuildConfiguration"
+          DependsOnTargets="
+            AcquireWix;
+            GetInstallerProperties;
+            GetInstallerLocations;
+            GenerateMsiVersionString;
+            GetFrameworkPackWixConfiguration;
+            GetSharedFrameworkWixConfiguration;
+            GetSharedFrameworkPartWixConfiguration;
+            GetBundleWixConfiguration">
+    <PropertyGroup>
+      <OutInstallerFile Condition="'$(OutInstallerFile)' == ''">$(InstallerFile)</OutInstallerFile>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <CandleVariables Include="MicrosoftEula" Value="$(MSBuildThisFileDirectory)eula.rtf" />
+    </ItemGroup>
+  </Target>
+
+  <!--
+    Ensure MSIs are built and signed (if necessary), then obtain all paths to MSIs to bundle from
+    the bundle references.
+  -->
+  <Target Name="GetBundledMsiFiles">
+    <MSBuild Projects="$(RepoRoot)signing\SignMsiFiles.proj" Targets="Build" />
+    <MSBuild Projects="@(BundleComponentReference)" Targets="Build" />
+
+    <MSBuild Projects="@(BundleComponentReference)" Targets="GetOutputWixInstallerFile">
+      <Output TaskParameter="TargetOutputs" ItemName="BundleMsiFile" />
+    </MSBuild>
+
+    <ItemGroup>
+      <CandleVariables Include="ChainedDotNetPackageFiles" Value="@(BundleMsiFile)" />
     </ItemGroup>
   </Target>
 
   <Target Name="RunHeatHarvester"
+          Condition="'@(DirectoryToHarvest)' != ''"
           DependsOnTargets="GetWixBuildConfiguration">
     <ItemGroup>
       <DirectoryToHarvest
           -srd ^
           -dr %(DirectoryRef) ^
           -out %(WixSourceFile)" />
+
+      <CandleVariables Include="InstallFiles" Value="true" />
     </ItemGroup>
 
-    <Message Importance="High" Text="Heat '$(MSBuildProjectName)'" />
-    <Exec Command="%(DirectoryToHarvest.Command)" WorkingDirectory="$(WixToolsDir)" />
+    <Exec
+      Command="%(DirectoryToHarvest.Command)"
+      WorkingDirectory="$(WixToolsDir)"
+      StandardOutputImportance="normal" />
 
     <!--
       Currently FileElementToStabilize assumes a single DirectoryToHarvest. If there were multiple,
   <Target Name="RunCandleCompiler"
           DependsOnTargets="
             GetWixBuildConfiguration;
+            GetBundleUpgradeCode;
             GetUpgradeCode;
             GenerateMsiVersionString">
+    <PropertyGroup>
+      <WixDependencyKeyName Condition="'$(WixDependencyKeyName)' == ''">$(InstallerName.Replace('-', '_'))</WixDependencyKeyName>
+      <RegKeyProductName Condition="'$(RegKeyProductName)' == '' and '$(SharedFrameworkName)' != ''">sharedfx\$(SharedFrameworkName)</RegKeyProductName>
+    </PropertyGroup>
+
     <ItemGroup>
+      <CandleVariables Include="SharedWixDir" Value="$(MSBuildThisFileDirectory.TrimEnd('\'))" />
+      <CandleVariables Include="DependencyKeyName" Value="$(WixDependencyKeyName)" />
+
       <CandleVariables Include="%(DirectoryToHarvest.SubstituteVar)" Value="%(DirectoryToHarvest.Identity)" />
+
+      <CandleVariables Include="ExtraComponentGroupRefIds" Value="@(WixExtraComponentGroupRefId)" Condition="'@(WixExtraComponentGroupRefId)' != ''" />
+      <CandleVariables Include="FrameworkName" Value="$(SharedFrameworkName)" Condition="'$(SharedFrameworkName)' != ''" />
+      <CandleVariables Include="RegKeyProductName" Value="$(RegKeyProductName)" Condition="'$(RegKeyProductName)' != ''" />
+
+      <CandleVariables Include="ProductMoniker" Value="$(WixProductMoniker)" />
+      <CandleVariables Include="BuildVersion" Value="$(MsiVersionString)" />
+      <CandleVariables Include="NugetVersion" Value="$(ProductVersion)" />
+      <CandleVariables Include="TargetArchitecture" Value="$(TargetArchitecture)" />
+      <CandleVariables Include="UpgradeCode" Value="$(UpgradeCode)" />
     </ItemGroup>
 
     <PropertyGroup>
       <_wixArgs></_wixArgs>
       <_wixArgs>$(_wixArgs) -nologo</_wixArgs>
-      <_wixArgs>$(_wixArgs) -ext WixDependencyExtension.dll</_wixArgs>
       <_wixArgs>$(_wixArgs) -arch $(MsiArch)</_wixArgs>
+      <_wixArgs>$(_wixArgs) -out "$(WixObjDir)"</_wixArgs>
 
-      <_wixArgs>$(_wixArgs) -dMicrosoftEula="$(MicrosoftEulaFile)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dProductMoniker="$(WixProductMoniker)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dFrameworkName="$(SharedFrameworkName)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dBuildVersion="$(MsiVersionString)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dNugetVersion="$(ProductVersion)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dTargetArchitecture="$(TargetArchitecture)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dUpgradeCode="$(UpgradeCode)"</_wixArgs>
-      <_wixArgs>$(_wixArgs) -dDependencyKeyName="$(InstallerName.Replace('-', '_'))"</_wixArgs>
+      <_wixArgs>$(_wixArgs) @(WixExtensions -> '-ext %(Identity)', ' ')</_wixArgs>
       <_wixArgs>$(_wixArgs) @(CandleVariables -> '-d%(Identity)="%(Value)"', ' ')</_wixArgs>
-
-      <_wixArgs>$(_wixArgs) @(WixSrcFile -> '"%(Identity)"', ' ')</_wixArgs>
+      <_wixArgs>$(_wixArgs) @(WixSrcFile -> '"%(FullPath)"', ' ')</_wixArgs>
       <_wixArgs>$(_wixArgs) @(DirectoryToHarvest -> '"%(WixSourceFile)"', ' ')</_wixArgs>
-
-      <_wixArgs>$(_wixArgs) -out "$(WixObjDir)"</_wixArgs>
     </PropertyGroup>
 
-    <Message Importance="High" Text="Candle '$(MSBuildProjectName)'" />
-    <Exec Command="candle.exe $(_wixArgs)" WorkingDirectory="$(WixToolsDir)" />
+    <Exec
+      Command="candle.exe $(_wixArgs)"
+      WorkingDirectory="$(WixToolsDir)"
+      StandardOutputImportance="normal" />
   </Target>
 
   <Target Name="RunLightLinker"
     <PropertyGroup>
       <_wixArgs></_wixArgs>
       <_wixArgs>$(_wixArgs) -nologo</_wixArgs>
-      <_wixArgs>$(_wixArgs) -ext WixUIExtension.dll</_wixArgs>
-      <_wixArgs>$(_wixArgs) -ext WixDependencyExtension.dll</_wixArgs>
-      <_wixArgs>$(_wixArgs) -ext WixUtilExtension.dll</_wixArgs>
       <_wixArgs>$(_wixArgs) -cultures:en-us</_wixArgs>
+      <_wixArgs>$(_wixArgs) -out $(OutInstallerFile)</_wixArgs>
 
+      <_wixArgs>$(_wixArgs) @(WixExtensions -> '-ext %(Identity)', ' ')</_wixArgs>
       <_wixArgs>$(_wixArgs) @(WixSrcFile -> '"$(WixObjDir)%(Filename).wixobj"', ' ')</_wixArgs>
       <_wixArgs>$(_wixArgs) @(DirectoryToHarvest -> '"%(WixObjFile)"', ' ')</_wixArgs>
+    </PropertyGroup>
 
-      <_wixArgs>$(_wixArgs) -out $(InstallerFile)</_wixArgs>
+    <!--
+      Run light.exe with retries. This hardens against interference by Windows Defender by giving
+      Defender time to catch up. Light creates a file then immediately moves it, which fails when
+      Defender is holding it open. Uses a small base time because it resolves itself quickly and we
+      don't want to delay the build very long if it's an actual build authoring error.
+    -->
+    <ExecWithRetries
+      Command="light.exe $(_wixArgs)"
+      WorkingDirectory="$(WixToolsDir)"
+      StandardOutputImportance="normal"
+      IgnoreStandardErrorWarningFormat="true"
+      RetryDelayBase="2" />
+  </Target>
+
+  <!--
+    Entry point for an MSBuild call: creates a NuGet package suitable for VS insertion.
+  -->
+  <Target Name="GenerateVSInsertionNupkg"
+          DependsOnTargets="
+            GetInstallerGenerationFlags;
+            GenerateVSInsertionNupkgCore" />
+
+  <!--
+    When using the CreateVSInsertionNupkg entry point target, we have to make sure this project's
+    MSI was created first.
+  -->
+  <Target Name="EnsureMsiBuilt">
+    <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Build" />
+  </Target>
+
+  <Target Name="GenerateVSInsertionNupkgCore"
+          Condition="'$(GenerateMSI)' == 'true'"
+          DependsOnTargets="
+            EnsureMsiBuilt;
+            AcquireNuGetExe;
+            GetInstallerProperties;
+            GetWixBuildConfiguration">
+    <PropertyGroup>
+      <VSInsertionComponentName>$(VSInsertionCommonPrefix).$(VSInsertionProductName).$(VSInsertionShortComponentName).$(TargetArchitecture).$(ProductBandVersion)</VSInsertionComponentName>
+      <VSInsertionComponentFriendlyName>$(ProductBandVersion) $(ProductBrandPrefix) $(VSInsertionShortComponentName)</VSInsertionComponentFriendlyName>
+
+      <NupkgOutputFile>$(ArtifactsNonShippingPackagesDir)$(VSInsertionComponentName).$(ProductVersion).nupkg</NupkgOutputFile>
+
+      <ProjectUrlForVS>https://github.com/dotnet/core-setup</ProjectUrlForVS>
+
+      <PackProperties />
+      <PackProperties>$(PackProperties)COMPONENT_MSI=$(OutInstallerFile);</PackProperties>
+      <PackProperties>$(PackProperties)ARCH=$(MsiArch);</PackProperties>
+      <PackProperties>$(PackProperties)COMPONENT_NAME=$(VSInsertionComponentName);</PackProperties>
+      <PackProperties>$(PackProperties)FRIENDLY_NAME=$(VSInsertionComponentFriendlyName);</PackProperties>
+      <PackProperties>$(PackProperties)PROJECT_URL=$(ProjectUrlForVS);</PackProperties>
+
+      <PackArgs />
+      <PackArgs>$(PackArgs) $(MSBuildThisFileDirectory)vs\VS.Redist.Common.Component.nuspec</PackArgs>
+      <PackArgs>$(PackArgs) -Version $(ProductVersion)</PackArgs>
+      <PackArgs>$(PackArgs) -OutputDirectory $(ArtifactsNonShippingPackagesDir)</PackArgs>
+      <PackArgs>$(PackArgs) -NoDefaultExcludes</PackArgs>
+      <PackArgs>$(PackArgs) -NoPackageAnalysis</PackArgs>
+      <PackArgs>$(PackArgs) -Properties "$(PackProperties)"</PackArgs>
     </PropertyGroup>
 
-    <Message Importance="High" Text="Light '$(MSBuildProjectName)'" />
-    <Exec Command="light.exe $(_wixArgs)" WorkingDirectory="$(WixToolsDir)" />
+    <Exec Command="$(NuGetExeFile) pack $(PackArgs)" StandardOutputImportance="normal" />
+
+    <Error
+      Condition="!Exists('$(NupkgOutputFile)')"
+      Text="Failed to find VS insertion nupkg after pack command. Expected '$(NupkgOutputFile)'" />
+
+    <Message Text="$(MSBuildProjectName) -> $(NupkgOutputFile)" Importance="High" />
   </Target>
 
+  <Target Name="ExtractEngineBundle"
+          DependsOnTargets="GetInstallerGenerationFlags">
+    <Exec
+      Condition="'$(GenerateExeBundle)' == 'true'"
+      Command="insignia.exe -ib $(CombinedInstallerFile) -o $(CombinedInstallerEngine)"
+      WorkingDirectory="$(WixToolsDir)" />
+  </Target>
+
+  <Target Name="ReattachEngineToBundle"
+          DependsOnTargets="GetInstallerGenerationFlags">
+    <Exec
+      Condition="'$(GenerateExeBundle)' == 'true'"
+      Command="insignia.exe -ab $(CombinedInstallerEngine) $(CombinedInstallerFile) -o $(CombinedInstallerFile)"
+      WorkingDirectory="$(WixToolsDir)" />
+  </Target>
+
+  <Target Name="GetOutputWixInstallerFile"
+          DependsOnTargets="GetWixBuildConfiguration"
+          Returns="$(OutInstallerFile)"/>
+
 </Project>
index a3079ac..2f50326 100644 (file)
@@ -17,9 +17,7 @@
           DependsOnTargets="
             BuildDependencies;
             BuildInstallers;
-            BuildCombinedInstallers;
-            SignCombinedInstallers;
-            GenerateVSNugetPackages"
+            SignCombinedInstallers"
           Condition="'$(DOTNET_BUILD_SKIP_PACKAGING)' != 'true'" />
 
   <Target Name="BuildInstallers"
             $(PackageTargets)"
           Condition="'$(DOTNET_BUILD_SKIP_PACKAGING)' != 'true'" />
 
-  <Target Name="BuildCombinedInstallers"
-          DependsOnTargets="
-            EnsureSignedMsiFiles;
-            GenerateCombinedInstallers"
-          Condition="'$(DOTNET_BUILD_SKIP_PACKAGING)' != 'true'" />
-
   <Target Name="SignCombinedInstallers"
           Condition="
             '$(OSGroup)' == 'Windows_NT' and
             '$(SkipSigning)' != 'true'"
           DependsOnTargets="
-            ExtractEngineBundle;
             EnsureSignedBurnEngineFiles;
-            ReattachEngineToBundle;
             EnsureSignedBurnBundleFiles" />
 
   <!--
     Also ensures NuGet packages are built and signed.
   -->
   <Target Name="BuildDependencies"
-          Condition="'$(UsePrebuiltPortableBinariesForInstallers)' != 'true'">
-    <ItemGroup>
-      <SharedFrameworkProject Include="$(SourceDir)pkg\projects\**\*.sfxproj" />
-    </ItemGroup>
-
+          Condition="'$(UsePrebuiltPortableBinariesForInstallers)' != 'true'"
+          DependsOnTargets="GetSharedFrameworkProjects">
     <MSBuild
       Projects="
         @(SharedFrameworkProject);
     <Error Condition="!Exists('$(AssetOutputPath)$(SharedFrameworkSymbolsCompressedFile)')" Message="Unable to create $(AssetOutputPath)$(SharedFrameworkSymbolsCompressedFile)" />
   </Target>
 
-  <Import Project="windows\package.targets" />
   <Import Project="osx\package.targets" />
   <Import Project="deb\package.targets" />
   <Import Project="rpm\package.targets" />
 
   <PropertyGroup>
    <InstallerDependsOn>
-     GenerateMsis;
      GeneratePkgs;
      GenerateDebs;
      GenerateRpms;
   </PropertyGroup>
   <Target Name="GenerateInstallers" DependsOnTargets="InitPackage;$(InstallerDependsOn)" />
 
-  <Target Name="GenerateCombinedInstallers" DependsOnTargets="InitPackage;GenerateBundles" />
-
-  <Target Name="GenerateVSNugetPackages"
-          Condition="'$(OS)' == 'Windows_NT' AND '$(TargetArchitecture)' != 'arm' AND '$(TargetArchitecture)' != 'arm64'"
-          DependsOnTargets="SetupVSNugetPackages"
-          Inputs="@(SdkMsiComponent->'%(MsiInstallerFile)');
-                    $(NuSpecFile);
-                    $(GenerateNupkgPowershellScript)"
-          Outputs="@(SdkMsiComponent->'$(PackageOutputPath)%(ComponentId).%(ComponentVersion).nupkg')">
-
-    <Exec Command="powershell -NoProfile -NoLogo $(GenerateNupkgPowershellScript) ^
-                      '%(SdkMsiComponent.MsiInstallerFile)' ^
-                      '@(SdkMsiComponent->'%(ComponentVersion)')' ^
-                      '$(NuSpecFile)' ^
-                      '@(SdkMsiComponent->'$(PackageOutputPath)%(ComponentId).%(ComponentVersion).nupkg')' ^
-                      '$(TargetArchitecture)' ^
-                      '@(SdkMsiComponent->'%(ComponentId)')' ^
-                      '@(SdkMsiComponent->'%(ComponentFriendlyName)')' ^
-                      '$(ProjectUrl)' ^
-                      '$(BinDir)'" />
-  </Target>
-  
-  <Target Name="SetupVSNugetPackages"
-          DependsOnTargets="GetInstallerLocations">
-    <PropertyGroup>
-      <NuSpecFile>$(MSBuildThisFileDirectory)windows/vscomponents/VS.Redist.Common.Component.nuspec</NuSpecFile>
-      <GenerateNupkgPowershellScript>$(MSBuildThisFileDirectory)windows/vscomponents/generatenupkg.ps1</GenerateNupkgPowershellScript>
-      <ProjectUrl>https://github.com/dotnet/core-setup</ProjectUrl>
-    </PropertyGroup>
-
-    <ItemGroup>
-      <SdkMsiComponent Include="HostFxrMsiNupkg">
-        <MsiInstallerFile>$(HostFxrInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetCore.HostFXR.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) .NET Core HostFX Resolver</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="AppHostPackMsiNupkg">
-        <MsiInstallerFile>$(AppHostPackInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetCore.AppHostPack.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) .NET Core AppHost Pack</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="SharedFrameworkMsiNupkg">
-        <MsiInstallerFile>$(SharedFrameworkInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetCore.SharedFramework.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) .NET Core SharedFramework</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="SharedHostMsiNupkg">
-        <MsiInstallerFile>$(SharedHostInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetCore.SharedHost.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) .NET Core SharedHost</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="NetStandardTargetingPackMsiNupkg">
-        <MsiInstallerFile>$(NetStandardTargetingPackInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetStandard.TargetingPack.$(TargetArchitecture).$(NetStandardProductBandVersion)</ComponentId>
-        <ComponentVersion>$(NetStandardProductBandVersion).$(PatchVersion)$(ProductVersionSuffix)</ComponentVersion>
-        <ComponentFriendlyName>$(NetStandardProductBandVersion) .NET Standard TargetingPack</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="NetCoreTargetingPackMsiNupkg">
-        <MsiInstallerFile>$(TargetingPackInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.NetCore.TargetingPack.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) .NET Core TargetingPack</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="WindowsDesktopMsiNupkg">
-        <MsiInstallerFile>$(WindowsDesktopSharedFrameworkInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.WindowsDesktop.SharedFramework.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) WindowsDesktop SharedFramework</ComponentFriendlyName>
-      </SdkMsiComponent>
-      <SdkMsiComponent Include="WindowsDesktopTargetingPackMsiNupkg">
-        <MsiInstallerFile>$(WindowsDesktopTargetingPackInstallerFile)</MsiInstallerFile>
-        <ComponentId>VS.Redist.Common.WindowsDesktop.TargetingPack.$(TargetArchitecture).$(NETCoreAppFrameworkVersion)</ComponentId>
-        <ComponentVersion>$(SharedFrameworkNugetVersion)</ComponentVersion>
-        <ComponentFriendlyName>$(NETCoreAppFrameworkVersion) WindowsDesktop TargetingPack</ComponentFriendlyName>
-      </SdkMsiComponent>
-    </ItemGroup>
-  </Target>
-
   </Project>
diff --git a/src/installer/pkg/packaging/vs-insertion-packages.proj b/src/installer/pkg/packaging/vs-insertion-packages.proj
new file mode 100644 (file)
index 0000000..86af084
--- /dev/null
@@ -0,0 +1,21 @@
+<Project>
+  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
+
+  <PropertyGroup>
+    <TargetFramework>$(NETCoreAppFramework)</TargetFramework>
+  </PropertyGroup>
+
+  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
+
+  <!--
+    Ensure MSIs are built and signed (if necessary) then call the target that generates the MSI
+    insertion NuGet packages on each project. Bundle installers aren't inserted, so this is enough.
+  -->
+  <Target Name="Build" DependsOnTargets="GetSharedFrameworkProjects">
+    <MSBuild Projects="$(RepoRoot)signing\SignMsiFiles.proj" Targets="Build" />
+    <MSBuild Projects="@(PkgprojProjectToBuild);@(SharedFrameworkProject)" Targets="GenerateVSInsertionNupkg" />
+  </Target>
+
+  <Target Name="Test" />
+
+</Project>
diff --git a/src/installer/pkg/packaging/windows/host/generatemsi.ps1 b/src/installer/pkg/packaging/windows/host/generatemsi.ps1
deleted file mode 100644 (file)
index 2906d40..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-param(
-    [Parameter(Mandatory=$true)][string]$SharedHostPublishRoot,
-    [Parameter(Mandatory=$true)][string]$DotnetHostMSIOutput,
-    [Parameter(Mandatory=$true)][string]$WixRoot,
-    [Parameter(Mandatory=$true)][string]$ProductMoniker,
-    [Parameter(Mandatory=$true)][string]$SharedHostMSIVersion,
-    [Parameter(Mandatory=$true)][string]$SharedHostNugetVersion,
-    [Parameter(Mandatory=$true)][string]$Architecture,
-    [Parameter(Mandatory=$true)][string]$TargetArchitecture,
-    [Parameter(Mandatory=$true)][string]$WixObjRoot,
-    [Parameter(Mandatory=$true)][string]$SharedHostUpgradeCode
-)
-
-$RepoRoot = Convert-Path "$PSScriptRoot\..\..\..\..\.."
-$CommonScript = "$RepoRoot\tools-local\scripts\common\_common.ps1"
-if(-Not (Test-Path "$CommonScript"))
-{
-    Exit -1
-} 
-. "$CommonScript"
-
-$PackagingRoot = Join-Path $RepoRoot "src\pkg\packaging"
-function RunCandle
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running candle..
-    $AuthWsxRoot =  Join-Path $PackagingRoot "windows\host"
-
-    .\candle.exe -nologo `
-        -out "$WixObjRoot\" `
-        -ext WixDependencyExtension.dll `
-        -dHostSrc="$SharedHostPublishRoot" `
-        -dMicrosoftEula="$PackagingRoot\windows\eula.rtf" `
-        -dProductMoniker="$ProductMoniker" `
-        -dBuildVersion="$SharedHostMSIVersion" `
-        -dNugetVersion="$SharedHostNugetVersion" `
-        -dTargetArchitecture="$TargetArchitecture" `
-        -dUpgradeCode="$SharedHostUpgradeCode" `
-        -arch $Architecture `
-        "$AuthWsxRoot\host.wxs" `
-        "$AuthWsxRoot\provider.wxs" | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Candle failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-function RunLight
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running light..
-
-    .\light.exe -nologo `
-        -ext WixUIExtension.dll `
-        -ext WixDependencyExtension.dll `
-        -ext WixUtilExtension.dll `
-        -cultures:en-us `
-        "$WixObjRoot\host.wixobj" `
-        "$WixObjRoot\provider.wixobj" `
-        -out $DotnetHostMSIOutput | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Light failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-if(!(Test-Path $SharedHostPublishRoot))
-{
-    throw "$SharedHostPublishRoot not found"
-}
-
-if(!(Test-Path $WixObjRoot))
-{
-    throw "$WixObjRoot not found"
-}
-
-Write-Host "Creating shared host MSI at $DotnetHostMSIOutput"
-
-if([string]::IsNullOrEmpty($WixRoot))
-{
-    Exit -1
-}
-
-if(-Not (RunCandle))
-{
-    Exit -1
-}
-
-if(-Not (RunLight))
-{
-    Exit -1
-}
-
-if(!(Test-Path $DotnetHostMSIOutput))
-{
-    throw "Unable to create the shared host msi."
-    Exit -1
-}
-
-Write-Host -ForegroundColor Green "Successfully created shared host MSI - $DotnetHostMSIOutput"
-
-exit $LastExitCode
diff --git a/src/installer/pkg/packaging/windows/host/host.wxs b/src/installer/pkg/packaging/windows/host/host.wxs
deleted file mode 100644 (file)
index c09deae..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-    <?include "Variables.wxi" ?>
-    <Product Id="*" Name="$(var.ProductName)" Language="$(var.ProductLanguage)" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
-        <Package Compressed="yes" InstallScope="perMachine" InstallerVersion="200" />
-
-        <MajorUpgrade DowngradeErrorMessage="$(var.DowngradeErrorMessage)" Schedule="afterInstallInitialize"/>
-
-        <MediaTemplate CompressionLevel="high" EmbedCab="yes" />
-
-        <Feature Id="MainFeature" Title="Main Feature" Level="1">
-            <ComponentGroupRef Id="InstallSharedHostandDetectionKeys" />
-        </Feature>
-        <Feature Id="Provider" Absent="disallow" AllowAdvertise="no" Description="Used for Ref Counting" Display="hidden" Level="1" InstallDefault="local" Title="RefCounting" TypicalDefault="install">
-            <ComponentRef Id="$(var.DependencyKeyId)" />
-        </Feature>
-        <Property Id="ProductCPU" Value="$(var.Platform)" />
-        <Property Id="RTM_ProductVersion" Value="$(var.Dotnet_ProductVersion)" />
-
-        <Property Id="MSIFASTINSTALL" Value="7" />
-
-        <WixVariable Id="WixUILicenseRtf" Value="$(var.MicrosoftEula)" />
-
-        <Property Id="WIXUI_INSTALLDIR" Value="DOTNETHOME"/>
-        <UIRef Id="WixUI_InstallDir" />
-
-        <CustomActionRef Id="WixBroadcastEnvironmentChange" />
-    </Product>
-    <Fragment>
-        <Directory Id="TARGETDIR" Name="SourceDir">
-            <Directory Id="$(var.Program_Files)">
-                <Directory Id="DOTNETHOME" Name="dotnet"/>
-            </Directory>
-        </Directory>
-    </Fragment>
-    <Fragment>
-        <ComponentGroup Id="InstallSharedHostandDetectionKeys">
-            <Component Id="cmpCoreHost" Directory="DOTNETHOME" Guid="{45399BBB-DDA5-4386-A2E9-618FB3C54A18}" >
-                <File Id="fileCoreHostExe" KeyPath="yes" Source="$(var.HostSrc)\dotnet.exe" />
-                <RegistryKey Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.Platform)\sharedhost">
-                  <RegistryValue Action="write" Name="Version" Type="string" Value="$(var.NugetVersion)"/>
-                </RegistryKey>
-                <Environment Id="E_PATH" Name="PATH" Value="[DOTNETHOME]" Part="last" Action="set" System="yes" />
-            </Component>
-            <Component Id="cmpLicenseFiles" Directory="DOTNETHOME" Guid="{A61CBE5B-1282-4F29-90AD-63597AA2372E}">
-                <File Id="fileLicenseTxt" KeyPath="yes" Source="$(var.HostSrc)\LICENSE.txt" />
-                <File Id="fileThirdPartyNoticesTxt" Source="$(var.HostSrc)\ThirdPartyNotices.txt" />
-            </Component>
-        </ComponentGroup>
-    </Fragment>
-</Wix>
diff --git a/src/installer/pkg/packaging/windows/host/variables.wxi b/src/installer/pkg/packaging/windows/host/variables.wxi
deleted file mode 100644 (file)
index 3022464..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-  <?define Dotnet_ProductVersion   =   "$(var.BuildVersion)" ?>
-  <?define Dotnet_BuildVersion   =   "$(var.BuildVersion)" ?>
-  <?define Manufacturer     =   "Microsoft Corporation" ?>
-  <?define ProductName      =   "$(var.ProductMoniker) ($(var.TargetArchitecture))" ?>
-  <?define ProductLanguage  =   "1033" ?>
-  <?define ProductVersion   =   "$(var.Dotnet_ProductVersion)" ?>
-  <?define LCID  = "$(var.ProductLanguage)"?>
-  <?define DowngradeErrorMessage  = "A newer version is already installed; please uninstall it and re-run setup."?>
-
-  <?define Platform   =   "$(sys.BUILDARCH)" ?>
-  <?if $(var.Platform)=x86?>
-  <?define Program_Files="ProgramFilesFolder"?>
-  <?define Win64AttributeValue=no?>
-  <?elseif $(var.Platform)=x64?>
-  <?define Program_Files="ProgramFiles64Folder"?>
-  <?define Win64AttributeValue=yes?>
-  <?else?>
-  <?error Invalid Platform ($(var.Platform))?>
-  <?endif?>
-
-  <?define DependencyKey   = "Dotnet_CLI_SharedHost_$(var.BuildVersion)_$(var.Platform)"?>
-  <?define DependencyKeyId = "$(var.DependencyKey)" ?>
-</Include>
\ No newline at end of file
diff --git a/src/installer/pkg/packaging/windows/hostfxr/generatemsi.ps1 b/src/installer/pkg/packaging/windows/hostfxr/generatemsi.ps1
deleted file mode 100644 (file)
index 2b2473d..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-param(
-    [Parameter(Mandatory=$true)][string]$HostFxrPublishRoot,
-    [Parameter(Mandatory=$true)][string]$HostFxrMSIOutput,
-    [Parameter(Mandatory=$true)][string]$WixRoot,
-    [Parameter(Mandatory=$true)][string]$ProductMoniker,
-    [Parameter(Mandatory=$true)][string]$HostFxrMSIVersion,
-    [Parameter(Mandatory=$true)][string]$HostFxrNugetVersion,
-    [Parameter(Mandatory=$true)][string]$Architecture,
-    [Parameter(Mandatory=$true)][string]$TargetArchitecture,
-    [Parameter(Mandatory=$true)][string]$WixObjRoot,
-    [Parameter(Mandatory=$true)][string]$HostFxrUpgradeCode
-)
-
-$RepoRoot = Convert-Path "$PSScriptRoot\..\..\..\..\.."
-$CommonScript = "$RepoRoot\tools-local\scripts\common\_common.ps1"
-
-if(-Not (Test-Path "$CommonScript"))
-{
-    Exit -1
-} 
-. "$CommonScript"
-
-$PackagingRoot = Join-Path $RepoRoot "src\pkg\packaging"
-
-$InstallFileswsx = "$WixObjRoot\install-files.wxs"
-$InstallFilesWixobj = "$WixObjRoot\install-files.wixobj"
-
-function RunHeat
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running heat..
-
-    .\heat.exe dir `"$HostFxrPublishRoot`" `
-    -nologo `
-    -template fragment `
-    -sreg -gg `
-    -var var.HostFxrSrc `
-    -cg InstallFiles `
-    -srd `
-    -dr DOTNETHOME `
-    -out $InstallFileswsx | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Heat failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-function RunCandle
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running candle..
-    $AuthWsxRoot =  Join-Path $PackagingRoot "windows\hostfxr"
-
-    $ComponentVersion = $HostFxrNugetVersion.Replace('-', '_');
-
-    .\candle.exe -nologo `
-        -out "$WixObjRoot\" `
-        -dHostFxrSrc="$HostFxrPublishRoot" `
-        -dMicrosoftEula="$PackagingRoot\windows\eula.rtf" `
-        -dProductMoniker="$ProductMoniker" `
-        -dBuildVersion="$HostFxrMSIVersion" `
-        -dNugetVersion="$HostFxrNugetVersion" `
-        -dComponentVersion="$ComponentVersion" `
-        -dTargetArchitecture="$TargetArchitecture" `
-        -dUpgradeCode="$HostFxrUpgradeCode" `
-        -arch $Architecture `
-        -ext WixDependencyExtension.dll `
-        "$AuthWsxRoot\hostfxr.wxs" `
-        "$AuthWsxRoot\provider.wxs" `
-        "$AuthWsxRoot\registrykeys.wxs" `
-        $InstallFileswsx | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Candle failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-function RunLight
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running light..
-
-    .\light.exe -nologo `
-        -ext WixUIExtension.dll `
-        -ext WixDependencyExtension.dll `
-        -ext WixUtilExtension.dll `
-        -cultures:en-us `
-        "$WixObjRoot\hostfxr.wixobj" `
-        "$WixObjRoot\provider.wixobj" `
-        "$WixObjRoot\registrykeys.wixobj" `
-        "$InstallFilesWixobj" `
-        -out $HostFxrMSIOutput | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Light failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-if(!(Test-Path $HostFxrPublishRoot))
-{
-    throw "$SharedHostPublishRoot not found"
-}
-
-if(!(Test-Path $WixObjRoot))
-{
-    throw "$WixObjRoot not found"
-}
-
-Write-Host "Creating shared Host FX Resolver MSI at $HostFxrMSIOutput"
-
-if([string]::IsNullOrEmpty($WixRoot))
-{
-    Exit -1
-}
-
-if(-Not (RunHeat))
-{
-    Exit -1
-}
-
-if(-Not (RunCandle))
-{
-    Exit -1
-}
-
-if(-Not (RunLight))
-{
-    Exit -1
-}
-
-if(!(Test-Path $HostFxrMSIOutput))
-{
-    throw "Unable to create the shared host msi."
-    Exit -1
-}
-
-Write-Host -ForegroundColor Green "Successfully created shared host MSI - $HostFxrMSIOutput"
-
-exit $LastExitCode
diff --git a/src/installer/pkg/packaging/windows/hostfxr/hostfxr.wxs b/src/installer/pkg/packaging/windows/hostfxr/hostfxr.wxs
deleted file mode 100644 (file)
index 7a6d74a..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-    <?include "Variables.wxi" ?>
-    <Product Id="*" Name="$(var.ProductName)" Language="$(var.ProductLanguage)" Version="$(var.ProductVersion)" Manufacturer="$(var.Manufacturer)" UpgradeCode="$(var.UpgradeCode)">
-        <Package Compressed="yes" InstallScope="perMachine" InstallerVersion="200" />
-
-        <MajorUpgrade DowngradeErrorMessage="$(var.DowngradeErrorMessage)" Schedule="afterInstallInitialize"/>
-
-        <MediaTemplate CompressionLevel="high" EmbedCab="yes" />
-
-        <Feature Id="MainFeature" Title="Main Feature" Level="1">
-            <ComponentGroupRef Id="InstallFiles" />
-            <ComponentGroupRef Id="AuthoredRegistryKeys"/>
-        </Feature>
-        <Feature Id="Provider" Absent="disallow" AllowAdvertise="no" Description="Used for Ref Counting" Display="hidden" Level="1" InstallDefault="local" Title="RefCounting" TypicalDefault="install">
-            <ComponentRef Id="$(var.DependencyKeyId)" />
-        </Feature>
-
-        <Property Id="MSIFASTINSTALL" Value="7" />
-
-        <WixVariable Id="WixUILicenseRtf" Value="$(var.MicrosoftEula)" />
-
-        <Property Id="WIXUI_INSTALLDIR" Value="DOTNETHOME"/>
-        <UIRef Id="WixUI_InstallDir" />
-
-        <CustomActionRef Id="WixBroadcastEnvironmentChange" />
-    </Product>
-    <Fragment>
-        <Directory Id="TARGETDIR" Name="SourceDir">
-            <Directory Id="$(var.Program_Files)">
-                <Directory Id="DOTNETHOME" Name="dotnet"/>
-            </Directory>
-        </Directory>
-    </Fragment>
-</Wix>
-
diff --git a/src/installer/pkg/packaging/windows/hostfxr/provider.wxs b/src/installer/pkg/packaging/windows/hostfxr/provider.wxs
deleted file mode 100644 (file)
index 9fc76d1..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension">
-  <?include "Variables.wxi" ?>
-  <Fragment>
-    <Component Id="$(var.DependencyKeyId)" Directory="TARGETDIR" Win64="no">
-      <dep:Provides Key="$(var.DependencyKey)" />
-    </Component>
-  </Fragment>
-</Wix>
diff --git a/src/installer/pkg/packaging/windows/hostfxr/registrykeys.wxs b/src/installer/pkg/packaging/windows/hostfxr/registrykeys.wxs
deleted file mode 100644 (file)
index 041102c..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-  <?include "Variables.wxi" ?>
-  <Fragment>
-    <ComponentGroup Id="AuthoredRegistryKeys">
-      <Component Id="SetupRegistry_x86" Directory="TARGETDIR" Win64="no">
-        <RegistryKey Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.Platform)\hostfxr">
-          <RegistryValue Action="write" Name="Version" Type="string" Value="$(var.NugetVersion)" KeyPath="yes"/>
-        </RegistryKey>
-      </Component>
-    </ComponentGroup>
-  </Fragment>
-</Wix>
diff --git a/src/installer/pkg/packaging/windows/hostfxr/variables.wxi b/src/installer/pkg/packaging/windows/hostfxr/variables.wxi
deleted file mode 100644 (file)
index b0d4e68..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0"?>
-<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-  <?define HostFxr_NugetVersion   =   "$(var.NugetVersion)" ?>
-  <?define HostFxr_ProductVersion   =   "$(var.BuildVersion)" ?>
-  <?define HostFxr_BuildVersion   =   "$(var.BuildVersion)" ?>
-  <?define Manufacturer     =   "Microsoft Corporation" ?>
-  <?define ProductName      =   "$(var.ProductMoniker) ($(var.TargetArchitecture))" ?>
-  <?define ProductLanguage  =   "1033" ?>
-  <?define ProductVersion   =   "$(var.HostFxr_ProductVersion)" ?>
-  <?define LCID  = "$(var.ProductLanguage)"?>
-  <?define DowngradeErrorMessage  = "A newer version is already installed; please uninstall it and re-run setup."?>
-
-  <?define Platform   =   "$(sys.BUILDARCH)" ?>
-  <?if $(var.Platform)=x86?>
-  <?define Program_Files="ProgramFilesFolder"?>
-  <?define Win64AttributeValue=no?>
-  <?elseif $(var.Platform)=x64?>
-  <?define Program_Files="ProgramFiles64Folder"?>
-  <?define Win64AttributeValue=yes?>
-  <?else?>
-  <?error Invalid Platform ($(var.Platform))?>
-  <?endif?>
-
-  <?define DependencyKey   = "Dotnet_CLI_HostFxr_$(var.ComponentVersion)_$(var.Platform)"?>
-  <?define DependencyKeyId = "$(var.DependencyKey)" ?>
-</Include>
diff --git a/src/installer/pkg/packaging/windows/package.props b/src/installer/pkg/packaging/windows/package.props
deleted file mode 100644 (file)
index b4dd74e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <WindowsScriptRoot>$(PackagingRoot)windows\</WindowsScriptRoot>
-    <InsigniaCmd>$(WixToolsDir)\insignia.exe</InsigniaCmd>
-  </PropertyGroup>
-</Project>
\ No newline at end of file
diff --git a/src/installer/pkg/packaging/windows/package.targets b/src/installer/pkg/packaging/windows/package.targets
deleted file mode 100644 (file)
index 80191ef..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-<Import Project='package.props' />
-
-    <Target Name="GenerateMsis"
-            DependsOnTargets="
-              AcquireWix;
-              GetInstallerBrandingNames;
-              GenerateMsiVersionString"
-            Condition="'$(OSGroup)' == 'Windows_NT' and '$(GenerateMSI)' == 'true'">
-      <GenerateGuidFromName Name="$(SharedHostInstallerFile)">
-        <Output TaskParameter="GeneratedGuid" PropertyName="SharedHostUpgradeCode" />
-      </GenerateGuidFromName>
-
-      <GenerateGuidFromName Name="$(HostFxrInstallerFile)">
-        <Output TaskParameter="GeneratedGuid" PropertyName="HostFxrUpgradeCode" />
-      </GenerateGuidFromName>
-
-      <ItemGroup>
-        <WixOutputs Include="$(WixObjRoot)host">
-            <InputDir>$(SharedHostPublishRoot)</InputDir>
-            <BrandName>$(SharedHostBrandName)</BrandName>
-            <InstallerName>$(SharedHostInstallerFile)</InstallerName>
-            <UpgradeCode>$(SharedHostUpgradeCode)</UpgradeCode>
-        </WixOutputs>
-        <WixOutputs Include="$(WixObjRoot)hostfxr">
-            <InputDir>$(HostFxrPublishRoot)</InputDir>
-            <BrandName>$(HostFxrBrandName)</BrandName>
-            <InstallerName>$(HostFxrInstallerFile)</InstallerName>
-            <UpgradeCode>$(HostFxrUpgradeCode)</UpgradeCode>
-        </WixOutputs>
-      </ItemGroup>
-
-      <RemoveDir Directories="$(WixObjRoot)" />
-      <MakeDir Directories="$(WixObjRoot);@(WixOutputs);@(WixOutputs2)" />
-
-      <PropertyGroup>
-        <ArchParams>"$(MsiArch)" "$(TargetArchitecture)"</ArchParams>
-        <CommonParams>$(MsiVersionString) $(SharedFrameworkNugetVersion) $(ArchParams)</CommonParams>
-      </PropertyGroup>
-
-      <Exec Command="powershell -NoProfile -NoLogo $(WindowsScriptRoot)%(WixOutputs.Filename)\generatemsi.ps1 %(WixOutputs.InputDir) %(WixOutputs.InstallerName) $(WixToolsDir) '%(WixOutputs.BrandName)' $(CommonParams) %(WixOutputs.Identity) %(WixOutputs.UpgradeCode)" />
-  </Target>
-
-  <Target Name="GenerateBundles"
-          DependsOnTargets="
-            AcquireWix;
-            GetInstallerBrandingNames;
-            GetBundleDisplayVersion;
-            GenerateMsiVersionString"
-          Condition="'$(OSGroup)' == 'Windows_NT' and '$(GenerateMSI)' == 'true'">
-     <PropertyGroup>
-        <SharedFxBundleScript>$(WindowsScriptRoot)sharedframework\generatebundle.ps1</SharedFxBundleScript>
-        <ShareFXMsi>$(SharedFrameworkInstallerFile)</ShareFXMsi>
-        <HostMsi>$(SharedHostInstallerFile)</HostMsi>
-        <HostFxrMsi>$(HostFxrInstallerFile)</HostFxrMsi>
-        <SharedBundle>$(CombinedInstallerFile)</SharedBundle>
-       <!-- Warning: changing the value "BundleInstallerOutputGuidString" can only occur on a product-band boundary [ProductBandVersion], 
-               Changing "BundleInstallerOutputGuidString" mid-product-band will break the upgradability of the Shared Framework bundle installer. -->
-        <BundleInstallerOutputGuidString>.NET Core Shared Framework Bundle Installer $(ProductBandVersion) $(PackageTargetRid)</BundleInstallerOutputGuidString>
-        <SharedBrandName>$(SharedFrameworkBrandName)</SharedBrandName>
-        <ArchParams>"$(MsiArch)" "$(TargetArchitecture)"</ArchParams>
-     </PropertyGroup>
-
-     <GenerateGuidFromName Name="$(BundleInstallerOutputGuidString)">
-       <Output TaskParameter="GeneratedGuid" PropertyName="SharedBundleCode" />
-     </GenerateGuidFromName>
-
-     <PropertyGroup>
-        <BundleParameters>$(ShareFXMsi) $(HostMsi) $(HostFxrMsi) $(SharedBundle) $(WixToolsDir) '$(SharedBrandName)' $(MsiVersionString) $(BundleDisplayVersion) $(ProductBandVersion) $(SharedFrameworkName) $(SharedFrameworkNugetVersion) $(SharedBundleCode) $(ArchParams)</BundleParameters>
-     </PropertyGroup>
-
-     <Exec Command="powershell -NoProfile -NoLogo $(SharedFxBundleScript) $(BundleParameters)" />
-  </Target>
-
-  <Target Name="ExtractEngineBundle" Condition="'$(OSGroup)' == 'Windows_NT' and '$(GenerateMSI)' == 'true'">
-      <Exec Command="$(InsigniaCmd) -ib $(CombinedInstallerFile) -o $(CombinedInstallerEngine)" />
-  </Target>
-
-  <Target Name="ReattachEngineToBundle" Condition="'$(OSGroup)' == 'Windows_NT' and '$(GenerateMSI)' == 'true'">
-      <Exec Command="$(InsigniaCmd) -ab $(CombinedInstallerEngine) $(CombinedInstallerFile) -o $(CombinedInstallerFile)" />
-  </Target>
-
-</Project>
diff --git a/src/installer/pkg/packaging/windows/sharedframework/bundle.wxs b/src/installer/pkg/packaging/windows/sharedframework/bundle.wxs
deleted file mode 100644 (file)
index 49ed5f8..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
-     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
-     xmlns:swid="http://schemas.microsoft.com/wix/TagExtension"
-     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
-  <?include "Variables.wxi" ?>
-
-  <Bundle Name="$(var.ProductName)" Manufacturer="$(var.Manufacturer)"
-          Version="$(var.DisplayVersion)" UpgradeCode="$(var.UpgradeCode)"
-          AboutUrl="https://dot.net/core"
-          Compressed="yes">
-    
-    <bal:Condition
-     Message="#(loc.FailureNotSupportedCurrentOperatingSystem)">
-    ((VersionNT &gt; v6.1) OR (VersionNT = v6.1 AND ServicePackLevel &gt;= 1))
-    </bal:Condition>
-
-    <?if $(var.Platform)=x64?>
-     <bal:Condition
-      Message="#(loc.FailureNotSupportedX86OperatingSystem)">
-       VersionNT64
-     </bal:Condition>
-    <?endif?>
-
-    <!-- ***** When the product-band version: "3.0" advances, remove this section ***** -->
-    <?if $(var.ProductBandVersion)=3.0?>
-      <?if $(var.Platform)~=x86?>
-        <!-- ".NET Core 3.0.0 Preview 1" 3.0.0-preview-27122-01-win-x86 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{138DC905-5BB8-5C92-2BB2-CEEC57FD4912}"/>
-        <!-- ".NET Core 3.0.0 Preview 2" 3.0.0-preview-27324-5-win-x86 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{2210ACC2-5EA6-4707-01F8-B064B94BB1C8}"/>
-        <!-- ".NET Core 3.0.0 Preview 3" 3.0.0-preview3-27503-5-win-x86 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{8F802AA7-56BF-69E8-8E15-BE8FF8347CF7}"/>
-      <?endif?>
-      <?if $(var.Platform)~=x64?>
-        <!-- ".NET Core 3.0.0 Preview 1" 3.0.0-preview-27122-01-win-x64 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{C98F9B17-536C-711E-5B31-ADA492F8B956}"/>
-        <!-- ".NET Core 3.0.0 Preview 2" 3.0.0-preview-27324-5-win-x64 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{E5F8505A-5282-7C15-4388-83FB730DCC13}"/>
-        <!-- ".NET Core 3.0.0 Preview 3" 3.0.0-preview3-27503-5-win-x64 upgrade-code -->
-        <RelatedBundle Action="Upgrade" Id="{31F12178-5807-40A5-6799-2C9C47725A5E}"/>
-      <?endif?>
-    <?endif?>
-    <!-- ********************************************************************************** -->
-    
-    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.Foundation">
-      <bal:WixStandardBootstrapperApplication
-        LicenseFile="..\..\windows\sharedframework\dummyEula.rtf"
-        ShowFilesInUse="yes"
-        ShowVersion="yes"
-        />
-
-      <PayloadGroupRef Id="DotnetCoreBAPayloads" />
-    </BootstrapperApplicationRef>
-
-    <swid:Tag Regid="microsoft.com" InstallPath="[DOTNETHOME]" />
-
-    <Variable Name="DOTNETHOME" Type="string" Value="[$(var.Program_Files)]dotnet" bal:Overridable="no" />
-
-    <!-- Variables used solely for localization. -->
-    <Variable Name="BUNDLEMONIKER" Type="string" Value="$(var.ProductMoniker) ($(var.TargetArchitecture))" bal:Overridable="no" />
-    <Variable Name="PRODUCT_NAME" Type="string" Value="$(var.ProductName)" bal:Overridable="no" />
-    <Variable Name="LINK_PREREQ_PAGE" Type="string" Value="$(var.Link_PreReqPage)" bal:Overridable="no" />
-
-    <Chain DisableSystemRestore="yes" ParallelCache="yes">
-      <MsiPackage SourceFile="$(var.SharedFXMsiSourcePath)">
-        <MsiProperty Name="DOTNETHOME" Value="[DOTNETHOME]" />
-      </MsiPackage>
-      <MsiPackage SourceFile="$(var.HostFxrMsiSourcePath)">
-        <MsiProperty Name="DOTNETHOME" Value="[DOTNETHOME]" />
-      </MsiPackage>
-      <MsiPackage SourceFile="$(var.SharedHostMsiSourcePath)">
-        <MsiProperty Name="DOTNETHOME" Value="[DOTNETHOME]" />
-      </MsiPackage>
-    </Chain>
-  </Bundle>
-
-  <Fragment>
-    <PayloadGroup Id="DotnetCoreBAPayloads">
-      <Payload Name="thm.xml" Compressed="yes" SourceFile="bundle.thm" />
-      <Payload Name="thm.wxl" Compressed="yes" SourceFile="bundle.wxl" />
-
-      <Payload Name="bg.png" Compressed="yes" SourceFile="..\..\osx\sharedframework\resources\dotnetbackground.png" />
-
-      <?foreach LCID in $(var.LcidList)?>
-        <Payload Id="thm-$(var.LCID)" Compressed="yes" Name="$(var.LCID)\thm.wxl" SourceFile="theme\$(var.LCID)\bundle.wxl" />
-      <?endforeach?>
-
-      <Payload Name='eula.rtf' Compressed='yes' SourceFile='!(wix.WixStdbaLicenseRtf)' />
-    </PayloadGroup>
-
-    <CustomTable Id='WixStdbaInformation'>
-        <Row>
-            <Data Column='LicenseFile'>eula.rtf</Data>
-        </Row>
-    </CustomTable>
-  </Fragment>
-
-</Wix>
diff --git a/src/installer/pkg/packaging/windows/sharedframework/generatebundle.ps1 b/src/installer/pkg/packaging/windows/sharedframework/generatebundle.ps1
deleted file mode 100644 (file)
index 1875060..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-# Licensed to the .NET Foundation under one or more agreements.
-# The .NET Foundation licenses this file to you under the MIT license.
-# See the LICENSE file in the project root for more information.
-
-param(
-    [Parameter(Mandatory=$true)][string]$SharedFxMSIFile,
-    [Parameter(Mandatory=$true)][string]$SharedHostMSIFile,
-    [Parameter(Mandatory=$true)][string]$HostFxrMSIFile,
-    [Parameter(Mandatory=$true)][string]$DotnetBundleOutput,
-    [Parameter(Mandatory=$true)][string]$WixRoot,
-    [Parameter(Mandatory=$true)][string]$ProductMoniker,
-    [Parameter(Mandatory=$true)][string]$DotnetMSIVersion,
-    [Parameter(Mandatory=$true)][string]$DotnetCLIVersion,
-    [Parameter(Mandatory=$true)][string]$ProductBandVersion,
-    [Parameter(Mandatory=$true)][string]$SharedFrameworkNugetName,
-    [Parameter(Mandatory=$true)][string]$SharedFrameworkNugetVersion,
-    [Parameter(Mandatory=$true)][string]$SharedFrameworkUpgradeCode,
-    [Parameter(Mandatory=$true)][string]$TargetArchitecture,
-    [Parameter(Mandatory=$true)][string]$Architecture
-)
-
-$RepoRoot = Convert-Path "$PSScriptRoot\..\..\..\..\.."
-$CommonScript = "$RepoRoot\tools-local\scripts\common\_common.ps1"
-if(-Not (Test-Path "$CommonScript"))
-{
-    Exit -1
-} 
-. "$CommonScript"
-
-$PackagingRoot = Join-Path $RepoRoot "src\pkg\packaging"
-
-function RunCandleForBundle
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running candle for bundle..
-    $AuthWsxRoot =  Join-Path $PackagingRoot "windows\sharedframework"
-    $SharedFrameworkComponentVersion = $SharedFrameworkNugetVersion.Replace('-', '_');
-
-    $LcidList = (Get-ChildItem "$AuthWsxRoot\theme\*\bundle.wxl").Directory.Name -join ';'
-
-    .\candle.exe -nologo `
-        -dMicrosoftEula="$PackagingRoot\windows\eula.rtf" `
-        -dProductMoniker="$ProductMoniker" `
-        -dBuildVersion="$DotnetMSIVersion" `
-        -dDisplayVersion="$DotnetCLIVersion" `
-        -dProductBandVersion="$ProductBandVersion" `
-        -dSharedFXMsiSourcePath="$SharedFxMSIFile" `
-        -dSharedHostMsiSourcePath="$SharedHostMSIFile" `
-        -dHostFxrMsiSourcePath="$HostFxrMSIFile" `
-        -dFrameworkName="$SharedFrameworkNugetName" `
-        -dFrameworkDisplayVersion="$SharedFrameworkNugetVersion" `
-        -dFrameworkComponentVersion="$SharedFrameworkComponentVersion" `
-        -dFrameworkUpgradeCode="$SharedFrameworkUpgradeCode" `
-        -dTargetArchitecture="$TargetArchitecture" `
-        -dLcidList="$LcidList" `
-        -arch "$Architecture" `
-        -ext WixBalExtension.dll `
-        -ext WixUtilExtension.dll `
-        -ext WixTagExtension.dll `
-        "$AuthWsxRoot\bundle.wxs" | Out-Host
-
-    if($LastExitCode -ne 0)
-    {
-        $result = $false
-        Write-Host "Candle failed with exit code $LastExitCode."
-    }
-
-    popd
-    return $result
-}
-
-function RunLightForBundle
-{
-    $result = $true
-    pushd "$WixRoot"
-
-    Write-Host Running light for bundle..
-    $AuthWsxRoot =  Join-Path $PackagingRoot "windows\sharedframework"
-
-    $lightLogFile = $null
-    $maxRetries = 5
-    foreach ($retry in 0..$maxRetries)
-    {
-        if ($retry)
-        {
-            # Wait one second per number of retries. This is intended to avoid
-            # interference by Windows Defender by giving it time to catch up.
-            $sleepTime = $retry
-            Write-Host "Retrying after $($sleepTime)s of sleep..."
-            Start-Sleep $sleepTime
-            Write-Host "Retrying... (#$retry of $maxRetries)"
-        }
-
-        $lightLogFile = Join-Path $WixTempPath "runtime-bundle-light-$retry.log"
-
-        .\light.exe -nologo `
-            -cultures:en-us `
-            bundle.wixobj `
-            -ext WixBalExtension.dll `
-            -ext WixUtilExtension.dll `
-            -ext WixTagExtension.dll `
-            -b "$AuthWsxRoot" `
-            -out $DotnetBundleOutput > $lightLogFile
-
-        if($LastExitCode -ne 0)
-        {
-            $result = $false
-            
-            Write-Host "Light failed with exit code $LastExitCode. Output written to $lightLogFile"
-        }
-        else
-        {
-            $result = $true
-            break
-        }
-    }
-
-    if ($lightLogFile)
-    {
-        Get-Content $lightLogFile | Out-Host
-    }
-
-    popd
-    return $result
-}
-
-Write-Host "Creating shared framework bundle at $DotnetBundleOutput"
-
-if([string]::IsNullOrEmpty($WixRoot))
-{
-    Exit -1
-}
-
-$WixTempPath = Join-Path $WixRoot "wix_temp"
-New-Item -ItemType Directory -Path $WixTempPath -Force | Out-Null
-$env:WIX_TEMP = $WixTempPath
-
-if(-Not (RunCandleForBundle))
-{
-    Exit -1
-}
-
-if(-Not (RunLightForBundle))
-{
-    Exit -1
-}
-
-if(!(Test-Path $DotnetBundleOutput))
-{
-    throw "Unable to create the dotnet bundle."
-    Exit -1
-}
-
-Write-Host -ForegroundColor Green "Successfully created shared framework bundle - $DotnetBundleOutput"
-
-exit $LastExitCode
diff --git a/src/installer/pkg/packaging/windows/sharedframework/variables.wxi b/src/installer/pkg/packaging/windows/sharedframework/variables.wxi
deleted file mode 100644 (file)
index 8864baf..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-  <?define Manufacturer     =   "Microsoft Corporation" ?>
-  <?define ProductName      =   "$(var.ProductMoniker) ($(var.TargetArchitecture))" ?>
-  <?define ProductLanguage  =   "1033" ?>
-  <?define ProductVersion   =   "$(var.BuildVersion)" ?>
-  <?define LCID  = "$(var.ProductLanguage)"?>
-  <?define Link_PreReqPage  = "https://go.microsoft.com/fwlink/?linkid=846817"?>
-  <?define DowngradeErrorMessage  = "A newer version is already installed; please uninstall it and re-run setup."?>
-
-  <?define Platform   =   "$(sys.BUILDARCH)" ?>
-
-  <!--
-    The provided upgrade code already between x86 and x64
-    (since it is a GUID based on a string which includes the architecture)
-  -->
-  <?define UpgradeCode="$(var.FrameworkUpgradeCode)"?>
-
-  <?if $(var.Platform)=x86?>
-  <?define Program_Files="ProgramFilesFolder"?>
-  <?define Win64AttributeValue=no?>
-  <?elseif $(var.Platform)=x64?>
-  <?define Program_Files="ProgramFiles64Folder"?>
-  <?define Win64AttributeValue=yes?>
-  <?else?>
-  <?error Invalid Platform ($(var.Platform))?>
-  <?endif?>
-
-  <?define DependencyKey  = "DotNet.CLI.SharedFramework.$(var.FrameworkName)_$(var.FrameworkComponentVersion)_$(var.Platform)"?>
-  <?define DependencyKeyId = "$(var.DependencyKey)" ?>
-</Include>
diff --git a/src/installer/pkg/packaging/windows/vscomponents/generatenupkg.ps1 b/src/installer/pkg/packaging/windows/vscomponents/generatenupkg.ps1
deleted file mode 100644 (file)
index 52cf538..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright (c) .NET Foundation and contributors. All rights reserved.
-# Licensed under the MIT license. See LICENSE file in the project root for full license information.
-
-param(
-    [Parameter(Mandatory=$true)][string]$MsiPath,
-    [Parameter(Mandatory=$true)][string]$MsiVersion,
-    [Parameter(Mandatory=$true)][string]$NuspecFile,
-    [Parameter(Mandatory=$true)][string]$NupkgFile,
-    [Parameter(Mandatory=$true)][string]$Architecture,
-    [Parameter(Mandatory=$true)][string]$ComponentName,
-    [Parameter(Mandatory=$true)][string]$ComponentFriendlyName,
-    [Parameter(Mandatory=$true)][string]$ProjectUrl,
-    [Parameter(Mandatory=$true)][string]$BinDir
-)
-
-$NuGetDir = Join-Path $BinDir  "nuget"
-$NuGetExe = Join-Path $NuGetDir "nuget.exe"
-$OutputDirectory = [System.IO.Path]::GetDirectoryName($NupkgFile)
-
-if (-not (Test-Path $NuGetDir)) {
-    New-Item -ItemType Directory -Force -Path $NuGetDir | Out-Null
-}
-
-if (-not (Test-Path $NuGetExe)) {
-    # Using 3.5.0 to workaround https://github.com/NuGet/Home/issues/5016
-    Write-Output "Downloading nuget.exe to $NuGetExe"
-    wget https://dist.nuget.org/win-x86-commandline/v3.5.0/nuget.exe -OutFile $NuGetExe
-}
-
-if (Test-Path $NupkgFile) {
-    Remove-Item -Force $NupkgFile
-}
-
-& $NuGetExe pack $NuspecFile -Version $MsiVersion -OutputDirectory $OutputDirectory -NoDefaultExcludes -NoPackageAnalysis -Properties COMPONENT_MSI=$MsiPath`;ARCH=$Architecture`;COMPONENT_NAME=$ComponentName`;FRIENDLY_NAME=$ComponentFriendlyName`;PROJECT_URL=$ProjectUrl
-Exit $LastExitCode
index 29561a1..0293800 100644 (file)
     <RestoreAllBuildRids>true</RestoreAllBuildRids>
   </PropertyGroup>
 
+  <PropertyGroup>
+    <VSInsertionProductName>NetCore</VSInsertionProductName>
+    <VSInsertionCommonPrefix>VS.Redist.Common</VSInsertionCommonPrefix>
+  </PropertyGroup>
+
   <!-- Most packages need the host to be built first. -->
   <ItemGroup Condition="'$(DisableOrderDependencies)' != 'true'">
     <OrderProjectReference Include="@(CorehostProjectToBuild)" />
index 90c7003..d4c5824 100644 (file)
@@ -2,8 +2,51 @@
 
   <PropertyGroup>
     <VersionProp>HostVersion</VersionProp>
+
+    <InstallerName>dotnet-host</InstallerName>
+    <GenerateSharedFrameworkPart>true</GenerateSharedFrameworkPart>
   </PropertyGroup>
 
+  <Target Name="SetupHostSpecificWixBuild"
+          DependsOnTargets="GetInstallerBrandingNames"
+          BeforeTargets="GetWixBuildConfiguration">
+    <PropertyGroup>
+      <WixProductMoniker>$(SharedHostBrandName)</WixProductMoniker>
+      <RegKeyProductName>sharedhost</RegKeyProductName>
+      <WixDependencyKeyName>Dotnet_CLI_SharedHost</WixDependencyKeyName>
+      <VSInsertionShortComponentName>SharedHost</VSInsertionShortComponentName>
+
+      <PublishRootDir>$(IntermediateOutputPath)publishRoot/</PublishRootDir>
+    </PropertyGroup>
+
+    <!-- Always clean this up to avoid side-by-side versions in unclean dev builds. -->
+    <RemoveDir Directories="$(PublishRootDir)" />
+
+    <!-- copy shared host layout -->
+    <Copy SourceFiles="$(DotNetHostBinDir)/dotnet$(ApplicationFileExtension)"
+          DestinationFolder="$(PublishRootDir)" />
+
+    <Copy SourceFiles="$(ProjectDir)THIRD-PARTY-NOTICES.TXT"
+          DestinationFiles="$(PublishRootDir)ThirdPartyNotices.txt" />
+
+    <Copy SourceFiles="$(ProjectDir)LICENSE.TXT"
+          DestinationFiles="$(PublishRootDir)LICENSE.txt"
+          Condition="'$(TargetsUnix)' == 'true'"/>
+
+    <Copy SourceFiles="$(ProjectDir)resources/LICENSE-MSFT.txt"
+          DestinationFiles="$(PublishRootDir)LICENSE.txt"
+          Condition="'$(TargetsUnix)' != 'true'"/>
+
+    <ItemGroup>
+      <WixSrcFile Include="host.wxs" />
+
+      <WixExtraComponentGroupRefId Include="InstallSharedHostandDetectionKeys" />
+
+      <CandleVariables Include="ExtraPropertyRefIds" Value="ProductCPU;RTM_ProductVersion" />
+      <CandleVariables Include="HostSrc" Value="$(PublishRootDir)" />
+    </ItemGroup>
+  </Target>
+
   <Import Condition="'$(PackageTargetRuntime)' != ''" Project="$(MSBuildThisFileDirectory)runtime.$(OSGroup).$(MSBuildProjectName).props" />
 
 </Project>
diff --git a/src/installer/pkg/projects/Microsoft.NETCore.DotNetHost/host.wxs b/src/installer/pkg/projects/Microsoft.NETCore.DotNetHost/host.wxs
new file mode 100644 (file)
index 0000000..5ac81a9
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <?include "$(var.SharedWixDir)\variables.wxi" ?>
+
+  <Fragment>
+
+    <ComponentGroup Id="InstallSharedHostandDetectionKeys">
+
+      <Component Id="cmpCoreHost" Directory="DOTNETHOME" Guid="{45399BBB-DDA5-4386-A2E9-618FB3C54A18}" >
+        <File Id="fileCoreHostExe" KeyPath="yes" Source="$(var.HostSrc)\dotnet.exe" />
+        <RegistryKey Root="HKLM" Key="SOFTWARE\dotnet\Setup\InstalledVersions\$(var.Platform)\sharedhost">
+          <RegistryValue Action="write" Name="Version" Type="string" Value="$(var.NugetVersion)"/>
+        </RegistryKey>
+        <Environment Id="E_PATH" Name="PATH" Value="[DOTNETHOME]" Part="last" Action="set" System="yes" />
+      </Component>
+
+      <Component Id="cmpLicenseFiles" Directory="DOTNETHOME" Guid="{A61CBE5B-1282-4F29-90AD-63597AA2372E}">
+        <File Id="fileLicenseTxt" KeyPath="yes" Source="$(var.HostSrc)\LICENSE.txt" />
+        <File Id="fileThirdPartyNoticesTxt" Source="$(var.HostSrc)\ThirdPartyNotices.txt" />
+      </Component>
+
+    </ComponentGroup>
+
+    <Property Id="ProductCPU" Value="$(var.Platform)" />
+    <Property Id="RTM_ProductVersion" Value="$(var.Dotnet_ProductVersion)" />
+
+  </Fragment>
+
+</Wix>
index 3fb43c1..e9df60e 100644 (file)
@@ -2,12 +2,49 @@
 
   <PropertyGroup>
     <VersionProp>HostResolverVersion</VersionProp>
+
+    <InstallerName>dotnet-hostfxr</InstallerName>
+    <GenerateSharedFrameworkPart>true</GenerateSharedFrameworkPart>
   </PropertyGroup>
 
   <ItemGroup>
     <Dependency Include="Microsoft.NETCore.DotNetAppHost" VersionProp="AppHostVersion" />
   </ItemGroup>
 
+  <Target Name="SetupHostResolverSpecificWixBuild"
+          DependsOnTargets="
+            GetProductVersions;
+            GetInstallerBrandingNames"
+          BeforeTargets="GetWixBuildConfiguration">
+    <PropertyGroup>
+      <WixProductMoniker>$(HostFxrBrandName)</WixProductMoniker>
+      <RegKeyProductName>hostfxr</RegKeyProductName>
+      <WixDependencyKeyName>Dotnet_CLI_HostFxr</WixDependencyKeyName>
+      <VSInsertionShortComponentName>HostFXR</VSInsertionShortComponentName>
+
+      <PublishRootDir>$(IntermediateOutputPath)publishRoot/</PublishRootDir>
+    </PropertyGroup>
+
+    <!-- Always clean this up to avoid side-by-side versions in unclean dev builds. -->
+    <RemoveDir Directories="$(PublishRootDir)" />
+
+    <!-- Copy files to staging location to easily set up relative directory for WiX. -->
+    <Copy
+      SourceFiles="$(DotNetHostBinDir)/$(LibraryFilePrefix)hostfxr$(LibraryFileExtension)"
+      DestinationFolder="$(PublishRootDir)host/fxr/$(HostResolverVersion)" />
+
+    <ItemGroup>
+      <CandleVariables Include="AuthoredRegistryKeys;RegKeyNugetVersionValue" Value="true" />
+
+      <DirectoryToHarvest
+        Include="$(PublishRootDir)"
+        Name="install-files"
+        SubstituteVar="HostFxrSrc"
+        ComponentGroupName="InstallFiles"
+        DirectoryRef="DOTNETHOME" />
+    </ItemGroup>
+  </Target>
+
   <Import Project="$(MSBuildProjectName).props" />
 
 </Project>
diff --git a/src/installer/pkg/projects/netcoreapp/sfx/Microsoft.NETCore.App.Bundle.bundleproj b/src/installer/pkg/projects/netcoreapp/sfx/Microsoft.NETCore.App.Bundle.bundleproj
new file mode 100644 (file)
index 0000000..7f2200f
--- /dev/null
@@ -0,0 +1,44 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <!--
+      Name, used to generate the bundle upgrade code. Must stay the same to allow bundles in a given
+      product band to upgrade in place.
+    -->
+    <BundleInstallerUpgradeCodeSeed>.NET Core Shared Framework Bundle Installer</BundleInstallerUpgradeCodeSeed>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <BundleComponentReference Include="Microsoft.NETCore.App.SharedFx.sfxproj" />
+    <BundleComponentReference Include="..\..\Microsoft.NETCore.DotNetHostResolver\Microsoft.NETCore.DotNetHostResolver.pkgproj" />
+    <BundleComponentReference Include="..\..\Microsoft.NETCore.DotNetHost\Microsoft.NETCore.DotNetHost.pkgproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <CandleVariables Include="BundleThmDir" Value="$(MSBuildProjectDirectory)" />
+  </ItemGroup>
+
+  <!-- ***** When the product-band version: "3.0" advances, remove these sections to clean up ***** -->
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'x86'">
+    <!-- ".NET Core 3.0.0 Preview 1" 3.0.0-preview-27122-01-win-x86 upgrade-code -->
+    <UpgradeRelatedBundle Include="{138DC905-5BB8-5C92-2BB2-CEEC57FD4912}" />
+    <!-- ".NET Core 3.0.0 Preview 2" 3.0.0-preview-27324-5-win-x86 upgrade-code -->
+    <UpgradeRelatedBundle Include="{2210ACC2-5EA6-4707-01F8-B064B94BB1C8}" />
+    <!-- ".NET Core 3.0.0 Preview 3" 3.0.0-preview3-27503-5-win-x86 upgrade-code -->
+    <UpgradeRelatedBundle Include="{8F802AA7-56BF-69E8-8E15-BE8FF8347CF7}" />
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(TargetArchitecture)' == 'x64'">
+    <!-- ".NET Core 3.0.0 Preview 1" 3.0.0-preview-27122-01-win-x64 upgrade-code -->
+    <UpgradeRelatedBundle Include="{C98F9B17-536C-711E-5B31-ADA492F8B956}" />
+    <!-- ".NET Core 3.0.0 Preview 2" 3.0.0-preview-27324-5-win-x64 upgrade-code -->
+    <UpgradeRelatedBundle Include="{E5F8505A-5282-7C15-4388-83FB730DCC13}" />
+    <!-- ".NET Core 3.0.0 Preview 3" 3.0.0-preview3-27503-5-win-x64 upgrade-code -->
+    <UpgradeRelatedBundle Include="{31F12178-5807-40A5-6799-2C9C47725A5E}" />
+  </ItemGroup>
+
+  <ItemGroup Condition="'$(NETCoreAppFrameworkVersion)' == '3.0'">
+    <CandleVariables Include="RelatedDotNetBundleIds" Value="@(UpgradeRelatedBundle)" />
+  </ItemGroup>
+
+</Project>
index 4c722a5..9d2fc8a 100644 (file)
@@ -24,6 +24,8 @@
     <PkgProjectReference Include="..\..\Microsoft.NETCore.DotNetHost\Microsoft.NETCore.DotNetHost.pkgproj" />
     <PkgProjectReference Include="..\..\Microsoft.NETCore.DotNetHostPolicy\Microsoft.NETCore.DotNetHostPolicy.pkgproj" />
     <PkgProjectReference Include="..\..\Microsoft.NETCore.DotNetHostResolver\Microsoft.NETCore.DotNetHostResolver.pkgproj" />
+
+    <OrderProjectReference Include="$(RepoRoot)signing\SignMsiFiles.proj" />
   </ItemGroup>
 
   <!--
index c355847..5f001b5 100644 (file)
@@ -15,6 +15,8 @@
     <FrameworkListTargetFrameworkIdentifier>.NETStandard</FrameworkListTargetFrameworkIdentifier>
     <FrameworkListTargetFrameworkVersion>2.1</FrameworkListTargetFrameworkVersion>
     <FrameworkListFrameworkName>NETStandard.Library</FrameworkListFrameworkName>
+
+    <VSInsertionProductName>NetStandard</VSInsertionProductName>
   </PropertyGroup>
 
   <!-- Redistribute package content from other nuget packages. -->
index a9b917f..96d3e77 100644 (file)
@@ -12,6 +12,8 @@
 
     <FrameworkPackageName>Microsoft.WindowsDesktop.App</FrameworkPackageName>
 
+    <VSInsertionProductName>WindowsDesktop</VSInsertionProductName>
+
     <!--
       Disable FileVersion check for WindowsDesktop. Files with no FileVersion, as of writing:
 
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/Microsoft.WindowsDesktop.App.Bundle.bundleproj b/src/installer/pkg/projects/windowsdesktop/sfx/Microsoft.WindowsDesktop.App.Bundle.bundleproj
new file mode 100644 (file)
index 0000000..de735ae
--- /dev/null
@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <!--
+      Name, used to generate the bundle upgrade code. Must stay the same to allow bundles in a given
+      product band to upgrade in place.
+    -->
+    <BundleInstallerUpgradeCodeSeed>Windows Desktop Shared Framework Bundle Installer</BundleInstallerUpgradeCodeSeed>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <BundleComponentReference Include="Microsoft.WindowsDesktop.App.SharedFx.sfxproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <CandleVariables Include="BundleThmDir" Value="$(MSBuildProjectDirectory)" />
+  </ItemGroup>
+
+</Project>
index 8aa529c..31468cb 100644 (file)
@@ -3,12 +3,13 @@
   <PropertyGroup>
     <SfxIdentity>Microsoft.WindowsDesktop.App</SfxIdentity>
 
-    <GenerateCompressedArchive>true</GenerateCompressedArchive>
     <GenerateNetCoreAppRuntimeConfig>true</GenerateNetCoreAppRuntimeConfig>
   </PropertyGroup>
 
   <ItemGroup>
     <PkgProjectReference Include="..\pkg\Microsoft.WindowsDesktop.App.pkgproj" />
+
+    <OrderProjectReference Include="$(RepoRoot)signing\SignMsiFiles.proj" />
   </ItemGroup>
 
 </Project>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/bundle.thm b/src/installer/pkg/projects/windowsdesktop/sfx/bundle.thm
new file mode 100644 (file)
index 0000000..d798f72
--- /dev/null
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
+  <Window Width="660" Height="468" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
+    <Font Id="0" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
+    <Font Id="1" Height="-24" Weight="900" Foreground="FFFFFF" Background="D42B51">Segoe UI</Font>
+    <Font Id="2" Height="-22" Weight="500" Foreground="666666">Segoe UI</Font>
+    <Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
+    <Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Background="FFFFFF" Underline="yes">Segoe UI</Font>
+    <Font Id="5" Height="-14" Weight="500" Foreground="444444">Segoe UI</Font>
+
+    <Text Name="Title" X="11" Y="11" Width="-11" Height="64" FontId="1" Visible="yes" Center="yes" DisablePrefix="yes">#(loc.Title)</Text>
+
+    <Page Name="Help">
+        <Text X="0" Y="0" Width="620" Height="75" FontId="1" />
+
+        <Text Name="HelpHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Text>
+        <Text Name="HelpText" X="20" Y="115" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Text>
+        <Button Name="HelpCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.HelpCloseButton)</Button>
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+    </Page>
+    <Page Name="Install">
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="WelcomeText" X="155" Y="80" Width="-11" Height="-70" FontId="2" HexStyle="0x800000" DisablePrefix="yes" />
+        <Text Name="WelcomeHeaderMessage" X="160" Y="81" Width="300" Height="30" FontId="2">#(loc.WelcomeHeaderMessage)</Text>
+        <Text Name="WelcomeDescription" X="160" Y="125" Width="460" Height="65" FontId="3">#(loc.WelcomeDescription)</Text>
+        <Text Name="LearnMoreTitle" X="160" Y="200" Width="460" Height="30" FontId="2">#(loc.LearnMoreTitle)</Text>
+        <Hypertext Name="WelcomeDocumentationLink" X="185" Y="238" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.DocumentationLink)</Hypertext>
+        <Hypertext Name="PrivacyStatementLink" X="185" Y="259" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.PrivacyStatementLink)</Hypertext>
+        <Hypertext Name="EulaLink" X="185" Y="281" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.EulaLink)</Hypertext>
+        <Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
+        <Button Name="WelcomeCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
+    </Page>
+    <Page Name="Options">
+        <Image X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Text>
+        <Text X="11" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OptionsLocationLabel)</Text>
+        <Editbox Name="FolderEditbox" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
+        <Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">#(loc.OptionsBrowseButton)</Button>
+        <Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsOkButton)</Button>
+        <Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.OptionsCancelButton)</Button>
+    </Page>
+    <Page Name="FilesInUse">
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="FilesInUseHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.FilesInUseHeader)</Text>
+        <Text Name="FilesInUseLabel" X="11" Y="121" Width="-11" Height="34" FontId="3" DisablePrefix="yes">#(loc.FilesInUseLabel)</Text>
+        <Text Name="FilesInUseText" X="11" Y="150" Width="-11" Height="-86" FontId="3" DisablePrefix="yes" HexStyle="0x0000000C"></Text>
+
+        <Button Name="FilesInUseCloseRadioButton" X="300" Y="-65" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseCloseRadioButton)</Button>
+        <Button Name="FilesInUseDontCloseRadioButton" X="300" Y="-45" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseDontCloseRadioButton)</Button>
+
+        <Button Name="FilesInUseOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FilesInUseOkButton)</Button>
+        <Button Name="FilesInUseCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FilesInUseCancelButton)</Button>
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+    </Page>
+    <Page Name="Progress">
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="ProgressHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Text>
+        <Text Name="ProgressLabel" X="11" Y="121" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Text>
+        <Text Name="OverallProgressPackageText" X="85" Y="121" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Text>
+        <Progressbar Name="OverallCalculatedProgressbar" X="11" Y="143" Width="-11" Height="15" />
+        <Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
+    </Page>
+    <Page Name="Modify">
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="ModifyHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Text>
+        <Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
+        <Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
+        <Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyCloseButton)</Button>
+    </Page>
+    <Page Name="Success">
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="SuccessHeader" X="11" Y="80"  Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessHeader)</Text>
+        <Text Name="SuccessInstallHeader" X="160" Y="80" Width="400" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessInstallHeader)</Text>
+        <Text Name="SuccessRepairHeader" X="160" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRepairHeader)</Text>
+        <Text Name="SuccessUninstallHeader" X="160" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessUninstallHeader)</Text>
+        <Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
+        <Text Name="SuccessRestartText" X="-11" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRestartText)</Text>
+        
+         <Text Name="SuccessInstallLocation" X="160" Y="130" Width="400" Height="20" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessInstallLocation)</Text>
+         <Text Name="SuccessInstallProductName" X="185" Y="155" Width="400" Height="30" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessInstallProductName)</Text>
+         <Text Name="SuccessInstallResourcesHeader" X="160" Y="195" Width="400" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.ResourcesHeader)</Text>
+         <Hypertext Name="DocumentationLink" X="185" Y="238" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.DocumentationLink)</Hypertext>
+         <Hypertext Name="RelaseNotesLink" X="185" Y="259" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.RelaseNotesLink)</Hypertext>
+         <Hypertext Name="TutorialLink" X="185" Y="280" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.TutorialLink)</Hypertext>
+         <Hypertext Name="TelemetryLink" X="185" Y="301" Width="400" Height="22" FontId="3" TabStop="yes" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.TelemetryLink)</Hypertext>
+        
+        <Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
+        <Button Name="SuccessCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.SuccessCloseButton)</Button>
+    </Page>
+    <Page Name="Failure">
+        <Image Name="BackgroundImage" X="0" Y="0" Width="620" Height="418" ImageFile="bg.png" />
+        <Text X="0" Y="0" Width="660" Height="75" FontId="1" />
+
+        <Text Name="FailureHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureHeader)</Text>
+        <Text Name="FailureInstallHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureInstallHeader)</Text>
+        <Text Name="FailureUninstallHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureUninstallHeader)</Text>
+        <Text Name="FailureRepairHeader" X="11" Y="80" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRepairHeader)</Text>
+        <Hypertext Name="FailureLogFileLink" X="11" Y="121" Width="-11" Height="42" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
+        <Hypertext Name="FailureMessageText" X="22" Y="163" Width="-11" Height="51" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
+        <Text Name="FailureRestartText" X="-11" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRestartText)</Text>
+        <Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
+        <Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FailureCloseButton)</Button>
+    </Page>
+</Theme>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1028/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1028/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1029/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1029/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1031/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1031/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1033/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1033/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1036/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1036/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1040/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1040/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1041/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1041/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1042/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1042/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1045/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1045/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1046/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1046/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1049/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1049/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/1055/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/1055/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/2052/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/2052/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
diff --git a/src/installer/pkg/projects/windowsdesktop/sfx/theme/3082/bundle.wxl b/src/installer/pkg/projects/windowsdesktop/sfx/theme/3082/bundle.wxl
new file mode 100644 (file)
index 0000000..fc82634
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+  <String Id="Caption">[WixBundleName] Installer</String>
+  <String Id="Title">[BUNDLEMONIKER]</String>
+  <String Id="Motto">You just need a shell, a text editor and 10 minutes of your time.
+
+Ready? Set? Let's go!</String>
+  <String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
+  <String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
+  <String Id="HelpHeader">Setup Help</String>
+  <String Id="HelpText">/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%.</String>
+  <String Id="HelpCloseButton">&amp;Close</String>
+  <String Id="InstallAcceptCheckbox">I &amp;agree to the license terms and conditions</String>
+  <String Id="InstallOptionsButton">&amp;Options</String>
+  <String Id="InstallInstallButton">&amp;Install</String>
+  <String Id="InstallCloseButton">&amp;Close</String>
+  <String Id="OptionsHeader">Setup Options</String>
+  <String Id="OptionsLocationLabel">Install location:</String>
+  <String Id="OptionsBrowseButton">&amp;Browse</String>
+  <String Id="OptionsOkButton">&amp;OK</String>
+  <String Id="OptionsCancelButton">&amp;Cancel</String>
+  <String Id="ProgressHeader">Setup Progress</String>
+  <String Id="ProgressLabel">Processing:</String>
+  <String Id="OverallProgressPackageText">Initializing...</String>
+  <String Id="ProgressCancelButton">&amp;Cancel</String>
+  <String Id="ModifyHeader">Modify Setup</String>
+  <String Id="ModifyRepairButton">&amp;Repair</String>
+  <String Id="ModifyUninstallButton">&amp;Uninstall</String>
+  <String Id="ModifyCloseButton">&amp;Close</String>
+  <String Id="SuccessRepairHeader">Repair Successfully Completed</String>
+  <String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
+  <String Id="SuccessInstallHeader">Installation was successful</String>
+  <String Id="SuccessHeader">Setup Successful</String>
+  <String Id="SuccessLaunchButton">&amp;Launch</String>
+  <String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
+  <String Id="SuccessRestartButton">&amp;Restart</String>
+  <String Id="SuccessCloseButton">&amp;Close</String>
+  <String Id="FailureHeader">Setup Failed</String>
+  <String Id="FailureInstallHeader">Setup Failed</String>
+  <String Id="FailureUninstallHeader">Uninstall Failed</String>
+  <String Id="FailureRepairHeader">Repair Failed</String>
+  <String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the &lt;a href="#"&gt;log file&lt;/a&gt;.</String>
+  <String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
+  <String Id="FailureRestartButton">&amp;Restart</String>
+  <String Id="FailureCloseButton">&amp;Close</String>
+  <String Id="FailureNotSupportedCurrentOperatingSystem">The [PRODUCT_NAME] is not supported on this operating system. For more information, see [LINK_PREREQ_PAGE].</String>
+  <String Id="FailureNotSupportedX86OperatingSystem">The [PRODUCT_NAME] isn't supported on x86 operating systems. Please install using the corresponding x86 installer.</String>
+  <String Id="FilesInUseHeader">Files In Use</String>
+  <String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
+  <String Id="FilesInUseCloseRadioButton">Close the &amp;applications and attempt to restart them.</String>
+  <String Id="FilesInUseDontCloseRadioButton">&amp;Do not close applications. A reboot will be required.</String>
+  <String Id="FilesInUseOkButton">&amp;OK</String>
+  <String Id="FilesInUseCancelButton">&amp;Cancel</String>
+  <String Id="WelcomeHeaderMessage">Windows Desktop Runtime</String>
+  <String Id="WelcomeDescription">.NET Core is a development platform that you can use to build command-line applications, microservices and modern websites. It is open source, cross-platform, and supported by Microsoft. We hope you enjoy it!</String>
+  <String Id="LearnMoreTitle">Learn more about .NET Core</String>
+  <String Id="SuccessInstallLocation">The following was installed at [DOTNETHOME]</String>
+  <String Id="SuccessInstallProductName"> - [BUNDLEMONIKER] </String>
+  <String Id="ResourcesHeader">Resources</String>
+  <String Id="DocumentationLink">&lt;A HREF=&quot;https://aka.ms/dotnet-docs&quot;&gt;Documentation&lt;/A&gt;</String>
+  <String Id="RelaseNotesLink">&lt;A HREF=&quot;https://aka.ms/20-p2-rel-notes&quot;&gt;Release Notes&lt;/A&gt;</String>
+  <String Id="TutorialLink">&lt;A HREF=&quot;https://aka.ms/dotnet-tutorials&quot;&gt;Tutorials&lt;/A&gt;</String>
+  <String Id="TelemetryLink">&lt;A HREF=&quot;https://aka.ms/dotnet-cli-telemetry&quot;&gt;.NET Core Telemetry&lt;/A&gt;</String>
+  <String Id="PrivacyStatementLink">&lt;A HREF=&quot;https://aka.ms/dev-privacy&quot;&gt;Privacy Statement&lt;/A&gt;</String>
+  <String Id="EulaLink">&lt;A HREF=&quot;https://go.microsoft.com/fwlink/?LinkId=329770&quot;&gt;.NET Library EULA&lt;/A&gt;</String>
+  
+</WixLocalization>
index 64541ae..0afd943 100644 (file)
@@ -1,21 +1,15 @@
 <Project>
 
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory).., Directory.Build.targets))\Directory.Build.targets" />
-
-  <!-- If signing is enabled, wait until all projects in this stage are done and sign them. -->
-  <Target Name="Build"
-          Condition="
-            '$(SkipSigning)' != 'true' and
-            '$(OSGroup)' == 'Windows_NT'">
-    <!-- Ensure all projects in this stage have built. -->
-    <MSBuild
-      Projects="@(StageProject)"
-      Targets="Build" />
+  <!-- Ensure all projects in this stage have built. -->
+  <Target Name="EnsureProjectsBuilt">
+    <MSBuild Projects="@(StageProject)" Targets="Build" />
+  </Target>
 
-    <!--
-      Run Arcade's signing project directly. The 'eng/Signing.props' extensibility props file checks
-      if '$(<StageName>)' == 'true' and points Arcade to the correct files.
-    -->
+  <!--
+    Run Arcade's signing project directly. The 'eng/Signing.props' extensibility props file checks
+    if '$(<StageName>)' == 'true' and points Arcade to the correct files.
+  -->
+  <Target Name="RunArcadeSigning">
     <MSBuild
       Projects="$(ArcadeSdkSignProject)"
       Targets="Sign"
         ArtifactsPackagesDir=$(ArtifactsPackagesDir)" />
   </Target>
 
+  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory).., Directory.Build.targets))\Directory.Build.targets" />
+
+  <!-- If signing is enabled, wait until all projects in this stage are done and sign them. -->
+  <Target Name="Build"
+          Condition="
+            '$(SkipSigning)' != 'true' and
+            '$(OSGroup)' == 'Windows_NT'"
+          DependsOnTargets="
+            EnsureProjectsBuilt;
+            RunArcadeSigning" />
+
 </Project>
index 35e3d84..28eb9f2 100644 (file)
@@ -1,2 +1,11 @@
 <Project Sdk="Microsoft.NET.Sdk">
+
+  <!-- Before signing the bundles, the engines need to be injected back into the bundles. -->
+  <Target Name="ReattachAllEnginesToBundles"
+          BeforeTargets="RunArcadeSigning">
+    <MSBuild
+      Projects="@(ProjectToBuild -> WithMetadataValue('SignPhase', 'Bundle'))"
+      Targets="ReattachEngineToBundle" />
+  </Target>
+
 </Project>
index 35e3d84..382eb20 100644 (file)
@@ -1,2 +1,13 @@
 <Project Sdk="Microsoft.NET.Sdk">
+
+  <ItemGroup>
+    <StageProject Include="@(ProjectToBuild -> WithMetadataValue('SignPhase', 'BundleInstallerFiles'))" />
+  </ItemGroup>
+
+  <!-- To sign the burn engines, they need to be extracted from the bundles using WiX tools. -->
+  <Target Name="ExtractAllEngineBundles"
+          BeforeTargets="RunArcadeSigning">
+    <MSBuild Projects="@(StageProject)" Targets="ExtractEngineBundle" />
+  </Target>
+
 </Project>
index dc4a1eb..7fd756d 100644 (file)
@@ -4,4 +4,16 @@
     <StageProject Include="@(ProjectToBuild -> WithMetadataValue('SignPhase', 'MsiFiles'))" />
   </ItemGroup>
 
+  <!--
+    Add shared framework projects to the list to ensure is built. Done in a target because the sfx
+    projects are not available statically.
+  -->
+  <Target Name="EnsureSharedFrameworkProjectsBuilt"
+          DependsOnTargets="GetSharedFrameworkProjects"
+          BeforeTargets="EnsureProjectsBuilt">
+    <ItemGroup>
+      <StageProject Include="@(SharedFrameworkProjects)" />
+    </ItemGroup>
+  </Target>
+
 </Project>
diff --git a/tools-local/tasks/ExecWithRetries.cs b/tools-local/tasks/ExecWithRetries.cs
new file mode 100644 (file)
index 0000000..5e57c39
--- /dev/null
@@ -0,0 +1,116 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Initially copied from https://github.com/dotnet/buildtools/blob/6736870b84e06b75e7df32bb84d442db1b2afa10/src/Microsoft.DotNet.Build.Tasks/ExecWithRetries.cs
+
+using Microsoft.Build.Framework;
+using Microsoft.Build.Tasks;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Microsoft.DotNet.Build.Tasks
+{
+    /// <summary>
+    /// Run a command and retry if the exit code is not 0.
+    /// </summary>
+    public class ExecWithRetries : BuildTask
+    {
+        [Required]
+        public string Command { get; set; }
+
+        public string WorkingDirectory { get; set; }
+
+        public bool IgnoreStandardErrorWarningFormat { get; set; }
+
+        public int MaxAttempts { get; set; } = 5;
+
+        /// <summary>
+        /// Base, in seconds, raised to the power of the number of retries so far.
+        /// </summary>
+        public double RetryDelayBase { get; set; } = 6;
+
+        /// <summary>
+        /// A constant, in seconds, added to (base^retries) to find the delay before retrying.
+        /// 
+        /// The default is -1 to make the first retry instant, because ((base^0)-1) == 0.
+        /// </summary>
+        public double RetryDelayConstant { get; set; } = -1;
+
+        /// <summary>
+        /// MSBuild message importance to use when logging stdout messages from the command. Default
+        /// is "High".
+        /// </summary>
+        public string StandardOutputImportance { get; set; }
+
+        /// <summary>
+        /// MSBuild message importance to use when logging stderr messages from the command. Default
+        /// is "High".
+        /// </summary>
+        public string StandardErrorImportance { get; set; }
+
+        private CancellationTokenSource _cancelTokenSource = new CancellationTokenSource();
+
+        private Exec _runningExec;
+
+        public void Cancel()
+        {
+            _runningExec?.Cancel();
+            _cancelTokenSource.Cancel();
+        }
+
+        public override bool Execute()
+        {
+            for (int i = 0; i < MaxAttempts; i++)
+            {
+                _runningExec = new Exec
+                {
+                    BuildEngine = BuildEngine,
+                    Command = Command,
+                    WorkingDirectory = WorkingDirectory,
+                    IgnoreStandardErrorWarningFormat = IgnoreStandardErrorWarningFormat,
+                    StandardOutputImportance = StandardOutputImportance,
+                    StandardErrorImportance = StandardErrorImportance,
+                    LogStandardErrorAsError = false,
+                    IgnoreExitCode = true
+                };
+
+                if (!_runningExec.Execute())
+                {
+                    Log.LogError("Child Exec task failed to execute.");
+                    break;
+                }
+
+                int exitCode = _runningExec.ExitCode;
+                if (exitCode == 0)
+                {
+                    return true;
+                }
+
+                string message = $"Exec FAILED: exit code {exitCode} (attempt {i + 1}/{MaxAttempts})";
+
+                if (i + 1 == MaxAttempts || _cancelTokenSource.IsCancellationRequested)
+                {
+                    Log.LogError(message);
+                    break;
+                }
+
+                TimeSpan delay = TimeSpan.FromSeconds(
+                    Math.Pow(RetryDelayBase, i) + RetryDelayConstant);
+
+                Log.LogMessage(MessageImportance.High, $"{message} -- Retrying after {delay}...");
+
+                try
+                {
+                    Task.Delay(delay, _cancelTokenSource.Token).Wait();
+                }
+                catch (AggregateException e) when (e.InnerException is TaskCanceledException)
+                {
+                    break;
+                }
+            }
+            return false;
+        }
+    }
+}
index e62dbb5..3570674 100644 (file)
@@ -33,6 +33,7 @@
     <Compile Include="net46/ProcessSharedFrameworkDeps.net46.cs" />
 
     <Reference Include="Microsoft.Build.Framework" />
+    <Reference Include="Microsoft.Build.Tasks.v4.0" />
     <Reference Include="Microsoft.Build.Utilities.v4.0" />
     <Reference Include="Microsoft.Build" />
     <Reference Include="System.IO.Compression.FileSystem" />