From f98a0e10c320784634a3c27e37932da5b0784828 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 12 Feb 2025 01:59:42 -0800 Subject: Backward compatible GUID generation Plus, validation to ensure GUID generation does not drift again in the future. Fixes 8663 --- .../WixToolset.Extensibility/Data/IBindContext.cs | 5 + .../Bind/BindDatabaseCommand.cs | 5 +- .../Bind/FinalizeComponentGuids.cs | 9 +- src/wix/WixToolset.Core/BindContext.cs | 2 + .../WixToolset.Core/CommandLine/BuildCommand.cs | 12 +- .../GuidCompatibilityFixture.cs | 238 +++++++++++++++++++++ .../TestData/GuidCompatibility/Components.wxs | 29 +++ .../TestData/GuidCompatibility/Package.wxs | 14 ++ .../TestData/GuidCompatibility/Wix3Components.wxs | 29 +++ .../TestData/GuidCompatibility/Wix3Product.wxs | 19 ++ 10 files changed, 357 insertions(+), 5 deletions(-) create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/GuidCompatibilityFixture.cs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Components.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Package.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Components.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Product.wxs diff --git a/src/api/wix/WixToolset.Extensibility/Data/IBindContext.cs b/src/api/wix/WixToolset.Extensibility/Data/IBindContext.cs index 25a255c3..4c1b4d59 100644 --- a/src/api/wix/WixToolset.Extensibility/Data/IBindContext.cs +++ b/src/api/wix/WixToolset.Extensibility/Data/IBindContext.cs @@ -17,6 +17,11 @@ namespace WixToolset.Extensibility.Data /// IServiceProvider ServiceProvider { get; } + /// + /// Indicates whether to generate GUIDs backward compatible with WiX v3. + /// + bool BackwardCompatibleGuidGeneration { get; set; } + /// /// Bind paths used during resolution. /// diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs index bf073703..5c05bdea 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs @@ -32,6 +32,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind this.FileSystem = context.ServiceProvider.GetService(); this.PathResolver = context.ServiceProvider.GetService(); + this.BackwardCompatibleGuidGeneration = context.BackwardCompatibleGuidGeneration; this.CabbingThreadCount = context.CabbingThreadCount; this.CabCachePath = context.CabCachePath; this.DefaultCompressionLevel = context.DefaultCompressionLevel; @@ -65,6 +66,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind private IPathResolver PathResolver { get; } + private bool BackwardCompatibleGuidGeneration { get; } + private int CabbingThreadCount { get; } private string CabCachePath { get; } @@ -410,7 +413,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind // Set generated component guids and validate all guids. { - var command = new FinalizeComponentGuids(this.Messaging, this.WindowsInstallerBackendHelper, this.PathResolver, section, platform); + var command = new FinalizeComponentGuids(this.Messaging, this.WindowsInstallerBackendHelper, this.PathResolver, section, platform, this.BackwardCompatibleGuidGeneration); command.Execute(); } diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/FinalizeComponentGuids.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/FinalizeComponentGuids.cs index 3cdc0c28..fe6e322c 100644 --- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/FinalizeComponentGuids.cs +++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/FinalizeComponentGuids.cs @@ -16,13 +16,14 @@ namespace WixToolset.Core.WindowsInstaller.Bind /// internal class FinalizeComponentGuids { - internal FinalizeComponentGuids(IMessaging messaging, IBackendHelper helper, IPathResolver pathResolver, IntermediateSection section, Platform platform) + internal FinalizeComponentGuids(IMessaging messaging, IBackendHelper helper, IPathResolver pathResolver, IntermediateSection section, Platform platform, bool backwardCompatibleGuidGeneration) { this.Messaging = messaging; this.BackendHelper = helper; this.PathResolver = pathResolver; this.Section = section; this.Platform = platform; + this.BackwardCompatibleGuidGeneration = backwardCompatibleGuidGeneration; } private IMessaging Messaging { get; } @@ -35,6 +36,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind private Platform Platform { get; } + private bool BackwardCompatibleGuidGeneration { get; } + private Dictionary ComponentIdGenSeeds { get; set; } private ILookup FilesByComponentId { get; set; } @@ -98,7 +101,9 @@ namespace WixToolset.Core.WindowsInstaller.Bind if (this.RegistrySymbolsById.TryGetValue(componentSymbol.KeyPath, out var registrySymbol)) { var bitness = componentSymbol.Win64 ? "64" : String.Empty; - var regkey = String.Concat(bitness, registrySymbol.Root, "\\", registrySymbol.Key, "\\", registrySymbol.Name); + var regkey = this.BackwardCompatibleGuidGeneration ? + String.Concat(bitness, (int)registrySymbol.Root, "\\", registrySymbol.Key, "\\", registrySymbol.Name) : + String.Concat(bitness, registrySymbol.Root, "\\", registrySymbol.Key, "\\", registrySymbol.Name); componentSymbol.ComponentId = this.BackendHelper.CreateGuid(BindDatabaseCommand.WixComponentGuidNamespace, regkey.ToLowerInvariant()); } } diff --git a/src/wix/WixToolset.Core/BindContext.cs b/src/wix/WixToolset.Core/BindContext.cs index 50ccdec6..26591f7f 100644 --- a/src/wix/WixToolset.Core/BindContext.cs +++ b/src/wix/WixToolset.Core/BindContext.cs @@ -22,6 +22,8 @@ namespace WixToolset.Core public string BurnStubPath { get; set; } + public bool BackwardCompatibleGuidGeneration { get; set; } + public int CabbingThreadCount { get; set; } public string CabCachePath { get; set; } diff --git a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs index 0db39480..73a1dd33 100644 --- a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs +++ b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs @@ -47,6 +47,7 @@ namespace WixToolset.Core.CommandLine return new CommandLineHelp("", "build [options] sourcefile [sourcefile ...] -out output.ext", new[] { new CommandLineHelpSwitch("-arch", "Set the architecture of the output."), + new CommandLineHelpSwitch("-bcgg", "Backward compatible GUID generation with WiX v3."), new CommandLineHelpSwitch("-bindfiles", "-bf", "Bind files into an output .wixlib. Ignored if not building a .wixlib."), new CommandLineHelpSwitch("-bindpath", "-b", "Bind path to search for content files."), new CommandLineHelpSwitch("-bindpath:target", "-bt", "Bind path to search for target package's content files. Only used when building a patch."), @@ -147,7 +148,7 @@ namespace WixToolset.Core.CommandLine { using (new IntermediateFieldContext("wix.bind")) { - this.BindPhase(wixipl, wxls, filterCultures, this.commandLine.CabCachePath, this.commandLine.CabbingThreadCount, this.commandLine.BindPaths, this.commandLine.BindVariables, inputsOutputs, cancellationToken); + this.BindPhase(wixipl, wxls, filterCultures, this.commandLine.BackwardCompatibleGuidGeneration, this.commandLine.CabCachePath, this.commandLine.CabbingThreadCount, this.commandLine.BindPaths, this.commandLine.BindVariables, inputsOutputs, cancellationToken); } } } @@ -284,7 +285,7 @@ namespace WixToolset.Core.CommandLine return linker.Link(context); } - private void BindPhase(Intermediate output, IReadOnlyCollection localizations, IReadOnlyCollection filterCultures, string cabCachePath, int cabbingThreadCount, IReadOnlyCollection bindPaths, Dictionary bindVariables, InputsAndOutputs inputsOutputs, CancellationToken cancellationToken) + private void BindPhase(Intermediate output, IReadOnlyCollection localizations, IReadOnlyCollection filterCultures, bool backwardCompatibleGuidGeneration, string cabCachePath, int cabbingThreadCount, IReadOnlyCollection bindPaths, Dictionary bindVariables, InputsAndOutputs inputsOutputs, CancellationToken cancellationToken) { IResolveResult resolveResult; { @@ -314,6 +315,7 @@ namespace WixToolset.Core.CommandLine { { var context = this.ServiceProvider.GetService(); + context.BackwardCompatibleGuidGeneration = backwardCompatibleGuidGeneration; context.BindPaths = bindPaths; context.CabbingThreadCount = cabbingThreadCount; context.CabCachePath = cabCachePath; @@ -489,6 +491,8 @@ namespace WixToolset.Core.CommandLine { private static readonly char[] BindPathSplit = { '=' }; + public bool BackwardCompatibleGuidGeneration { get; private set; } + public bool BindFiles { get; private set; } public List BindPaths { get; } = new List(); @@ -566,6 +570,10 @@ namespace WixToolset.Core.CommandLine return true; } + case "bcgg": + this.BackwardCompatibleGuidGeneration = true; + return true; + case "bf": case "bindfiles": this.BindFiles = true; diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/GuidCompatibilityFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/GuidCompatibilityFixture.cs new file mode 100644 index 00000000..d19a68d0 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/GuidCompatibilityFixture.cs @@ -0,0 +1,238 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolsetTest.CoreIntegration +{ + using System.IO; + using System.Linq; + using WixInternal.Core.TestPackage; + using WixInternal.TestSupport; + using WixToolset.Data; + using WixToolset.Data.Symbols; + using Xunit; + + public class GuidCompatibilityFixture + { + [Fact] + public void VerifyModernX86GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {246B5173-0924-511B-8828-77DD3BE87C7D} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {663BDBDA-FAAF-5B7A-B8BA-D1AB3B5284CD} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {6A5C002D-C0C9-5B03-B883-BE3DF3FA21A6} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {529D5485-ED3E-5D1C-8517-A32103A08F76} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {0C78D91F-7913-5747-918C-322DA2A15823} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + + [Fact] + public void VerifyModernX64GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-arch", "x64", + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {A2D16D0D-8856-5B34-804F-64E0EE691ACD} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {CE5B9399-8F69-50E4-AE76-9F5C3F5A4D72} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {45973AE0-BFEF-5A88-AC82-416C9699ED23} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {841288A2-7520-5CA5-8CA0-4B4711D3F669} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {0AC9C5B2-E60A-5CD9-9A4E-B5DEABAD1D14} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + + [Fact] + public void VerifyModernArm64GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-arch", "arm64", + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {A2D16D0D-8856-5B34-804F-64E0EE691ACD} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {CE5B9399-8F69-50E4-AE76-9F5C3F5A4D72} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {45973AE0-BFEF-5A88-AC82-416C9699ED23} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {841288A2-7520-5CA5-8CA0-4B4711D3F669} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {0AC9C5B2-E60A-5CD9-9A4E-B5DEABAD1D14} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + + [Fact] + public void VerifyWix3X86GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-bcgg", + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {656550C1-E3C3-5943-900A-A286A24F1F7C} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {5C7CBEDE-4C14-58AF-8365-59C602A20543} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {186E35F4-96E9-5DE4-8F7B-73EA096A8543} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {C1707072-2C2C-5249-85E1-37418A31DF2D} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {76A0D3F4-7BD5-51DE-8FDA-6C30674083CB} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + + [Fact] + public void VerifyWix3X64GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-bcgg", + "-arch", "x64", + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {E420B3FC-4889-5D2B-8E2D-DC8D05B62B5B} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {12D81E73-4429-5D97-8318-7E719F660847} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {2E7AA7BE-006C-5FFE-A73F-1C65142AB3D7} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {C7972BDE-CA76-564D-A9BA-FD3A0B930DCF} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {AB4A2008-03FC-513E-8B92-35CE837C212E} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + + [Fact] + public void VerifyWix3Arm64GuidCompatibility() + { + var folder = TestData.Get("TestData", "GuidCompatibility"); + + 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, "Components.wxs"), + "-bcgg", + "-arch", "x64", + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, "bin", "test.msi") + }); + + result.AssertSuccess(); + + var wixpdb = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb")); + var section = wixpdb.Sections.Single(); + + var symbols = section.Symbols.OfType().ToArray(); + WixAssert.CompareLineByLine(new[] + { + "FileFoo {AD87A3DE-042B-5CB1-82C8-782626737A3B} File:filrCrmOAxegUXdKLQjj8mKJFZC2AY", + "RegHkcr {E420B3FC-4889-5D2B-8E2D-DC8D05B62B5B} Registry:regYqKbt2o5W7y7CIBKba5Du9MJ2xU", + "RegHkcu {12D81E73-4429-5D97-8318-7E719F660847} Registry:regCDVjmO6qHBvQzdqM8XyBiEUuf48", + "RegHklm {2E7AA7BE-006C-5FFE-A73F-1C65142AB3D7} Registry:regPKV64nTdbwlRm8bkU8k4Kxj6Km8", + "RegHkmu {C7972BDE-CA76-564D-A9BA-FD3A0B930DCF} Registry:regOPf4kOF1RLKsRy9oG4MP1Rqm8JY", + "RegHku {AB4A2008-03FC-513E-8B92-35CE837C212E} Registry:regJHg773M8wPDSk6j7CYRThPX7uOw" + }, symbols.Select(s => $"{s.Id.Id} {s.ComponentId} {s.KeyPathType}:{s.KeyPath}").OrderBy(s => s).ToArray()); + } + } +} diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Components.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Components.wxs new file mode 100644 index 00000000..efd3fbd3 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Components.wxs @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Package.wxs new file mode 100644 index 00000000..d12aef4f --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Package.wxs @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Components.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Components.wxs new file mode 100644 index 00000000..2c8de001 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Components.wxs @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Product.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Product.wxs new file mode 100644 index 00000000..e470d68b --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/GuidCompatibility/Wix3Product.wxs @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb