Используя WixSharp, как получить правильный путь InstallDir во время пользовательского действия, которое выполняется при удалении - PullRequest
0 голосов
/ 27 сентября 2018

Я создал MSI Setup с WiX, используя WixSharp.Он включает в себя несколько пользовательских действий.Например, во время установки я выполняю некоторые командные файлы, которые устанавливают и запускают службу.И во время удаления он должен остановить и удалить службу снова.

var dir = new InstallDir(@"%ProgramFiles%\MyCompany\MyProduct",
                             new Files(@"..\..\..\AllMyFiles\*.*"));

var project = new Project("MyProduct", dir) {
     GUID = new Guid("7f22db65-2b23-4df2-b2b2-495f2d369c3d"),
     Version = new Version(1, 0, 0, 0),
     UI = WUI.WixUI_InstallDir,
     Platform = Platform.x64
};

project.Actions = new WixSharp.Action[] {
     new ElevatedManagedAction(CustomActions.InstallService,Return.check, When.Before, Step.InstallFinalize, Condition.NOT_Installed),
     new ElevatedManagedAction(CustomActions.StartService,Return.check, When.After, Step.PreviousAction, Condition.NOT_Installed),
     new ElevatedManagedAction(CustomActions.StopService,Return.check, When.Before, Step.RemoveFiles, Condition.Installed),
     new ElevatedManagedAction(CustomActions.UninstallService,Return.check, When.After, Step.PreviousAction, Condition.Installed)
};

Теперь вот важная часть.Мне нужно выполнить командный файл во время установки и удаления, который находится где-то в INSTALLDIR:

[CustomAction]
public static ActionResult StartService(Session session) {

     string installDir = session.Property("INSTALLDIR"); //<--this works on install even when using a custom path
     string workingDir = Path.Combine(installDir, @"\SomePathToTheBatchFile");
     RunCmdMethode(workingDir, "something.bat -some arguments");

     return ActionResult.Success;
}
[CustomAction]
public static ActionResult UninstallService(Session session) {

     string installDir = session.Property("INSTALLDIR"); //<--this does not give back the right path on uninstall in case the default path was changed during installation
     string workingDir = Path.Combine(installDir, @"\SomePathToTheBatchFile");
     RunCmdMethode(workingDir, "something.bat -some arguments");

     return ActionResult.Success;
}

Все идет гладко при использовании пути по умолчанию для установки.Но если я изменяю путь установки по умолчанию во время установки на какой-либо другой путь, то шаг установки правильно находит .bat и выполняет его, но во время удаления он ищет файл .bat в папке по умолчанию.Хотя Деинсталлятор правильно удаляет файлы в нужном месте.Таким образом, пользовательский путь установки должен быть где-то сохранен.Как мне получить к нему доступ?

1 Ответ

0 голосов
/ 01 октября 2018

Наконец-то я смог решить проблему самостоятельно и с помощью Олега (https://github.com/oleg-shilo/wixsharp/issues/486). Поскольку session.Property("INSTALLDIR") действительно должно работать, и поэтому я не ошибся, я смог выяснить причину, который устанавливает для свойства IsInstallDir значение true, используя класс InstallDir вместо класса * 1006. * Он перезаписывает свойство INSTALLDIR при удалении обратно в жестко заданный путь по умолчанию. Это объясняет, почему установка работала нормальнодо тех пор, пока используется путь по умолчанию, а также почему он работает для всех пользовательских шагов установки, даже если используется пользовательский путь, но не для его удаления. Причина, по которой я вначале установил для свойства IsInstallDir значение true, заключается в том, чтоиз-за некоторого странного поведения при добавлении всех файлов в настройку с использованием подстановочных знаков. Пока в исходном каталоге есть несколько файлов и папок, все будет работать так, как ожидалось, с правильным указанием всех путей и т. д. Но только в исходной папкесодержит одну папку внутри, которая затем содержит остальную часть установочного файлаКроме того, он устанавливает внутреннюю папку в качестве новой корневой папки (что странно, но как только вы узнаете об этом поведении, все начинает обретать смысл), и поэтому путает многие необходимые пути.Использование InstallDir вместо Dir исправило это.Я мог бы приложить некоторые усилия для реструктуризации всего этого (если это даже возможно в моем случае использования), но сейчас просто добавление файла readme на том же уровне, что и отдельная внутренняя папка, решает эту проблему и таким образом я мог бы вернуться, используяDir в первой строке:

var dir = new Dir(@"%ProgramFiles%\MyCompany\MyProduct",
                 new Files(@"..\..\..\AllMyFiles\*.*"));
...