Не удалось найти ошибку installstate во время выполнения события Roolback InstallerClass в проекте установки - PullRequest
0 голосов
/ 29 ноября 2018

Я создал проект установки Visual Studio и добавил два консольных приложения в качестве вывода проекта в проект установки.Каждое консольное приложение имеет свой класс установщика.В пользовательском действии проекта установки я добавил выше два приложения.

В InstallerClass у consoleApp2 у меня есть несколько проверок, если проверки пройдены успешно, он будет проверять установочный класс ConsoleApp1, в противном случае установка установки должна быть отменена.

Во время операции отката появляется сообщение «Ошибка 1001. Не удалось найти путь к файлу приложения \ Consoleapp1.InstallState», как показано ниже, поскольку его состояние установки еще не инициировано.

enter image description here

Есть ли способ исправить эту проблему.Мой главный девиз - откатить установку без ошибок, отображаемых пользователю, если проверки в классе установщика не пройдены.Ниже приведен код, который я использую.

  public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        MessageBox.Show("Install");
        try
        {
            const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";

            using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
            {
                if (ndpKey != null && ndpKey.GetValue("Release") != null && Convert.ToInt32(ndpKey.GetValue("Release")) > 461310)
                {
                    MessageBox.Show("Framework version is " + ndpKey.GetValue("Release").ToString());

                    string message = "This setup requires .Net framework Version 4.7.1. Please install the .Net Framework and run setup again. The .Net framework can be  obtained from the web. Would you like to do this now ?";
                    MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                    DialogResult result = MessageBox.Show(message, "", buttons);
                    if (result == DialogResult.Yes)
                    {
                        Process.Start("http://go.microsoft.com");

                        throw new InstallException(String.Format("Installation rollbacked."));
                    }
                    else
                    {
                        throw new InstallException(String.Format("Cancelling Installation"));

                    }

                }
                else
                {


                }

            }
        }
        catch (Exception ex)
        {

            throw new Exception(String.Format("Cancelling Installation 123"));

        }

    }
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
        MessageBox.Show("rollback c2 " + savedState.Values);
    }
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
    }
...