Используя WixSharp, как получить правильный путь InstallDir во время пользовательского действия, которое выполняется при удалении

Я создал 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 ответ

Решение

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

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

Это происходит потому, что вы вызываете действие "после" удаления. это должно быть "Когда. До"

new ManagedAction(CustomActions.UninstallService,Return.check, When.Before, Step.InstallFinalize, Condition.Installed)
Другие вопросы по тегам