【发布时间】:2013-05-04 04:14:20
【问题描述】:
我在 WiX 3.7 上,我无法让简单的 Bundle.wxs 文件中为此创建了自己的包,但我仍然遇到了麻烦。似乎总是尝试安装 .NET 4,即使机器已经安装了 .NET。
我不太确定 InstallCondition 和 DetectCondition 之间的区别。如果评估为真,我认为 InstallCondition 用于安装包,否则将其卸载。这如何处理通常permanent=yes 的东西,例如大多数先决条件?我认为 DetectCondition 几乎相反,因为它检查它是否已经在系统上,如果是,则不安装它。
下面是我在 Visual Studio WiX Bootstrapper 项目中的完整 Bundle.wxs 文件。我正在尝试查看 .NET 4.0 注册表项之外的注册表和范围。如果它存在,那么我不想安装 .NET 4。如果它不存在,则安装它。但是,这不起作用,它总是尝试安装 .NET。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle
Name="MyProgramBootstrapper"
Version="1.0.0.0"
Manufacturer="Microsoft"
UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<PackageGroupRef Id="Netfx4Full"/>
<MsiPackage
Id="MyProgramInstaller"
SourceFile="$(var.MyProgramInstaller.TargetPath)"
Compressed="no"/>
</Chain>
</Bundle>
<Fragment>
<Property Id="NET40_FULL_INSTALL_32">
<RegistrySearch
Id ="SearchNet40_32bit"
Root="HKLM"
Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
Name="Version"
Type ="raw"/>
</Property>
<Property
Id="NET40_FULL_INSTALL_64">
<RegistrySearch
Id ="SearchNet40_64bit"
Root="HKLM"
Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
Name="Version"
Type ="raw"
Win64="yes" />
</Property>
<WixVariable
Id="WixMbaPrereqPackageId"
Value="Netfx4Full" />
<WixVariable
Id="WixMbaPrereqLicenseUrl"
Value="NetfxLicense.rtf" />
<PackageGroup
Id="Netfx4Full">
<ExePackage
Id="Netfx4Full"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
DetectCondition="NET40_FULL_INSTALL_32 OR NET40_FULL_INSTALL_64"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
</PackageGroup>
</Fragment>
</Wix>
引导程序安装程序日志:
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: Netfx4Full, invalid payload: Netfx4Full, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i052: Condition 'NETFRAMEWORK40' evaluates to false.
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: MyInstaller, invalid payload: f4832BA0972BDE9B6FA8A19FBB614A7BA, reason: 0x80070570
[010C:2FB0][2013-05-10T12:07:07]i101: Detected package: Netfx4Full, state: Absent, cached: Partial
更新,解决方案。我使用内置的 WiX RegistrySearch 来确定它是否已安装。我必须在我的 Bundle 项目中引用 WixUtilExtension.dll。这是更新后的 Bundle.wxs:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
>
<Bundle
Name="MyProgramBootstrapper"
Version="1.0.0.0"
Manufacturer="Microsoft"
UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<PackageGroupRef Id="Netfx4Full"/>
<!-- TODO: Define the list of chained packages. -->
<!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
<MsiPackage
Id="MyProgramInstaller"
SourceFile="$(var.MyProgramInstaller.TargetPath)"
Compressed="no" />
</Chain>
</Bundle>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup
Id="Netfx4Full">
<ExePackage
Id="Netfx4FullExe"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe"
InstallCommand="/q /norestart /ChainingPackage FullX64Bootstrapper"
DetectCondition="NETFRAMEWORK40"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
</PackageGroup>
</Fragment>
</Wix>
【问题讨论】:
-
如果我正确阅读了您的问题,我认为您的问题的标题具有误导性。问题不在于
WixNetfxExtension无法正常工作。问题是您今天想做WixNetfxExtension不支持的事情。对其他人来说更具描述性的标题可能是:“如何将 .NET Framework 压缩到一个 Bundle 中”。如果我在下面的回答完全错误,请随意忽略此评论。 :) -
@RobMensching,正确,标题具有误导性。我可以将安装程序松散/相邻包含在 exe 中,这就是我想要的。但是,我的条件无法检测 .NET 是否已安装,我不知道为什么。
-
与其在问题中添加答案,不如将其添加为答案。 Stackoverflow 非常支持这一点。 (如果不阅读整个内容而不是浏览实际答案,很难看到问题中有嵌入的答案)
标签: wix bootstrapper wix3.7