使用wix刻录下载vcruntime140的Web下载

时间:2017-03-10 14:39:02

标签: wix burn

如果需要,我想使用WiX引导程序burn自动下载并安装vcruntime140软件包(Visual C ++ Redistributable for Visual Studio 2015)。

对于.NET框架来说,这很容易实现:

<Chain>
  <PackageGroupRef Id="NetFx452Web"/>
  ...
</Chain>

但是我找不到vcruntime软件包的等价物。 (这是因为没有,或者我只是在Google中输入了错误的关键字?)

为了清楚起见:我不想在我的安装程序中包含该软件包。它必须是网络下载。

2 个答案:

答案 0 :(得分:2)

redist没有针对.net的PackageGroupRef。

但还有其他3种选择:

  1. 在链中添加redist exe。 (对你不好)
  2. 在你的一个msi中使用redist c++ merge module
  3. 尝试以.net的身份编写自己的web download。这是.net网络下载的示例。完整文件可以在wix的源代码中找到,名称为“NetFx46.wxs”
  4.            
    <Fragment>
     <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
     <Property Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Secure="yes" />
     <SetProperty Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Value="1" After="AppSearch">
       WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx46MinRelease)"
     </SetProperty>
    </Fragment>
    
    <Fragment>
    <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
    <WixVariable Id="WixMbaPrereqPackageId" Value="NetFx46Web" />
    <WixVariable Id="WixMbaPrereqLicenseUrl" Value="http://go.microsoft.com/fwlink/?LinkID=558772" />
    <WixVariable Id="NetFx46WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx46MinRelease)" Overridable="yes" />
    <WixVariable Id="NetFx46WebInstallCondition" Value="" Overridable="yes" />
    <WixVariable Id="NetFx46WebPackageDirectory" Value="redist\" Overridable="yes" />
    
    <PackageGroup Id="NetFx46Web">
      <ExePackage
          InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
          RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
          UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
          PerMachine="yes"
          DetectCondition="!(wix.NetFx46WebDetectCondition)"
          InstallCondition="!(wix.NetFx46WebInstallCondition)"
          Id="NetFx46Web"
          Vital="yes"
          Permanent="yes"
          Protocol="netfx4"
          DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=560371"
          LogPathVariable="NetFx46FullLog"
          Compressed="no"
          Name="!(wix.NetFx46WebPackageDirectory)NDP46-KB3045557-x86-x64-AllOS-ENU.exe">
        <RemotePayload 
          CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" 
          CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" 
          Description="Microsoft .NET Framework 4.6 Setup" 
          Hash="480CA134B9E3F2437DF10719D5A8C77DDEC0A4F1" 
          ProductName="Microsoft .NET Framework 4.6" 
          Size="1497400" 
          Version="4.6.81.0" />
      </ExePackage>
    </PackageGroup>
    

答案 1 :(得分:2)

仅供记录,这是我的最终解决方案。

右键单击Visual Studio中的引导程序项目引用,并添加对WixUtilExtension的引用。

xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"作为属性添加到顶级Wix元素。

添加到<Chain>元素:

<PackageGroupRef Id="vcredist_vc140"/>

添加为<Wix>元素的子项:

<Fragment>
  <!-- vcredist 2015 x86 -->
  <util:ProductSearch
      Id="VCREDIST_140_x86"
      UpgradeCode="65E5BD06-6392-3027-8C26-853107D3CF1A"
      Result="version"
      Variable="VCREDIST_140_x86"/>
  <PackageGroup Id="vcredist_vc140">
    <ExePackage
        Id="vc140"
        Cache="yes"
        PerMachine="yes"
        Permanent="yes"
        Vital="yes"
        Compressed="no"
        DownloadUrl="http://go.microsoft.com/fwlink/?LinkID=615459"
        Name="vcredist_vc140"
        InstallCommand="/quiet /norestart"
        DetectCondition="(VCREIST_140_x86 &gt;= v14.0.24215)">
      <RemotePayload
          Description="Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215"
          ProductName="Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215"
          Size="14456872"
          Version="14.0.24215.1"
          Hash="72211BD2E7DFC91EA7C8FAC549C49C0543BA791B" />
    </ExePackage>
  </PackageGroup>
</Fragment>

UpgradeCode来自this answer,具体针对vcredist安装程序的v14.0.24215。这就是引导程序决定它是否已经安装的方式。

Compressed="no"告诉安装人员不要将文件包含在安装程序本身中(因为我们要从网上下载)。

DownloadUrlthis answer可下载安装程序的直接网址。

RemotePayload Description是安装程序的描述资源的文本,同样是ProductName。 (看来文本必须与资源中的文本匹配。ProductName是引导程序进度对话框中显示的说明。)

Size是以字节为单位的大小。 使用Powershell命令Hash找到get-filehash -algorithm SHA1 .\vc_redist.x86.exe

我希望这有助于某人。