From 5d08e0a4bbf4e4ba28300b8bace1089b64b198d7 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 30 Mar 2022 10:35:02 -0700 Subject: Implement IWindowsInstallerDecompileExtensions Update Util extension to validate extension model and fix some small issues in MSI decompiling. Fixes 6367 --- src/internal/WixBuildTools.TestSupport/Builder.cs | 88 +++++++++++++++++++++++ 1 file changed, 88 insertions(+) (limited to 'src/internal/WixBuildTools.TestSupport') diff --git a/src/internal/WixBuildTools.TestSupport/Builder.cs b/src/internal/WixBuildTools.TestSupport/Builder.cs index ef0de8c9..31df0084 100644 --- a/src/internal/WixBuildTools.TestSupport/Builder.cs +++ b/src/internal/WixBuildTools.TestSupport/Builder.cs @@ -66,5 +66,93 @@ namespace WixBuildTools.TestSupport return Query.QueryDatabase(outputPath, tables); } } + + public void BuildAndDecompileAndBuild(Action buildFunc, Action decompileFunc, string decompilePath) + { + var sourceFiles = Directory.GetFiles(this.SourceFolder, "*.wxs"); + var wxlFiles = Directory.GetFiles(this.SourceFolder, "*.wxl"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + var outputFolder = Path.Combine(intermediateFolder, "bin"); + var decompileExtractFolder = Path.Combine(intermediateFolder, "decompiled", "extract"); + var decompileIntermediateFolder = Path.Combine(intermediateFolder, "decompiled", "obj"); + var decompileBuildFolder = Path.Combine(intermediateFolder, "decompiled", "bin"); + var outputPath = Path.Combine(outputFolder, this.OutputFile); + var decompileBuildPath = Path.Combine(decompileBuildFolder, this.OutputFile); + + // First build. + var firstBuildArgs = new List + { + "build", + "-o", outputPath, + "-intermediateFolder", intermediateFolder, + }; + + if (this.ExtensionType != null) + { + firstBuildArgs.Add("-ext"); + firstBuildArgs.Add(Path.GetFullPath(new Uri(this.ExtensionType.Assembly.CodeBase).LocalPath)); + } + + firstBuildArgs.AddRange(sourceFiles); + + foreach (var wxlFile in wxlFiles) + { + firstBuildArgs.Add("-loc"); + firstBuildArgs.Add(wxlFile); + } + + foreach (var bindPath in this.BindPaths) + { + firstBuildArgs.Add("-bindpath"); + firstBuildArgs.Add(bindPath); + } + + buildFunc(firstBuildArgs.ToArray()); + + // Decompile built output. + var decompileArgs = new List + { + "msi", "decompile", + outputPath, + "-intermediateFolder", decompileIntermediateFolder, + "-x", decompileExtractFolder, + "-o", decompilePath + }; + + if (this.ExtensionType != null) + { + decompileArgs.Add("-ext"); + decompileArgs.Add(Path.GetFullPath(new Uri(this.ExtensionType.Assembly.CodeBase).LocalPath)); + } + + decompileFunc(decompileArgs.ToArray()); + + // Build decompiled output. + var secondBuildArgs = new List + { + "build", + decompilePath, + "-o", decompileBuildPath, + "-intermediateFolder", decompileIntermediateFolder + }; + + if (this.ExtensionType != null) + { + secondBuildArgs.Add("-ext"); + secondBuildArgs.Add(Path.GetFullPath(new Uri(this.ExtensionType.Assembly.CodeBase).LocalPath)); + } + + secondBuildArgs.Add("-bindpath"); + secondBuildArgs.Add(outputFolder); + + secondBuildArgs.Add("-bindpath"); + secondBuildArgs.Add(decompileExtractFolder); + + buildFunc(secondBuildArgs.ToArray()); + } + } } } -- cgit v1.2.3-55-g6feb