Запуск пользовательских действий перед установкой - PullRequest
1 голос
/ 14 января 2011

У меня есть проект базовой установки в Visual Studio 2010, и я пытаюсь настроить пользовательские действия. У меня есть 3 класса установщика в отдельной сборке.

3 класса выполняют следующие функции:

  • Проверка параметров для автоматической установки с информацией о лицензировании (переопределяет метод Install)
  • Удалить предыдущую установку программного обеспечения (устанавливается с помощью установщика NSIS, используется событие BeforeInstall)
  • Остановите программу, если она работает, используя событие BeforeInstall

Проблема последняя, ​​кажется, событие BeforeInstall никогда не вызывается. Я пытался заставить его создать файл на диске и отображать MessageBox. Это никогда не срабатывает.

«Первичный вывод из SetupActions» был добавлен в раздел «Install» в редакторе пользовательских действий. Все классы моего установщика имеют [RunInstaller(true)].

Код, который не работает:

[RunInstaller(true)]
public partial class InstallerStopProgram : System.Configuration.Install.Installer
{
    public InstallerStopProgram()
    {
        InitializeComponent();
    }

    private void InstallerStopProgram_BeforeInstall(object sender, InstallEventArgs e)
    {
        MessageBox.Show("This is never displayed during the install");
    }
}

Ответы [ 3 ]

2 голосов
/ 14 января 2011

Проблема с этим подходом заключается в том, что вы хотите запустить что-то перед установкой и что что-то находится в dll / exe, который попадает на целевой компьютер только как часть установки. Поэтому, если установка не будет завершена, у вас не будет кода для запуска BeforeInstall на диске (а затем вы сможете запустить его только после установки).

Насколько мне известно, то, что вы хотите достичь, не возможно, проект установки VS 2010. Возможно, вам следует использовать Wix (или NSIS)!

0 голосов
/ 28 июня 2013

Вам не нужно переходить на WiX, но вы можете сделать это, если в какой-то степени используете WiX.

Сначала вам нужно будет перенести код C # в Настраиваемое действие WiX..

Затем вы вставите это пользовательское действие в MSI, используя следующий код JScript:

var installer = WScript.CreateObject("WindowsInstaller.Installer");
var filespec = WScript.Arguments(0);
var msiOpenDatabaseModeTransact = 1;
var msiViewModifyAssign         = 3;
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sqlQuery = "SELECT `Name`,`Data` FROM Binary";
var view = database.OpenView(sqlQuery);
var record = installer.CreateRecord(2);
record.StringData(1) = "myAction";
view.Execute(record);
var binaryPath = WScript.ScriptFullName.replace(WScript.ScriptName, "SetupAction.CA.dll");
record.SetStream(2, binaryPath);
view.Modify(msiViewModifyAssign, record);
Execute("INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`)  VALUES ('myActionId', 1, 'myAction', 'MySimpleAction')");
Execute("INSERT INTO `InstallUISequence` (`Action`, `Sequence`)  VALUES ('myActionId', 26)");
database.Commit();

function Execute(sql) {
    view = database.OpenView(sql);
    view.Execute();
    view.Close();
}
0 голосов
/ 14 января 2011

VinacC является правильным выше.Чтобы сделать это правильно, это должно быть сделано до расчета стоимости файла.Бутстрэппер будет хорошим местом для этого.Вы хотите очистить компьютер от старой версии NSIS до того, как установщик Windows начнет искать, что нужно сделать, чтобы получить последнюю версию.

...