我在使用WiX 3.7,我无法得到简单的< PackageGroupRef Id =“NetFx40Web”/>捆绑元素工作,因为它没有带来Net FX安装程序包,或嵌入setup.exe。我已经在我的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>
Bootstrapper安装程序日志:
[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>
答案 0 :(得分:8)
这里似乎有很多问题。
听起来根本问题是如何包含嵌入在捆绑包中的NETFX安装。如果是这样,那么WixNetfxExtension
今天不支持这一点是正确的。您必须定义自己的副本,并且您的副本很接近(可能是从src\ext\NetFxExtension\wixlib
中复制的)。您需要更改以将NETFX嵌入到捆绑包中的唯一方法是将ExePackage/@Compressed
属性设置为'yes'
。或者,您可以关闭Compressed
属性,它会跟随Bundle
元素的压缩(默认为'yes'
)。
其次,DetectCondition
确定包裹是否在机器上。 Burn将根据包是否在机器上执行逻辑操作。例如,在安装过程中,如果程序包不存在,Burn将安装程序包,但如果程序包已经存在则不会执行任何操作。当然,缺席和永久包会忽略卸载请求。
第三,InstallCondition
表示是否应该在机器上安装软件包。如果它的计算结果为true,则可以安装包(如果没有并要求安装)。如果评估为false,则删除包(如果存在)。
注意:您的注册表搜索和条件与WiX工具集中用于检测NETFX的内容略有不同。以下是WiX工具集使用的NETFX检测:
<util:RegistrySearch
Id="NETFRAMEWORK40"
Variable="NETFRAMEWORK40"
Root="HKLM"
Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Install"
Result="value" />
DetectCondition
只是"NETFRAMEWORK40"
。这种差异可能会解释您所看到的问题。
答案 1 :(得分:2)
我在这个答案中使用.NET Framework 4.5.2。要将.NET Framework包含为脱机安装:
在PackageGroupRef
中加入Chain
元素:
<Bundle>
<Chain>
<PackageGroupRef Id="NetFx452" />
<MsiPackage ... />
</Chain>
</Bundle>
Download the Microsoft .NET Framework 4.5.2 (Offline Installer),并将其添加到您的Bootstrapper项目中。 (我把它放在名为&#34;资源&#34;的文件夹中。)
添加以下Fragment
:
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<PackageGroup Id="NetFx452">
<ExePackage Id="NetFx452"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe"
DetectCondition="NETFRAMEWORK45"
InstallCommand="/q /norestart" />
</PackageGroup>
</Fragment>