使用WixSharp如何在卸载时执行的自定义操作期间获取正确的InstallDir路径

时间:2018-09-27 12:44:37

标签: c# installation wix wixsharp

我使用WixSharp使用WiX创建了一个msi安装程序。它包括几个自定义动作。 例如,在安装期间,我正在执行一些批处理文件,这些文件正在安装和启动服务。并且在卸载过程中,它应该停止并再次卸载服务。

SELECT *
FROM parcare_parking
WHERE parking_on = tomorrow()

现在是关键部分。我需要在安装和卸载期间执行一个批处理文件,该文件位于INSTALLDIR中的某个位置:

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)
};

使用默认的安装路径时,所有操作都会顺利进行。但是,如果我在安装过程中将默认安装路径更改为某些自定义路径,则安装步骤会正确找到.bat并执行它,但是在卸载过程中,它将在默认文件夹中搜索.bat文件。尽管卸载程序会在正确的位置正确删除文件。因此,自定义安装路径必须保存在某处。如何正确访问它?

2 个答案:

答案 0 :(得分:1)

在Oleg(https://github.com/oleg-shilo/wixsharp/issues/486)的帮助下,我终于可以自己解决问题了。 由于session.Property("INSTALLDIR")实际上应该工作,因此我当时没有犯错,因此我可以找出根本原因,即通过使用IsInstallDir类将InstallDir属性设置为true而不是Dir类。卸载回到硬编码的默认路径时,它会覆盖INSTALLDIR属性。 这解释了为什么只要使用默认路径,安装程序就可以正常工作,即使在使用自定义路径时,安装程​​序仍然可以用于所有安装自定义步骤,但现在不再适用于卸载。之所以首先将IsInstallDir属性设置为true,是因为在使用通配符将所有文件添加到设置中时有些奇怪的行为。只要源目录中有多个文件和文件夹,它就可以按预期工作,正确设置所有路径,依此类推。但是,一旦源文件夹仅包含一个文件夹,然后在其中包含其余的安装文件,它会将内部文件夹设置为新的根文件夹(有点奇怪,但是一旦您知道这种行为,事情就开始有意义了),因此搞砸了许多必要的路径。使用InstallDir而非Dir修复了该问题。 我可能会花一些精力来重组整个事情(如果在我的用例中甚至可以做到),但是现在只需在与单个内部文件夹相同的级别上添加一个自述文件即可解决该问题,因此我可以回头使用第一行中的Dir

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

答案 1 :(得分:0)

之所以发生这种情况,是因为您在卸载后将操作称为“之后”。它应该是“ When.Before”

new ManagedAction(CustomActions.UninstallService,Return.check, When.Before, Step.InstallFinalize, Condition.Installed)