using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Threading; namespace Tango.MachineStudio.Updater { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { private String _sourceFolder = AppDomain.CurrentDomain.BaseDirectory; private String _msProcessName = "Tango.MachineStudio.UI"; private String _appPath = String.Join(" ", App.StartupArgs); public MainWindow() { if (!Directory.Exists(_appPath)) { ShowError("This update utility can only be executed by Machine Studio."); Environment.Exit(0); } InitializeComponent(); ContentRendered += MainWindow_ContentRendered; } private void MainWindow_ContentRendered(object sender, EventArgs e) { Update(); } private void Update() { EnsureMachineStudioIsDown(); //RemoveOldDLLFiles(); ReplaceFiles(); PostProcessing(); StartMachineStudio(); Environment.Exit(0); } private void StartMachineStudio() { txtStatus.Text = "Update completed. Starting Machine Studio..."; DoEvents(); Thread.Sleep(1000); Process p = new Process(); p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe"; p.StartInfo.LoadUserProfile = true; p.StartInfo.UseShellExecute = true; p.Start(); } //private void RemoveOldDLLFiles() //{ // foreach (string dll in Directory.GetFiles(_appPath, "*.dll")) // { // try // { // File.Delete(dll); // } // catch // { // ShowError($"The file '{Path.GetFileName(dll)}' could not be removed. Please close all instances of Machine Studio and press OK."); // RemoveOldDLLFiles(); // return; // } // } //} private void ReplaceFiles() { int maxProgress = Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories).Length; int progress = 0; foreach (string dirPath in Directory.GetDirectories(_sourceFolder, "*", SearchOption.AllDirectories)) { try { Directory.CreateDirectory(dirPath.Replace(_sourceFolder, _appPath)); } catch (Exception ex) { ShowError("Could not create directory " + Path.GetFileName(dirPath) + Environment.NewLine + ex.Message); } } foreach (string newPath in Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories)) { try { txtStatus.Text = "Copying file " + Path.GetFileName(newPath); DoEvents(); File.Copy(newPath, newPath.Replace(_sourceFolder, _appPath), true); prog.Maximum = maxProgress; prog.Value = progress++; DoEvents(); Thread.Sleep(10); } catch (Exception ex) { if (!newPath.ToLower().Contains("updater.exe")) { ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message); } } } } private void EnsureMachineStudioIsDown() { Process appProcess = null; int tries = 0; do { appProcess = Process.GetProcessesByName(_msProcessName).FirstOrDefault(); Process p = new Process(); p.StartInfo.CreateNoWindow = true; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.FileName = "wmic"; p.StartInfo.Arguments = String.Format("process where name='{0}' delete", _msProcessName); if (appProcess != null) { tries++; try { appProcess.Kill(); } catch { } try { p.Start(); } catch { } Thread.Sleep(1000); } if (tries > 10) { ShowError("The main Machine Studio process seems to in a frozen state. Please restart your computer and try again."); Environment.Exit(0); } } while (appProcess != null); } private void DoEvents() { Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { })); } private void ShowError(String error) { MessageBox.Show(error, "Machine Studio Update", MessageBoxButton.OK, MessageBoxImage.Error); } private void PostProcessing() { //Remove DB and ColorLab modules. TryDelete(Path.Combine(_appPath, "Tango.MachineStudio.DB.dll")); TryDelete(Path.Combine(_appPath, "Tango.MachineStudio.ColorLab.dll")); } private void TryDelete(String path) { try { File.Delete(path); } catch { } } } }