gpt4 book ai didi

wix - 在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装

转载 作者:行者123 更新时间:2023-12-02 18:39:13 28 4
gpt4 key购买 nike

我使用的是 WiX 3.7,我无法让简单的 捆绑元素正常工作,因为它不会带来 Net FX 安装程序包,也不会将其嵌入到安装程序.exe。我已在 Bundle.wxs 文件中为此创建了自己的包,但仍然遇到问题。即使机器已经安装了 .NET,它似乎总是尝试安装 .NET 4。

我不太确定InstallConditionDetectCondition之间的区别。我认为InstallCondition用于如果评估为真则安装软件包,否则卸载它。对于通常永久=是的事物(例如大多数先决条件),这如何工作?我认为 DetectCondition 几乎是相反的,因为它检查它是否已经在系统上,如果是,则不安装它。

下面是我的完整 Bundle.wxs 文件,该文件位于 Visual Studio WiX Bootstrapper 项目中。我正在尝试查看注册表,并且存在超出 .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>

Bootstrap 安装程序日志:

[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
<小时/>

更新,并提供解决方案。我使用内置的 WiXRegistrySearch 来确定它是否已安装。我必须在我的 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 安装嵌入到您的 bundle 中。如果是这样,那么您是正确的,WixNetfxExtension 目前不支持这一点。您必须定义自己的副本,并且您的副本很接近(可能是从 src\ext\NetFxExtension\wixlib 中复制的)。要将 NETFX 嵌入到 bundle 中,您唯一需要更改的是将 ExePackage/@Compressed 属性设置为 'yes'。或者,您可以关闭 Compressed 属性,它将遵循 Bundle 元素的压缩(默认为 'yes')。

其次,DetectCondition 确定包是否在计算机上。 Burn 将根据包是否在计算机上执行逻辑操作。例如,在安装过程中,如果软件包不存在,Burn 将安装该软件包,但如果软件包已存在,则不会执行任何操作。当然,不存在的和永久的软件包会忽略卸载请求。

第三,InstallCondition 指示是否应在计算机上安装该软件包。如果评估结果为 true,则可以安装该软件包(如果不存在并请求安装)。如果评估结果为 false,则删除该包(如果存在)。

Note: your registry search and conditions are a little different from what is used in the WiX toolset to detect NETFX. The following is the detection for NETFX the WiX toolset uses:

<util:RegistrySearch
Id="NETFRAMEWORK40"
Variable="NETFRAMEWORK40"
Root="HKLM"
Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Install"
Result="value" />

The DetectCondition is then just "NETFRAMEWORK40". That difference might explain the issues you are seeing.

关于wix - 在 WiX Bundle 中包含 .NET 安装程序未检测是否已安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465971/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com