如何为x86和x64平台指定不同的BootstrapperPackage-s?

时间:2019-01-11 13:21:10

标签: clickonce

在我的WPF项目中,我使用了一些第三方平台特定的dll,例如如果Platformx86,则该dll的x86版本将被复制到Output文件夹中;如果平台是x64,则将是x64版本。

这些dll也需要Visual C ++ Redistributable。因此,我需要将它作为运行ClickOnce安装程序时要安装的先决条件。问题是,对于x64平台,我只需要x64版本的C ++ redist,对于x86平台,只需要x86。但是我不能只是写

<BootstrapperPackage Include="Microsoft.Visual.C++.14.0.x64" Condition="'$(Platform)' == 'x64'">
  <Visible>False</Visible>
  <ProductName>Visual C++ "14" Runtime Libraries %28x64%29</ProductName>
  <Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Visual.C++.14.0.x86" Condition="'$(Platform)' == 'x86'">
  <Visible>False</Visible>
  <ProductName>Visual C++ "14" Runtime Libraries %28x86%29</ProductName>
  <Install>true</Install>
</BootstrapperPackage>

因为<BootstrapperPackage>标签不支持Condition属性。

由于Visual Studio会转动,因此不可能在其中包含<ItemGroup>的多个<BootstrapperPackage>标签中写入

<ItemGroup>
  <!--common BootstrapperPackages-->
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
  <!--BootstrapperPackages for x86-->
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
  <!--BootstrapperPackages for x64-->
</ItemGroup>

进入

<ItemGroup />
<ItemGroup Condition="'$(Platform)' == 'x86'" />
<ItemGroup Condition="'$(Platform)' == 'x64'">
  <!--All BootstrapperPackages: common, for x86 and for x64-->
</ItemGroup>

我不能同时包含两个软件包,因为在x86系统上x64 C ++的安装程序将显示错误,并且在x64系统上将安装x86 C ++,但不会使用。

如何克服这些困难并为不同的平台指定不同的BootstrapperPackage

1 个答案:

答案 0 :(得分:1)

即使csproj文件中的BootstrapperPackage元素支持Condition属性,也只能在编译时应用它,这可能不是您想要的。

不幸的是,在这里您将不得不修改计算机(以及所有部署此代码的计算机上)的ClickOnce Bootstrapper软件包清单。

在我的机器上,Microsoft.Visual.C++.14.0.x86Microsoft.Visual.C++.14.0.x64的清单分别位于C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x86\product.xmlC:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x64\product.xml处。 (根据您的操作系统,它们也可能位于C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages或Windows SDK的任何其他版本中。发布应用程序时的构建日志可能会提及从中复制先决条件的位置。)

在这些文件中,您将找到类似这样的部分(摘自我的vcredist_x64清单)

  <!-- These checks determine whether the package is to be installed -->
  <InstallConditions>
    <BypassIf Property="VCRedistInstalled" Compare="ValueGreaterThanOrEqualTo" Value="3"/>
    <!-- Block install if user does not have admin privileges -->
    <FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/>
    <!-- Block install on any platform other than x64 -->
    <FailIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="AMD64" String="InvalidOS"/>
    <!-- Block install on Vista or below -->
    <FailIf Property="VersionNT" Compare="VersionLessThan" Value="6.00" String="InvalidPlatformWinNT"/>
  </InstallConditions>

此行导致错误:

    <FailIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="AMD64" String="InvalidOS"/>

修改为

    <BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="AMD64"/>

跳过前提条件而不是失败。 vcredist_x86配置为可同时安装在32位和64位操作系统上,如果要强制仅将其安装在32位系统上,请在其InstallConditions

中添加以下行
    <BypassIf Property="ProcessorArchitecture" Compare="ValueEqualTo" Value="AMD64"/>

相关阅读: