我为我的应用程序创建了一个使用WIX的静默安装程序。我希望它将我的应用程序安装到C:\MyApps文件夹中,但其目录Id='TARGETDIR'Name='SourceDir'标记随机选择C或D驱动器。我只想强制安装到C驱动器。此外,如果我提供的版本号大于4.0.5,我在安装过程中收到一个错误,说"Windows安装程序服务无法安装此安装包。您必须安装Windows安装程序的更新版本。"我使用的是Windows XP专业SP3 2002版。
首先,我认为您应该从这里提供的教程开始您的WiX之旅。它包含了你第一件事将要面对的大多数基本问题的答案。你还应该意识到,理解WiX意味着首先了解Windows安装程序的概念——否则,有些要点对你来说会是一种奇怪的魔法。
当您在Visual Studio中创建一个新的WiX安装项目时,它会生成一个带有一些占位符的模板。建议开始修改此模板。例如,目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="SetupProject1">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Id="ProductComponent" Guid="ba7d579f-5234-4448-b880-109f589d58e5"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</Directory>
</Directory>
</Directory>
此代码段定义ProgramFileFolder下的INSTALLLOCATION文件夹,这是一种比将其放在C:\root下更好的方法。您仍然可以通过在安装时修改INSTALLLOCATION属性来更改安装位置(例如,根据用户的输入)。
你的问题的快速答案是:
随机选择C或D驱动器。。。
这是意料之中的事——它会在安装时选择可用空间最大的驱动器。如果你坚持WiX模板默认定义的方式,它将属于C:(实际上,在Program Files文件夹下)。
您必须安装更新版本的Windows安装程序服务。。。
基本上,这就是它所说的——你机器上的Windows安装程序版本低于你软件包中所需的版本。如果您试图通过此更改来解决上述问题,那么它与Windows Installer版本无关。只有在使用Windows安装程序的新功能时,您才需要比默认情况下指定的版本更高的版本。
希望你能从这个简短的介绍中得出正确的结论-从教程开始。:-)
版本的问题是,当您更改产品版本时,您正在更改Windows安装程序的版本。
<Package
Id='*'
InstallerVersion='406'
Compressed='yes'
Description="Installer Number 406" />
InstallerVersion
属性应该是安装此程序包所需的Windows安装程序的最低版本。您已安装Windows Installer v4.5。当它设置为406
时,它会查找Windows Installer v4.6,坦率地说,它并不存在。将其设置为301
(版本3.1)通常就足够了。
InstallerVersion='301'
虽然你的描述属性很好,但我会发现以下内容更有意义:
Description="My Product v4.0.6 Installer"
试试这个:
<Fragment>
<Property Id="_BrowseProperty" Value="INSTALLDIR" Secure="yes"/>
<CustomAction Id="SetDataLocationDefault" Property="INSTALLDIR" Value="[WindowsVolume]$(var.Title)" />
<InstallUISequence>
<Custom Action="SetDataLocationDefault" After="CostFinalize" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="SetDataLocationDefault" After="CostFinalize" />
</InstallExecuteSequence>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLDIR" Name="$(var.Title)">
<!-- TODO: Insert your components here. -->
</Directory>
</Directory>
</Fragment>
我认为这应该有效!
不要依赖TARGETDIR
,而是使用自定义属性,如下所示:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLLOCATION" Name="SetupProject1">
<!-- TODO: Insert your components here. -->
</Directory>
</Directory>
模板取自严的回答。将INSTALLLOCATION
设置为所需的文件夹C:MyApps
,这样就可以了。