我正在尝试创建一个WiX软件包,在我的MSI安装程序之前安装.NET Framework 4.0。我使用命令行参数\l log.txt
检查了我的引导程序的日志文件,发现ExePackage::DetectCondition
总是评估为false。
我在我的Visual Studio 2010 Windows Installer XML Bootstrapper项目中包含WixNetFxExtension.dll
作为参考。
我包含NetFxExtension
命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
提供基本的捆绑框架:
<Bundle Name="RSA Bootstrapper"
...
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
...
<Chain>
<PackageGroupRef Id="NET40" />
<PackageGroupRef Id="RSA_Application" />
</Chain>
</Bundle>
...
我在片段中包含<PropertyRef Id="NETFRAMEWORK40FULL" />
,然后继续定义.NET Framework 4.0的ExePackage(NET40
):
<Fragment>
<PropertyRef Id="NETFRAMEWORK40FULL" />
<PackageGroup Id="NET40">
<ExePackage SourceFile="dotNetFx40_Full_x86_x64.exe"
Compressed="yes"
Cache="yes"
DetectCondition="NETFRAMEWORK40FULL"
InstallCommand="/norestart /passive /showrmui /ACTION=Install"
Permanent="yes"
InstallCondition="NOT NETFRAMEWORK40FULL"
Vital="yes" >
<ExitCode Value="0" Behavior="success" />
<ExitCode Value="1641" Behavior="scheduleReboot" />
<ExitCode Value="3010" Behavior="scheduleReboot" />
<ExitCode Behavior="error" /> <!-- Everything else is an error -->
</ExePackage>
...
我还检查了Visual Studio构建输出以确认WixNetFxExtension.dll
被正确引用:
C:\ Program Files(x86)\ WiX Toolset v3.7 \ bin \ Light.exe ... -ext“C:\ Program Files(x86)\ WiX Toolset v3.7 \ bin \ WixNetFxExtension.dll”
问题在于DetectCondition
属性。无论我将其设置为什么,它都会评估为false
。
认为可能无法信任NETFRAMEWORK40FULL
引用,我尝试使用此代码:
<Fragment>
<Variable Name="isInstalled"
Type="numeric"
Value="0"
Persisted="yes"
bal:Overridable="yes"/>
<util:RegistrySearch Id="FindInstallKey"
Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Install"
Result="exists"
Variable="InstallKeyExists" />
<util:RegistrySearch
Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Install"
Variable="isInstalled"
After="FindInstallKey"
Condition="InstallKeyExists = true"
Format="raw" />
</Fragment>
设置DetectCondition="isInstalled"
或DetectCondition="isInstalled = true"
始终评估为false。即使设置DetectCondition="true"
总是评估为假!
以下是我正在讨论的日志片段DetectCondition="true"
[16A0:17B4][2013-02-13T13:01:43]i001: Burn v3.7.1224.0, Windows v6.1 (Build 7601: Service Pack 1), path: C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\Bootstrapper.exe, cmdline: '/l log.txt -burn.unelevated BurnPipe.{33090847-CC78-445B-BAAA-564B840B7E8E} {38F95C6A-EC0F-4402-951B-FABFC5827CB6} 6296'
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleLog' to value 'C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\log.txt'
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleOriginalSource' to value 'C:\Users\lalic\Documents\Visual Studio 2010\Projects\RSA Preset\Bootstrapper\bin\Release\Bootstrapper.exe'
[16A0:17B4][2013-02-13T13:01:43]i052: Condition '((VersionNT = v5.1) AND (ServicePackLevel >= 3)) OR ((VersionNT = v5.2) AND (ServicePackLevel >= 2)) OR ((VersionNT = v6.0) AND (ServicePackLevel >= 1)) OR (VersionNT >= v6.1)' evaluates to true.
[16A0:17B4][2013-02-13T13:01:43]i000: Setting string variable 'WixBundleName' to value 'RSA Bootstrapper'
[16A0:17B4][2013-02-13T13:01:43]i100: Detect begin, 2 packages
[16A0:17B4][2013-02-13T13:01:43]i052: Condition 'true' evaluates to false.
[16A0:17B4][2013-02-13T13:01:43]i103: Detected related package: {D431417D-F0AC-4CFB-8E25-E27F5B8101D9}, scope: PerMachine, version: 2.1.15.0, language: 0 operation: MajorUpgrade
[16A0:17B4][2013-02-13T13:01:43]i101: Detected package: dotNetFx40_Full_x86_x64.exe, state: Absent, cached: None
[16A0:17B4][2013-02-13T13:01:43]i101: Detected package: RSA_Preset.msi, state: Absent, cached: None
[16A0:17B4][2013-02-13T13:01:43]i199: Detect complete, result: 0x0
[16A0:17B4][2013-02-13T13:02:04]i200: Plan begin, 2 packages, action: Install
[16A0:17B4][2013-02-13T13:02:04]i052: Condition 'NOT NETFRAMEWORK40FULL' evaluates to true.
具体而言,
i052: Condition 'true' evaluates to false.
并且实际上Condition 'NOT NETFRAMEWORK40FULL' evaluates to true.
即使我已经安装了.NET 4.0 Full并且可以在我的注册表中手动查找.NET 4.0条目,无论是在通常位置还是在HKLM\SOFTWARE\Wow6432Node
下(我在64位系统上)
我错过了什么吗?为什么DetectCondition不适合我?该项目编译,运行,部署有效载荷,否则工作正常。
答案 0 :(得分:7)
<PropertyRef Id="NETFRAMEWORK40FULL" />
是对MSI属性的引用,但您正在创建一个包。 Bundle具有与MSI属性不同的变量,尽管Burn本身提供了许多模仿MSI提供的变量。
也就是说,WixNetFxExtension为4.0 NetFx安装程序提供了软件包组。您可以使用简单的<PackageGroupRef Id="NetFx40Redist" />
替换所有内容。
答案 1 :(得分:3)
NETFRAMEWORK40FULL等变量是MSI变量,你不能在Bundles中使用它们。
我已成功将.NET Framework 4.0客户端版本嵌入到我的捆绑包中。条件变量从注册表中解析。
请注意DetectCondition属性中的语法"<<"
(转换为&lt;&lt;)。此页面可能有助http://wix.tramontana.co.hu/tutorial/com-expression-syntax-miscellanea/expression-syntax
<?xml version="1.0" encoding="UTF-8"?>
<Wix
xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Bundle
Name="My Program Name"
Version="1.2.0"
Manufacturer="SUSU"
UpgradeCode="some-guid">
<Chain>
<PackageGroupRef Id="Netfx4"/>
<MsiPackage Id="MyProgramInstaller" SourceFile="product.msi" Compressed="yes"/>
</Chain>
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
<bal:WixStandardBootstrapperApplication
LicenseFile="license.rtf"
ShowVersion="yes"
/>
</BootstrapperApplicationRef>
</Bundle>
<Fragment>
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Client" Value="Version"
Variable="Netfx4ClientVersion" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Client" Value="Version"
Variable="Netfx4x64ClientVersion" Win64="yes" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version"
Variable="Netfx4FullVersion" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" Value="Version"
Variable="Netfx4x64FullVersion" Win64="yes"/>
<PackageGroup Id="Netfx4">
<ExePackage
Id="Netfx4"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="c:\Downloads\dotNetFx40_Client_x86_x64.exe"
InstallCommand="/q"
DetectCondition="(Netfx4FullVersion << "4") OR (Netfx4ClientVersion << "4") OR (Netfx4x64ClientVersion << "4") OR (Netfx4x64FullVersion << "4")"
/>
</PackageGroup>
</Fragment>
</Wix>