public static Process RunUninstaller(this ApplicationUninstallerEntry entry, bool silentIfAvailable,
                                             bool simulate)
        {
            try
            {
                ProcessStartInfo startInfo = null;
                string           fallBack  = null;

                if (silentIfAvailable && entry.QuietUninstallPossible)
                {
                    // Use supplied quiet uninstaller if any
                    try
                    {
                        startInfo = ProcessTools.SeparateArgsFromCommand(entry.QuietUninstallString).ToProcessStartInfo();
                        Debug.Assert(!startInfo.FileName.Contains(' ') || File.Exists(startInfo.FileName));
                    }
                    catch (FormatException)
                    {
                        fallBack = entry.QuietUninstallString;
                    }
                }
                else if (entry.UninstallPossible)
                {
                    // Fall back to the non-quiet uninstaller
                    try
                    {
                        startInfo = ProcessTools.SeparateArgsFromCommand(entry.UninstallString).ToProcessStartInfo();
                        Debug.Assert(!startInfo.FileName.Contains(' ') || File.Exists(startInfo.FileName));

                        if (entry.UninstallerKind == UninstallerType.Nsis)
                        {
                            UpdateNsisStartInfo(startInfo, entry.DisplayName);
                        }
                    }
                    catch (FormatException)
                    {
                        fallBack = entry.UninstallString;
                    }
                }
                else
                {
                    // Cant do shit, capt'n
                    throw new InvalidOperationException(Localisation.UninstallError_Nowaytouninstall);
                }

                if (simulate)
                {
                    Thread.Sleep(5000);
                    if (Debugger.IsAttached && new Random().Next(0, 2) == 0)
                    {
                        throw new IOException("Random failure for debugging");
                    }
                    return(null);
                }

                if (fallBack != null)
                {
                    return(Process.Start(fallBack));
                }

                if (startInfo != null)
                {
                    startInfo.UseShellExecute = true;
                    return(Process.Start(startInfo));
                }

                // Cant do shit, capt'n
                throw new InvalidOperationException(Localisation.UninstallError_Nowaytouninstall);
            }
            catch (IOException)
            {
                throw;
            }
            catch (InvalidOperationException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new FormatException(ex.Message, ex);
            }
        }
 public static Process RunUninstaller(this ApplicationUninstallerEntry entry)
 {
     return(RunUninstaller(entry, false, false));
 }