@joebigelow / wix / commits / bbf6449d

Fix assembly harvesting for NetFx 1.x assemblies.

Don't harvest MSIL `processorArchitecture` for 1.x assemblies. This matches WiX v3 behavior.

Bob Arnson committed Oct 8, 2021 at 10:59 UTC bbf6449da7dd477999b877402fea546eb0801911
6 files changed +105 -2
src/wix/WixToolset.Core.WindowsInstaller/Bind/AssemblyNameReader.cs
+12 -2
@@ -37,8 +37,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
37 // to be equal to or longer than the "fileVersion" in length when its present;
38 // the workaround is to prepend zeroes to the last version number in the assembly
39 // version.
40 - var targetNetfx1 = (headers.CorHeader.MajorRuntimeVersion == 2) && (headers.CorHeader.MinorRuntimeVersion == 0);
41 - if (targetNetfx1 && !String.IsNullOrEmpty(fileVersion) && fileVersion.Length > version.Length)
40 + if (IsNetFx1xAssembly(headers) && !String.IsNullOrEmpty(fileVersion) && fileVersion.Length > version.Length)
41 {
42 var versionParts = version.Split('.');
43
@@ -154,6 +153,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind
153 {
154 return "x86";
155 }
156 + else if (IsNetFx1xAssembly(headers))
157 + {
158 + // .NET Framework 1.x didn't support 64-bit, so if the assembly isn't explicitly 32-bit-required,
159 + // the architecture wasn't specified, unlike .NET 2.0 and later, which identify it as MSIL.
160 + return null;
161 + }
162 else if ((headers.CorHeader.Flags & CorFlags.ILOnly) == CorFlags.ILOnly)
163 {
164 return "MSIL";
@@ -166,6 +171,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
171 }
172 }
173
174 + private static bool IsNetFx1xAssembly(PEHeaders headers)
175 + {
176 + return headers.CorHeader.MajorRuntimeVersion == 2 && headers.CorHeader.MinorRuntimeVersion == 0;
177 + }
178 +
179 private static string ReadString(MetadataReader reader, StringHandle handle)
180 {
181 return handle.IsNil ? null : reader.GetString(handle);
src/wix/test/WixToolsetTest.CoreIntegration/MsiFixture.cs
+55
@@ -595,6 +595,61 @@ namespace WixToolsetTest.CoreIntegration
595 }
596 }
597
598 + [Fact]
599 + public void CanBuildWithNet1xAssembly()
600 + {
601 + var folder = TestData.Get(@"TestData\Assembly1x");
602 +
603 + using (var fs = new DisposableFileSystem())
604 + {
605 + var baseFolder = fs.GetFolder();
606 + var intermediateFolder = Path.Combine(baseFolder, "obj");
607 +
608 + var result = WixRunner.Execute(new[]
609 + {
610 + "build",
611 + Path.Combine(folder, "Package.wxs"),
612 + Path.Combine(folder, "PackageComponents.wxs"),
613 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
614 + "-bindpath", Path.Combine(folder, "data"),
615 + "-intermediateFolder", intermediateFolder,
616 + "-o", Path.Combine(baseFolder, @"bin\test.msi")
617 + });
618 +
619 + result.AssertSuccess();
620 +
621 + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi")));
622 + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb")));
623 + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\AssemblyMsiPackage\candle.exe")));
624 +
625 + var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
626 + var section = intermediate.Sections.Single();
627 +
628 + var fileSymbol = section.Symbols.OfType<FileSymbol>().Single();
629 + Assert.Equal(Path.Combine(folder, @"data\candle.exe"), fileSymbol[FileSymbolFields.Source].AsPath().Path);
630 + Assert.Equal(@"candle.exe", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path);
631 +
632 + var msiAssemblyNameSymbols = section.Symbols.OfType<MsiAssemblyNameSymbol>();
633 + Assert.Equal(new[]
634 + {
635 + "culture",
636 + "fileVersion",
637 + "name",
638 + "publicKeyToken",
639 + "version"
640 + }, msiAssemblyNameSymbols.OrderBy(a => a.Name).Select(a => a.Name).ToArray());
641 +
642 + Assert.Equal(new[]
643 + {
644 + "neutral",
645 + "2.0.5805.0",
646 + "candle",
647 + "CE35F76FCDA82BAD",
648 + "2.0.5805.0",
649 + }, msiAssemblyNameSymbols.OrderBy(a => a.Name).Select(a => a.Value).ToArray());
650 + }
651 + }
652 +
653 [Fact]
654 public void CanBuild64bit()
655 {
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.en-us.wxl new
+11
@@ -0,0 +1,11 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +
3 +<!--
4 +This file contains the declaration of all the localizable strings.
5 +-->
6 +<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7 +
8 + <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
9 + <String Id="FeatureTitle">MsiPackage</String>
10 +
11 +</WixLocalization>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.wxs new
+17
@@ -0,0 +1,17 @@
1 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 + <Package Name="AssemblyMsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine">
3 +
4 +
5 + <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
6 +
7 + <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
8 + <ComponentGroupRef Id="ProductComponents" />
9 + </Feature>
10 + </Package>
11 +
12 + <Fragment>
13 + <StandardDirectory Id="ProgramFilesFolder">
14 + <Directory Id="INSTALLFOLDER" Name="AssemblyMsiPackage" />
15 + </StandardDirectory>
16 + </Fragment>
17 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/PackageComponents.wxs new
+10
@@ -0,0 +1,10 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 + <Fragment>
4 + <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
5 + <Component>
6 + <File Source="candle.exe" Assembly=".net" />
7 + </Component>
8 + </ComponentGroup>
9 + </Fragment>
10 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe
Binary files /dev/null and b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe differ