[英]Including .NET installer in WiX Bundle not detecting if already installed
我使用的是WiX 3.7,我無法使用簡單的<PackageGroupRef Id =“NetFx40Web”/> bundle元素,因為它不會帶來Net FX安裝程序包,或者將它嵌入到setup.exe中。 我已經在Bundle.wxs
文件中為此創建了自己的包,但我仍然遇到了麻煩。 它似乎總是嘗試安裝.NET 4,即使機器已經安裝了.NET。
我不太確定InstallCondition和DetectCondition之間的區別。 我認為如果評估為true,則使用InstallCondition來安裝軟件包,否則將其卸載。 如何處理通常是永久性的東西=是 ,例如大多數先決條件? 我認為, 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>
這里似乎有很多問題。
聽起來根本問題是如何包含嵌入在捆綁包中的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"
。 這種差異可能會解釋您所看到的問題。
我在這個答案中使用的是.NET Framework 4.5.2。 要將.NET Framework包含為脫機安裝:
在您的Chain
包含PackageGroupRef
元素:
<Bundle> <Chain> <PackageGroupRef Id="NetFx452" /> <MsiPackage ... /> </Chain> </Bundle>
下載Microsoft .NET Framework 4.5.2(脫機安裝程序) ,並將其添加到Bootstrapper項目中。 (我把它放在一個名為“資源”的文件夾中。)
添加以下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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.