void bw_DoWorkUninstall(object sender, DoWorkEventArgs e) { List <UninstallFileInfo> filesToUninstall = new List <UninstallFileInfo>(); List <string> foldersToDelete = new List <string>(); List <RegChange> registryToDelete = new List <RegChange>(); List <UninstallFileInfo> comDllsToUnreg = new List <UninstallFileInfo>(); List <string> servicesToStop = new List <string>(); // Load the list of files, folders etc. from the client file (Filename) RollbackUpdate.ReadUninstallData(Filename, filesToUninstall, foldersToDelete, registryToDelete, comDllsToUnreg, servicesToStop); // uninstall files foreach (UninstallFileInfo file in filesToUninstall) { try { if (file.DeleteFile) { File.Delete(file.Path); } } catch { } } //uninstall folders for (int i = foldersToDelete.Count - 1; i >= 0; i--) { //delete the last folder first (this fixes the problem of nested folders) try { //directory must be empty in order to delete it Directory.Delete(foldersToDelete[i]); } catch { } } // tell the sender that we're uninstalling reg now: bw.ReportProgress(0, new object[] { -1, -1, string.Empty, ProgressStatus.None, null }); //uninstall registry foreach (RegChange reg in registryToDelete) { try { reg.ExecuteOperation(); } catch { } } // All done bw.ReportProgress(0, new object[] { -1, -1, string.Empty, ProgressStatus.Success, null }); }