Wix Toolset v3:为WixUI_Minimal添加复选框对话框以条件运行EXE
Wix Toolset v3.11 自定义复选框对话框+条件运行EXE问题修复
问题说明
使用Wix Toolset v3.11添加带复选框的自定义对话框,希望安装完成后根据复选框状态条件运行EXE,但代码出现语法错误无法配置成功。
原代码
<Product Id="*" Name="MyCompany Test Installer" Version="1.0.0" Manufacturer="MyCompany" UpgradeCode="{356FCAF3-500B-4EE4-A205-E1AB1915EE55}" Language="1033"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64" /> <MediaTemplate EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="MyCompany"> <Component Id="ProductComponent" Guid="{7BE266C9-156D-4DDC-A5BA-09F7567BBBA3}"> <File Id="MyExe" Source="ToolPalettesFolderSync.exe" KeyPath="yes" /> </Component> </Directory> </Directory> </Directory> <Feature Id="MainFeature" Title="MyComapny Test Installer" Level="1"> <ComponentRef Id="ProductComponent" /> <ComponentRef Id="ToolPalleteFolderSyncShortcut" /> <ComponentGroupRef Id="INSTALLFOLDER_files" /> </Feature> <Property Id="RUN_EXE" Value="0" /> <UI> <UIRef Id="WixUI_Minimal" /> <Dialog Id="MyCheckboxDialog" Width="370" Height="270" Title="My Custom Dialog"> <Control Id="Checkbox" Type="CheckBox" X="20" Y="20" Width="330" Height="17" Property="RUN_EXE" Text="Run MyExecutable after installation?" CheckBoxValue="1" /> <Control Id="Next" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="Next"> <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish> </Control> <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="Back"> <Publish Event="NewDialog" Value="WelcomeDlg">1</Publish> </Control> </Dialog> <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="MyCheckboxDialog">1</Publish> <Publish Dialog="MyCheckboxDialog" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> <Publish Dialog="MyCheckboxDialog" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> </UI> <InstallExecuteSequence> <Custom Action="RunMyExe" After="InstallFinalize">RUN_EXE="1"</Custom> </InstallExecuteSequence> <CustomAction Id="RunMyExe" FileKey="MyExe" ExeCommand="" Return="asyncNoWait"/> </Product>
错误信息翻译
错误 LGHT0094: 未解析的引用符号 'Component:ToolPalleteFolderSyncShortcut' 在片段中。
错误 LGHT0094: 未解析的引用符号 'ComponentGroup:INSTALLFOLDER_files' 在片段中。
警告 LGHT1076: 对话框 MyCheckboxDialog 中的控件 Next 已发布事件 NewDialog,同时在 UI 片段中也存在针对该控件的相同发布,可能导致冲突。
修复方案
- 移除未定义的组件引用:原代码
Feature节点中引用的ToolPalleteFolderSyncShortcut和INSTALLFOLDER_files未定义,直接删除这两行引用。 - 移除重复的Publish事件:自定义对话框的
Next和Back按钮内部已定义Publish事件,UI节点下的重复定义会导致冲突,删除对应重复行。 - 统一XML缩进:修正原代码中
UI节点的缩进不一致问题,确保XML结构规范。
修复后完整代码
<Product Id="*" Name="MyCompany Test Installer" Version="1.0.0" Manufacturer="MyCompany" UpgradeCode="{356FCAF3-500B-4EE4-A205-E1AB1915EE55}" Language="1033"> <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64" /> <MediaTemplate EmbedCab="yes" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLFOLDER" Name="MyCompany"> <Component Id="ProductComponent" Guid="{7BE266C9-156D-4DDC-A5BA-09F7567BBBA3}"> <File Id="MyExe" Source="ToolPalettesFolderSync.exe" KeyPath="yes" /> </Component> </Directory> </Directory> </Directory> <Feature Id="MainFeature" Title="MyComapny Test Installer" Level="1"> <ComponentRef Id="ProductComponent" /> </Feature> <Property Id="RUN_EXE" Value="0" /> <UI> <UIRef Id="WixUI_Minimal" /> <Dialog Id="MyCheckboxDialog" Width="370" Height="270" Title="My Custom Dialog"> <Control Id="Checkbox" Type="CheckBox" X="20" Y="20" Width="330" Height="17" Property="RUN_EXE" Text="Run MyExecutable after installation?" CheckBoxValue="1" /> <Control Id="Next" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="Next"> <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish> </Control> <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="Back"> <Publish Event="NewDialog" Value="WelcomeDlg">1</Publish> </Control> </Dialog> <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="MyCheckboxDialog">1</Publish> </UI> <InstallExecuteSequence> <Custom Action="RunMyExe" After="InstallFinalize">RUN_EXE="1"</Custom> </InstallExecuteSequence> <CustomAction Id="RunMyExe" FileKey="MyExe" ExeCommand="" Return="asyncNoWait"/> </Product>
验证说明
- 复选框状态绑定到
RUN_EXE属性,勾选时值为1,否则为0 - 安装完成后,
InstallFinalize步骤后会根据RUN_EXE="1"的条件触发自定义动作运行EXE - 使用
Return="asyncNoWait"确保EXE运行不阻塞安装程序结束
内容的提问来源于stack exchange,提问作者jclay06
相关产品推荐
相关产品推荐

