public void Execute() { var trackedFiles = new List <ITrackedFile>(); var stopwatch = Stopwatch.StartNew(); this.Messaging.Write(VerboseMessages.ValidatingDatabase()); // Ensure the temporary files can be created the working folder. var workingFolder = Path.Combine(this.IntermediateFolder, "_validate"); Directory.CreateDirectory(workingFolder); // Copy the database to a temporary location so it can be manipulated. // Ensure it is not read-only. var workingDatabasePath = Path.Combine(workingFolder, Path.GetFileName(this.OutputPath)); FileSystem.CopyFile(this.OutputPath, workingDatabasePath, allowHardlink: false); var trackWorkingDatabase = this.BackendHelper.TrackFile(workingDatabasePath, TrackedFileType.Temporary); trackedFiles.Add(trackWorkingDatabase); var attributes = File.GetAttributes(workingDatabasePath); File.SetAttributes(workingDatabasePath, attributes & ~FileAttributes.ReadOnly); var validator = new WindowsInstallerValidator(this, workingDatabasePath, this.CubeFiles, this.Ices, this.SuppressedIces); validator.Execute(); stopwatch.Stop(); this.Messaging.Write(VerboseMessages.ValidatedDatabase(stopwatch.ElapsedMilliseconds)); this.TrackedFiles = trackedFiles; }