From bbf6449da7dd477999b877402fea546eb0801911 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Fri, 8 Oct 2021 10:59:34 -0400 Subject: Fix assembly harvesting for NetFx 1.x assemblies. Don't harvest MSIL `processorArchitecture` for 1.x assemblies. This matches WiX v3 behavior. --- .../Bind/AssemblyNameReader.cs | 14 +++++- .../WixToolsetTest.CoreIntegration/MsiFixture.cs | 55 +++++++++++++++++++++ .../TestData/Assembly1x/Package.en-us.wxl | 11 +++++ .../TestData/Assembly1x/Package.wxs | 17 +++++++ .../TestData/Assembly1x/PackageComponents.wxs | 10 ++++ .../TestData/Assembly1x/data/candle.exe | Bin 0 -> 28672 bytes 6 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.en-us.wxl create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/PackageComponents.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/AssemblyNameReader.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/AssemblyNameReader.cs index 2103cd32..5dcfa1e6 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/AssemblyNameReader.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/AssemblyNameReader.cs @@ -37,8 +37,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind // to be equal to or longer than the "fileVersion" in length when its present; // the workaround is to prepend zeroes to the last version number in the assembly // version. - var targetNetfx1 = (headers.CorHeader.MajorRuntimeVersion == 2) && (headers.CorHeader.MinorRuntimeVersion == 0); - if (targetNetfx1 && !String.IsNullOrEmpty(fileVersion) && fileVersion.Length > version.Length) + if (IsNetFx1xAssembly(headers) && !String.IsNullOrEmpty(fileVersion) && fileVersion.Length > version.Length) { var versionParts = version.Split('.'); @@ -154,6 +153,12 @@ namespace WixToolset.Core.WindowsInstaller.Bind { return "x86"; } + else if (IsNetFx1xAssembly(headers)) + { + // .NET Framework 1.x didn't support 64-bit, so if the assembly isn't explicitly 32-bit-required, + // the architecture wasn't specified, unlike .NET 2.0 and later, which identify it as MSIL. + return null; + } else if ((headers.CorHeader.Flags & CorFlags.ILOnly) == CorFlags.ILOnly) { return "MSIL"; @@ -166,6 +171,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind } } + private static bool IsNetFx1xAssembly(PEHeaders headers) + { + return headers.CorHeader.MajorRuntimeVersion == 2 && headers.CorHeader.MinorRuntimeVersion == 0; + } + private static string ReadString(MetadataReader reader, StringHandle handle) { return handle.IsNil ? null : reader.GetString(handle); diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/MsiFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/MsiFixture.cs index 3bdfa0ef..ff241b50 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/MsiFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/MsiFixture.cs @@ -595,6 +595,61 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanBuildWithNet1xAssembly() + { + var folder = TestData.Get(@"TestData\Assembly1x"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "Package.wxs"), + Path.Combine(folder, "PackageComponents.wxs"), + "-loc", Path.Combine(folder, "Package.en-us.wxl"), + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, @"bin\test.msi") + }); + + result.AssertSuccess(); + + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.msi"))); + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\test.wixpdb"))); + Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\PFiles\AssemblyMsiPackage\candle.exe"))); + + var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + var section = intermediate.Sections.Single(); + + var fileSymbol = section.Symbols.OfType().Single(); + Assert.Equal(Path.Combine(folder, @"data\candle.exe"), fileSymbol[FileSymbolFields.Source].AsPath().Path); + Assert.Equal(@"candle.exe", fileSymbol[FileSymbolFields.Source].PreviousValue.AsPath().Path); + + var msiAssemblyNameSymbols = section.Symbols.OfType(); + Assert.Equal(new[] + { + "culture", + "fileVersion", + "name", + "publicKeyToken", + "version" + }, msiAssemblyNameSymbols.OrderBy(a => a.Name).Select(a => a.Name).ToArray()); + + Assert.Equal(new[] + { + "neutral", + "2.0.5805.0", + "candle", + "CE35F76FCDA82BAD", + "2.0.5805.0", + }, msiAssemblyNameSymbols.OrderBy(a => a.Name).Select(a => a.Value).ToArray()); + } + } + [Fact] public void CanBuild64bit() { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.en-us.wxl b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.en-us.wxl new file mode 100644 index 00000000..38c12ac1 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.en-us.wxl @@ -0,0 +1,11 @@ + + + + + + A newer version of [ProductName] is already installed. + MsiPackage + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.wxs new file mode 100644 index 00000000..c345305d --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/Package.wxs @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/PackageComponents.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/PackageComponents.wxs new file mode 100644 index 00000000..e0c84c63 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/PackageComponents.wxs @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe new file mode 100644 index 00000000..7a16cbab Binary files /dev/null and b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Assembly1x/data/candle.exe differ -- cgit v1.2.3-55-g6feb