在安装过程中,我必须安装一个外部驱动程序,该驱动程序取决于PC的操作系统。我知道我可以为每个操作系统构建多个安装程序包,但我必须在一个安装程序中完成。这可能吗?
我的第一个问题是找出PC上存在哪个操作系统。通过以下条件?
<Condition Message="Your Operating system is ... .">
VersionNT = 500
<?define PCPlatform = "Win2000" ?>
OR VersionNT = 501
<?define PCPlatform = "XP" ?>
OR VersionNT = 600
<?define PCPlatform = "Vista" ?>
OR VersionNT = 601
<?define PCPlatform = "Win7" ?>
</Condition>
然后如何告诉安装程序要执行哪个文件?
<Component Id="Win32_W2K" Guid="...">
<File Id="vbsetup7" Source="..\driver\32Bit\W2K\vbsetup7.exe" Name="vbsetup7.exe" KeyPath="yes" DiskId="1"/>
</Component>
<Component Id="Win32_XP" Guid="...">
<File Id="vbsetup7" Source="..\driver\32Bit\XP\vbsetup7.exe" Name="vbsetup7.exe" KeyPath="yes" DiskId="1"/>
</Component>
<Component Id="Win32_Vista" Guid="...">
<File Id="vbsetup7" Source="..\driver\32Bit\Vista\vbsetup7.exe" Name="vbsetup7.exe" KeyPath="yes" DiskId="1"/>
</Component>
<Component Id="Win32_Win7" Guid="...">
<File Id="vbsetup7" Source="..\driver\32Bit\Win7\vbsetup7.exe" Name="vbsetup7.exe" KeyPath="yes" DiskId="1"/>
</Component>
<CustomAction Id="Virtual_Driver" FileKey="vbsetup7" Execute="deferred" ExeCommand="" Return="check" Impersonate="no"/>
答案 0 :(得分:6)
您必须向组件添加Condition
。在运行时,Condition
必须仅对其中一个组件元素求值为true,即条件必须互斥。类似的东西:
<Component Id="Win32_W2K" Guid="...">
<Condition>VersionNT = 500</Condition>
<File Id="vbsetup7" Source="..\driver\32Bit\W2K\vbsetup7.exe" Name="vbsetup7.exe" KeyPath="yes" DiskId="1"/>
</Component>
答案 1 :(得分:0)
你是如何安装驱动程序的?如果您使用的是DifxApp,那么您必须拥有多个安装程序,每个目标体系结构一个(x86 vs x64)。 Difxapp有wixlib可以让驱动程序安装变得非常简单。
答案 2 :(得分:0)
如果必须在“另一个”内部运行一个安装程序,可能会遇到问题,特别是如果第二个软件包也是基于Windows Installer的,因为Windows Installer(MSI)不支持“嵌套”安装。 MSI使用的一些资源实际上是全局的,因此内部安装可以在外部安装中进行操作。
更好的方法是使用一系列安装。在WiX中,这些称为bundles,由burn
引导程序运行。您可以对bundle的每个元素应用条件,以便给定元素仅针对特定Windows版本(或Service Pack包级别,或x86 | x64,或者如果系统中存在或不存在某些其他包)运行,或者......安装条件可以像您一样灵活。)