private void Run(IMessaging messaging) { #if false // Initialize the variable resolver from the command line. WixVariableResolver wixVariableResolver = new WixVariableResolver(); foreach (var wixVar in this.commandLine.Variables) { wixVariableResolver.AddVariable(wixVar.Key, wixVar.Value); } // Initialize the linker from the command line. Linker linker = new Linker(); linker.UnreferencedSymbolsFile = this.commandLine.UnreferencedSymbolsFile; linker.ShowPedanticMessages = this.commandLine.ShowPedanticMessages; linker.WixVariableResolver = wixVariableResolver; foreach (IExtensionData data in this.extensionData) { linker.AddExtensionData(data); } // Initialize the binder from the command line. WixToolset.Binder binder = new WixToolset.Binder(); binder.CabCachePath = this.commandLine.CabCachePath; binder.ContentsFile = this.commandLine.ContentsFile; binder.BuiltOutputsFile = this.commandLine.BuiltOutputsFile; binder.OutputsFile = this.commandLine.OutputsFile; binder.WixprojectFile = this.commandLine.WixprojectFile; binder.BindPaths.AddRange(this.commandLine.BindPaths); binder.CabbingThreadCount = this.commandLine.CabbingThreadCount; if (this.commandLine.DefaultCompressionLevel.HasValue) { binder.DefaultCompressionLevel = this.commandLine.DefaultCompressionLevel.Value; } binder.Ices.AddRange(this.commandLine.Ices); binder.SuppressIces.AddRange(this.commandLine.SuppressIces); binder.SuppressAclReset = this.commandLine.SuppressAclReset; binder.SuppressLayout = this.commandLine.SuppressLayout; binder.SuppressValidation = this.commandLine.SuppressValidation; binder.PdbFile = this.commandLine.SuppressWixPdb ? null : this.commandLine.PdbFile; binder.TempFilesLocation = AppCommon.GetTempLocation(); binder.WixVariableResolver = wixVariableResolver; foreach (IBinderExtension extension in this.binderExtensions) { binder.AddExtension(extension); } foreach (IBinderFileManager fileManager in this.fileManagers) { binder.AddExtension(fileManager); } // Initialize the localizer. Localizer localizer = this.InitializeLocalization(linker.TableDefinitions); if (messaging.EncounteredError) { return; } wixVariableResolver.Localizer = localizer; linker.Localizer = localizer; binder.Localizer = localizer; // Loop through all the believed object files. List <Section> sections = new List <Section>(); Output output = null; foreach (string inputFile in this.commandLine.Files) { string inputFileFullPath = Path.GetFullPath(inputFile); FileFormat format = FileStructure.GuessFileFormatFromExtension(Path.GetExtension(inputFileFullPath)); bool retry; do { retry = false; try { switch (format) { case FileFormat.Wixobj: Intermediate intermediate = Intermediate.Load(inputFileFullPath, linker.TableDefinitions, this.commandLine.SuppressVersionCheck); sections.AddRange(intermediate.Sections); break; case FileFormat.Wixlib: Library library = Library.Load(inputFileFullPath, linker.TableDefinitions, this.commandLine.SuppressVersionCheck); AddLibraryLocalizationsToLocalizer(library, this.commandLine.Cultures, localizer); sections.AddRange(library.Sections); break; default: output = Output.Load(inputFileFullPath, this.commandLine.SuppressVersionCheck); break; } } catch (WixUnexpectedFileFormatException e) { format = e.FileFormat; retry = (FileFormat.Wixobj == format || FileFormat.Wixlib == format || FileFormat.Wixout == format); // .wixobj, .wixout and .wixout are supported by light. if (!retry) { messaging.OnMessage(e.Error); } } } while (retry); } // Stop processing if any errors were found loading object files. if (messaging.EncounteredError) { return; } // and now for the fun part if (null == output) { OutputType expectedOutputType = OutputType.Unknown; if (!String.IsNullOrEmpty(this.commandLine.OutputFile)) { expectedOutputType = Output.GetOutputType(Path.GetExtension(this.commandLine.OutputFile)); } output = linker.Link(sections, expectedOutputType); // If an error occurred during linking, stop processing. if (null == output) { return; } } else if (0 != sections.Count) { throw new InvalidOperationException(LightStrings.EXP_CannotLinkObjFilesWithOutpuFile); } bool tidy = true; // clean up after ourselves by default. try { // only output the xml if its a patch build or user specfied to only output wixout string outputFile = this.commandLine.OutputFile; string outputExtension = Path.GetExtension(outputFile); if (this.commandLine.OutputXml || OutputType.Patch == output.Type) { if (String.IsNullOrEmpty(outputExtension) || outputExtension.Equals(".wix", StringComparison.Ordinal)) { outputExtension = (OutputType.Patch == output.Type) ? ".wixmsp" : ".wixout"; outputFile = Path.ChangeExtension(outputFile, outputExtension); } output.Save(outputFile); } else // finish creating the MSI/MSM { if (String.IsNullOrEmpty(outputExtension) || outputExtension.Equals(".wix", StringComparison.Ordinal)) { outputExtension = Output.GetExtension(output.Type); outputFile = Path.ChangeExtension(outputFile, outputExtension); } binder.Bind(output, outputFile); } } catch (WixException we) // keep files around for debugging IDT issues. { if (we is WixInvalidIdtException) { tidy = false; } throw; } catch (Exception) // keep files around for debugging unexpected exceptions. { tidy = false; throw; } finally { if (null != binder) { binder.Cleanup(tidy); } } return; #endif }
/// <summary> /// Main running method for the application. /// </summary> /// <param name="args">Commandline arguments to the application.</param> /// <returns>Returns the application error code.</returns> private int Run(string[] args) { WixToolset.Binder binder = null; Differ differ = null; Unbinder unbinder = null; TempFileCollection tempFileCollection = null; try { // parse the command line this.ParseCommandLine(args); // validate the inputs if (this.xmlInputs && this.adminImage) { Messaging.Instance.OnMessage(WixErrors.IllegalCommandlineArgumentCombination("a", "xi")); this.showHelp = true; } string[] allValidExtensions = new string[] { wixMstExtension, wixOutExtension, wixPdbExtension, msiExtension }; string[] expectedSingleInputExtensions = new string[] { wixMstExtension, wixOutExtension }; string[] expectedDoubleInputXmlExtensions = new string[] { wixOutExtension, wixPdbExtension }; string[] expectedDoubleInputMsiExtensions = new string[] { msiExtension }; // Validate that all inputs have the correct extension and we dont have too many inputs. if (1 == this.inputFiles.Count) { string inputFile = this.inputFiles[0]; bool hasValidExtension = false; foreach (string extension in expectedSingleInputExtensions) { if (String.Equals(Path.GetExtension(inputFile), extension, StringComparison.OrdinalIgnoreCase)) { hasValidExtension = true; break; } } if (!hasValidExtension) { bool missingInput = false; // Check if its using an extension that could be valid in other scenarios. foreach (string validExtension in allValidExtensions) { if (String.Equals(Path.GetExtension(inputFile), validExtension, StringComparison.OrdinalIgnoreCase)) { Messaging.Instance.OnMessage(WixErrors.WrongFileExtensionForNumberOfInputs(Path.GetExtension(inputFile), inputFile)); missingInput = true; break; } } if (!missingInput) { Messaging.Instance.OnMessage(WixErrors.UnexpectedFileExtension(inputFile, String.Join(", ", expectedSingleInputExtensions))); } } } else if (2 == this.inputFiles.Count) { foreach (string inputFile in inputFiles) { bool hasValidExtension = false; string[] expectedExtensions = allValidExtensions; if (this.xmlInputs) { foreach (string extension in expectedDoubleInputXmlExtensions) { if (String.Equals(Path.GetExtension(inputFile), extension, StringComparison.OrdinalIgnoreCase)) { hasValidExtension = true; expectedExtensions = expectedDoubleInputXmlExtensions; break; } } } else { foreach (string extension in expectedDoubleInputMsiExtensions) { if (String.Equals(Path.GetExtension(inputFile), extension, StringComparison.OrdinalIgnoreCase)) { hasValidExtension = true; expectedExtensions = expectedDoubleInputMsiExtensions; break; } } } if (!hasValidExtension) { Messaging.Instance.OnMessage(WixErrors.UnexpectedFileExtension(inputFile, String.Join(", ", expectedExtensions))); } } } else { this.showHelp = true; } // exit if there was an error parsing the command line or with a file extension (otherwise the logo appears after error messages) if (Messaging.Instance.EncounteredError) { return(Messaging.Instance.LastErrorNumber); } if (null == this.outputFile) { this.showHelp = true; } if (this.showLogo) { AppCommon.DisplayToolHeader(); } if (this.showHelp) { Console.WriteLine(TorchStrings.HelpMessage); AppCommon.DisplayToolFooter(); return(Messaging.Instance.LastErrorNumber); } foreach (string parameter in this.invalidArgs) { Messaging.Instance.OnMessage(WixWarnings.UnsupportedCommandLineArgument(parameter)); } this.invalidArgs = null; binder = new WixToolset.Binder(); differ = new Differ(); unbinder = new Unbinder(); // load all extensions ExtensionManager extensionManager = new ExtensionManager(); foreach (string extension in this.extensionList) { extensionManager.Load(extension); } foreach (IUnbinderExtension extension in extensionManager.Create <IUnbinderExtension>()) { unbinder.AddExtension(extension); } foreach (IBinderExtension extension in extensionManager.Create <IBinderExtension>()) { binder.AddExtension(extension); } foreach (IInspectorExtension extension in extensionManager.Create <IInspectorExtension>()) { differ.AddExtension(extension); } binder.TempFilesLocation = AppCommon.GetTempLocation(); unbinder.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); tempFileCollection = new TempFileCollection(Environment.GetEnvironmentVariable("WIX_TEMP")); binder.WixVariableResolver = new WixVariableResolver(); differ.PreserveUnchangedRows = this.preserveUnchangedRows; differ.ShowPedanticMessages = this.showPedanticMessages; unbinder.SuppressExtractCabinets = true; unbinder.IsAdminImage = this.adminImage; if (null == this.exportBasePath) { this.exportBasePath = tempFileCollection.BasePath; } // load and process the inputs Output transform; if (1 == this.inputFiles.Count) { transform = Output.Load(this.inputFiles[0], false); if (OutputType.Transform != transform.Type) { Messaging.Instance.OnMessage(WixErrors.InvalidWixTransform(this.inputFiles[0])); return(Messaging.Instance.LastErrorNumber); } } else // 2 inputs { Output targetOutput; Output updatedOutput; if (this.xmlInputs) { // load the target database if (String.Equals(Path.GetExtension(inputFiles[0]), wixPdbExtension, StringComparison.OrdinalIgnoreCase)) { Pdb targetPdb = Pdb.Load(this.inputFiles[0], false); targetOutput = targetPdb.Output; } else { targetOutput = Output.Load(this.inputFiles[0], false); } // load the updated database if (String.Equals(Path.GetExtension(inputFiles[1]), wixPdbExtension, StringComparison.OrdinalIgnoreCase)) { Pdb updatedPdb = Pdb.Load(this.inputFiles[1], false); updatedOutput = updatedPdb.Output; } else { updatedOutput = Output.Load(this.inputFiles[1], false); } this.xmlOutput = true; } else { // load the target database targetOutput = unbinder.Unbind(this.inputFiles[0], OutputType.Product, Path.Combine(this.exportBasePath, "targetBinaries")); // load the updated database updatedOutput = unbinder.Unbind(this.inputFiles[1], OutputType.Product, Path.Combine(this.exportBasePath, "updatedBinaries")); } // diff the target and updated databases transform = differ.Diff(targetOutput, updatedOutput, this.validationFlags); if (null == transform.Tables || 0 >= transform.Tables.Count) { throw new WixException(WixErrors.NoDifferencesInTransform(transform.SourceLineNumbers)); } } // output the transform if (null != transform) { // If either the user selected xml output or gave xml input, save as xml output. // With xml inputs, many funtions of the binder have not been performed on the inputs (ie. file sequencing). This results in bad IDT files which cannot be put in a transform. if (this.xmlOutput) { transform.Save(this.outputFile); } else { binder.Bind(transform, this.outputFile); } } } catch (WixException we) { if (we is WixInvalidIdtException) { // make sure the IDT files stay around this.tidy = false; } Messaging.Instance.OnMessage(we.Error); } catch (Exception e) { // make sure the files stay around for debugging this.tidy = false; Messaging.Instance.OnMessage(WixErrors.UnexpectedException(e.Message, e.GetType().ToString(), e.StackTrace)); if (e is NullReferenceException || e is SEHException) { throw; } } finally { if (null != binder) { binder.Cleanup(tidy); } if (null != unbinder) { if (this.tidy) { if (!unbinder.DeleteTempFiles()) { Console.Error.WriteLine(TorchStrings.WAR_FailedToDeleteTempDir, binder.TempFilesLocation); } } else { Console.WriteLine(TorchStrings.INF_UnbinderTempDirLocatedAt, binder.TempFilesLocation); } } if (null != tempFileCollection) { if (this.tidy) { try { Directory.Delete(tempFileCollection.BasePath, true); } catch (DirectoryNotFoundException) { // if the path doesn't exist, then there is nothing for us to worry about } catch { Console.Error.WriteLine(TorchStrings.WAR_FailedToDeleteTempDir, tempFileCollection.BasePath); } } else { Console.WriteLine(TorchStrings.INF_TorchTempDirLocatedAt, tempFileCollection.BasePath); } } } return(Messaging.Instance.LastErrorNumber); }
/// <summary> /// Main running method for the application. /// </summary> private void Run() { WixVariableResolver wixVariableResolver = new WixVariableResolver(); // Initialize the binder from the command line. WixToolset.Binder binder = new WixToolset.Binder(); binder.CabCachePath = this.commandLine.CabCachePath; //binder.DeltaBinaryPatch = this.commandLine.Delta; //binder.ContentsFile = this.commandLine.ContentsFile; //binder.BuiltOutputsFile = this.commandLine.BuiltOutputsFile; //binder.OutputsFile = this.commandLine.OutputsFile; //binder.WixprojectFile = this.commandLine.WixprojectFile; //binder.BindPaths.AddRange(this.commandLine.BindPaths); binder.TargetBindPaths.AddRange(this.commandLine.TargetBindPaths); binder.UpdatedBindPaths.AddRange(this.commandLine.UpdatedBindPaths); //binder.CabbingThreadCount = this.commandLine.CabbingThreadCount; //binder.DefaultCompressionLevel = this.commandLine.DefaultCompressionLevel; //binder.ExactAssemblyVersions = this.commandLine.ExactAssemblyVersions; binder.SuppressAclReset = this.commandLine.SuppressAclReset; //binder.SuppressLayout = this.commandLine.SuppressLayout; binder.SuppressValidation = true; binder.PdbFile = this.commandLine.SuppressWixPdb ? null : this.commandLine.PdbFile; binder.TempFilesLocation = AppCommon.GetTempLocation(); binder.WixVariableResolver = wixVariableResolver; foreach (IBinderExtension extension in this.binderExtensions) { binder.AddExtension(extension); } foreach (IBinderFileManager fileManager in this.fileManagers) { binder.AddExtension(fileManager); } // Create and configure the patch Patch patch = new Patch(); patch.Load(this.commandLine.InputFile); patch.AttachTransforms(this.commandLine.PatchTransforms); bool tidy = true; // clean up after ourselves by default. try { // Bind the patch to an msp. binder.Bind(patch.PatchOutput, this.commandLine.OutputFile); } catch (WixException we) { if (we is WixInvalidIdtException) { tidy = false; } throw; } catch (Exception) { tidy = false; throw; } finally { if (null != binder) { binder.Cleanup(tidy); } } return; }
private void Run() { // Initialize the variable resolver from the command line. WixVariableResolver wixVariableResolver = new WixVariableResolver(); foreach (var wixVar in this.commandLine.Variables) { wixVariableResolver.AddVariable(wixVar.Key, wixVar.Value); } // Initialize the linker from the command line. Linker linker = new Linker(); linker.UnreferencedSymbolsFile = this.commandLine.UnreferencedSymbolsFile; linker.ShowPedanticMessages = this.commandLine.ShowPedanticMessages; linker.WixVariableResolver = wixVariableResolver; foreach (IExtensionData data in this.extensionData) { linker.AddExtensionData(data); } // Initialize the binder from the command line. WixToolset.Binder binder = new WixToolset.Binder(); binder.CabCachePath = this.commandLine.CabCachePath; binder.ReuseCabinets = this.commandLine.ReuseCabinets; binder.ContentsFile = this.commandLine.ContentsFile; binder.BuiltOutputsFile = this.commandLine.BuiltOutputsFile; binder.OutputsFile = this.commandLine.OutputsFile; binder.WixprojectFile = this.commandLine.WixprojectFile; binder.BindPaths.AddRange(this.commandLine.BindPaths); binder.CabbingThreadCount = this.commandLine.CabbingThreadCount; binder.DefaultCompressionLevel = this.commandLine.DefaultCompressionLevel; binder.ExactAssemblyVersions = this.commandLine.ExactAssemblyVersions; binder.Ices.AddRange(this.commandLine.Ices); binder.SuppressIces.AddRange(this.commandLine.SuppressIces); binder.SetMsiAssemblyNameFileVersion = this.commandLine.SetMsiAssemblyNameFileVersion; binder.SuppressAclReset = this.commandLine.SuppressAclReset; binder.SuppressLayout = this.commandLine.SuppressLayout; binder.SuppressValidation = this.commandLine.SuppressValidation; binder.PdbFile = this.commandLine.SuppressWixPdb ? null : this.commandLine.PdbFile; binder.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP") ?? Path.GetTempPath(); binder.WixVariableResolver = wixVariableResolver; foreach (IBinderExtension extension in this.binderExtensions) { binder.AddExtension(extension); } foreach (IBinderFileManager fm in this.fileManagers) { binder.AddExtension(fm); } // Initialize the localizer. Localizer localizer = this.InitializeLocalization(linker.TableDefinitions); if (Messaging.Instance.EncounteredError) { return; } wixVariableResolver.Localizer = localizer; linker.Localizer = localizer; binder.Localizer = localizer; // Loop through all the believed object files. SectionCollection sections = new SectionCollection(); Output output = null; foreach (string inputFile in this.commandLine.Files) { string inputFileFullPath = Path.GetFullPath(inputFile); // try loading as an object file try { Intermediate intermediate = Intermediate.Load(inputFileFullPath, linker.TableDefinitions, this.commandLine.SuppressVersionCheck, true); sections.AddRange(intermediate.Sections); continue; // next file } catch (WixNotIntermediateException) { // try another format } // try loading as a library file try { Library library = Library.Load(inputFileFullPath, linker.TableDefinitions, this.commandLine.SuppressVersionCheck, true); library.GetLocalizations(this.commandLine.Cultures, localizer); sections.AddRange(library.Sections); continue; // next file } catch (WixNotLibraryException) { // try another format } // try loading as an output file output = Output.Load(inputFileFullPath, this.commandLine.SuppressVersionCheck, true); } // Stop processing if any errors were found loading object files. if (Messaging.Instance.EncounteredError) { return; } // and now for the fun part if (null == output) { OutputType expectedOutputType = OutputType.Unknown; if (!String.IsNullOrEmpty(this.commandLine.OutputFile)) { expectedOutputType = Output.GetOutputType(Path.GetExtension(this.commandLine.OutputFile)); } ArrayList transforms = new ArrayList(); output = linker.Link(sections, transforms, expectedOutputType); // If an error occurred during linking, stop processing. if (null == output) { return; } } else if (0 != sections.Count) { throw new InvalidOperationException(LightStrings.EXP_CannotLinkObjFilesWithOutpuFile); } bool tidy = true; // clean up after ourselves by default. try { // only output the xml if its a patch build or user specfied to only output wixout string outputFile = this.commandLine.OutputFile; string outputExtension = Path.GetExtension(outputFile); if (this.commandLine.OutputXml || OutputType.Patch == output.Type) { if (String.IsNullOrEmpty(outputExtension) || outputExtension.Equals(".wix", StringComparison.Ordinal)) { outputExtension = (OutputType.Patch == output.Type) ? ".wixmsp" : ".wixout"; outputFile = Path.ChangeExtension(outputFile, outputExtension); } output.Save(outputFile, null, wixVariableResolver, binder.TempFilesLocation); } else // finish creating the MSI/MSM { if (String.IsNullOrEmpty(outputExtension) || outputExtension.Equals(".wix", StringComparison.Ordinal)) { outputExtension = Output.GetExtension(output.Type); outputFile = Path.ChangeExtension(outputFile, outputExtension); } binder.Bind(output, outputFile); } } catch (WixException we) // keep files around for debugging IDT issues. { if (we is WixInvalidIdtException) { tidy = false; } throw; } catch (Exception) // keep files around for debugging unexpected exceptions. { tidy = false; throw; } finally { if (null != binder) { binder.Cleanup(tidy); } } return; }
/// <summary> /// Main running method for the application. /// </summary> /// <param name="args">Commandline arguments to the application.</param> /// <returns>Returns the application error code.</returns> private int Run(string[] args) { try { // parse the command line this.ParseCommandLine(args); // exit if there was an error parsing the command line (otherwise the logo appears after error messages) if (this.messageHandler.EncounteredError) { return(this.messageHandler.LastErrorNumber); } if (null == this.inputFile || null == this.outputFile) { this.showHelp = true; } if (this.showLogo) { AppCommon.DisplayToolHeader(); } if (this.showHelp) { Console.WriteLine(PyroStrings.HelpMessage); AppCommon.DisplayToolFooter(); return(this.messageHandler.LastErrorNumber); } // Load in transforms ArrayList transforms = new ArrayList(); foreach (string inputTransform in inputTransformsOrdered) { PatchTransform patchTransform = new PatchTransform(inputTransform, inputTransforms[inputTransform]); patchTransform.Message += new MessageEventHandler(this.messageHandler.Display); transforms.Add(patchTransform); } // Create and configure the patch Patch patch = new Patch(); patch.Message += new MessageEventHandler(this.messageHandler.Display); // Create and configure the binder binder = new WixToolset.Binder(); binder.TempFilesLocation = Environment.GetEnvironmentVariable("WIX_TEMP"); binder.WixVariableResolver = this.wixVariableResolver; binder.Message += new MessageEventHandler(this.messageHandler.Display); binder.SuppressAssemblies = this.suppressAssemblies; binder.SuppressFileHashAndInfo = this.suppressFileHashAndInfo; binder.SetMsiAssemblyNameFileVersion = this.setAssemblyFileVersions; // have the binder parse the command line arguments light did not recognize string[] unparsedArgsArray = new string[this.unparsedArgs.Count]; this.unparsedArgs.CopyTo(unparsedArgsArray, 0); StringCollection remainingArgs = this.binder.ParseCommandLine(unparsedArgsArray, this.messageHandler); // Load the extensions bool binderFileManagerLoaded = false; foreach (String extension in this.extensions) { WixExtension wixExtension = WixExtension.Load(extension); binder.AddExtension(wixExtension); patch.AddExtension(wixExtension); if (0 < remainingArgs.Count) { remainingArgs = wixExtension.ParseCommandLine(remainingArgs, this.messageHandler); } if (null != wixExtension.BinderFileManager) { if (binderFileManagerLoaded) { throw new ArgumentException(String.Format(CultureInfo.CurrentUICulture, PyroStrings.EXP_CannotLoadBinderFileManager, wixExtension.BinderFileManager.GetType().ToString(), binder.FileManager.ToString()), "ext"); } binder.FileManager = wixExtension.BinderFileManager; binderFileManagerLoaded = true; } } foreach (string parameter in remainingArgs) { this.messageHandler.Display(this, WixWarnings.UnsupportedCommandLineArgument(parameter)); } if (this.messageHandler.EncounteredError) { return(this.messageHandler.LastErrorNumber); } // since the binder is now ready, let's plug dynamic bindpath into file manager this.PrepareDataForFileManager(); // Load the patch patch.Load(this.inputFile); // Copy transforms into output if (0 < transforms.Count) { patch.AttachTransforms(transforms); } if (this.messageHandler.EncounteredError) { return(this.messageHandler.LastErrorNumber); } if (null == this.pdbFile && null != this.outputFile) { this.pdbFile = Path.ChangeExtension(this.outputFile, ".wixpdb"); } binder.PdbFile = suppressWixPdb ? null : this.pdbFile; if (this.suppressFiles) { binder.SuppressAssemblies = true; binder.SuppressFileHashAndInfo = true; } if (null != this.cabCachePath || this.reuseCabinets) { // ensure the cabinet cache path exists if we are going to use it if (null != this.cabCachePath && !Directory.Exists(this.cabCachePath)) { Directory.CreateDirectory(this.cabCachePath); } } binder.FileManager.ReuseCabinets = this.reuseCabinets; binder.FileManager.CabCachePath = this.cabCachePath; binder.FileManager.Output = patch.PatchOutput; binder.FileManager.DeltaBinaryPatch = this.delta; // Bind the patch to an msp. binder.Bind(patch.PatchOutput, this.outputFile); } catch (WixException we) { this.OnMessage(we.Error); } catch (Exception e) { this.OnMessage(WixErrors.UnexpectedException(e.Message, e.GetType().ToString(), e.StackTrace)); if (e is NullReferenceException || e is SEHException) { throw; } } finally { if (null != binder) { if (this.tidy) { if (!binder.DeleteTempFiles()) { Console.WriteLine(PyroStrings.WAR_FailedToDeleteTempDir, binder.TempFilesLocation); } } else { Console.WriteLine(PyroStrings.INF_TempDirLocatedAt, binder.TempFilesLocation); } } } return(this.messageHandler.LastErrorNumber); }