设置UI对话框并使用WiX有条件地安装path
我知道这是WiX的一个常见问题,我知道解决这个问题可能很容易,但我陷入了困境,我所能找到的任何主题都没有帮助我,所以我来了 我在Visual Studio中使用WiX 3.11,并使用一个非常简单的UI对话框序列,该序列取自:设置UI对话框并使用WiX有条件地安装path,wix,visual-studio-2017,wix3.11,Wix,Visual Studio 2017,Wix3.11,我知道这是WiX的一个常见问题,我知道解决这个问题可能很容易,但我陷入了困境,我所能找到的任何主题都没有帮助我,所以我来了 我在Visual Studio中使用WiX 3.11,并使用一个非常简单的UI对话框序列,该序列取自: 1. 1. 其中INSTALLFOLDER是在我的目录定义的其他地方定义的。 如您所见,这非常简单: -欢迎 -选择一个目录 -结束安装 现在,我想修改此设置,以便在.msi升级时跳过InstallDir对话框,并直接在现有安装文件夹中进行升级。 我在HKCU中编写了
1.
1.
其中INSTALLFOLDER是在我的目录定义的其他地方定义的。如您所见,这非常简单:
-欢迎
-选择一个目录
-结束安装 现在,我想修改此设置,以便在.msi升级时跳过InstallDir对话框,并直接在现有安装文件夹中进行升级。 我在HKCU中编写了一个注册表值,用于存储安装路径,并在安装时使用属性检索它。 我尝试使用条件在UI中创建不同的对话框序列,并根据我的属性设置安装文件夹,但在运行.msi文件时出现错误 下面是它现在的样子:
<Product ...Some stuff here ... >
<Property Id="ALREADYINSTALLED">
<RegistrySearch Id="InstallPath"
Key="Software\$(var.MainDir)\$(var.SecondaryDir)"
Name="InstallFolder"
Root="HKCU"
Type="directory"
Win64="$(var.Win64)"/>
</Property>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
/!\ Interesting part here /!\
<Publish Dialog="WelcomeDlg" Control="Next" Event="SetTargetPath" Value="[ALREADYINSTALLED]" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
</Fragment>
<Component ... Some stuff here ... >
<RegistryValue Root="HKCU"
Key="Software\$(var.MainDir)\$(var.SecondaryDir)"
Name="InstallFolder"
Type="string"
Value="[INSTALLFOLDER]"
KeyPath="yes" />
... Some other stuff here ...
</Component>
/!\ 这里有意思的部分\
... 这里还有一些其他的东西。。。
我的条件似乎工作正常,但我无法使用属性传递安装文件夹。我觉得我错过了一些简单的东西,但我不知道是什么
有人能帮我吗?我终于找到了解决办法。正如我所想,这很简单。
事实证明,您可以覆盖片段定义中的目录路径,因此解决方案是:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
<!-- Overwrites the Install Folder if this is an upgrade -->
<SetDirectory Id="INSTALLFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
然后,设置从WelcomeDlg到VerifyReadyDlg的UI对话框:
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
你可以走了。我终于找到了解决办法。正如我所想,这很简单。
事实证明,您可以覆盖片段定义中的目录路径,因此解决方案是:
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.PlatformProgramFilesFolder)">
<Directory Id="SAFEFOLDER" Name="$(var.MainDir)">
<Directory Id="INSTALLFOLDER" Name="$(var.SecondaryDir)" />
</Directory>
</Directory>
</Directory>
<!-- Overwrites the Install Folder if this is an upgrade -->
<SetDirectory Id="INSTALLFOLDER" Value="[ALREADYINSTALLED]"> <![CDATA[ALREADYINSTALLED]]> </SetDirectory>
</Fragment>
然后,设置从WelcomeDlg到VerifyReadyDlg的UI对话框:
<UI>
<UIRef Id="WixUI_InstallDir"/>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[NOT ALREADYINSTALLED]]> </Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2"> <![CDATA[ALREADYINSTALLED]]> </Publish>
</UI>
你可以走了