在我的WPF项目中,我使用了一些第三方平台特定的dll,例如如果Platform
是x86
,则该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
?
答案 0 :(得分:1)
即使csproj文件中的BootstrapperPackage
元素支持Condition
属性,也只能在编译时应用它,这可能不是您想要的。
不幸的是,在这里您将不得不修改计算机(以及所有部署此代码的计算机上)的ClickOnce Bootstrapper软件包清单。
在我的机器上,Microsoft.Visual.C++.14.0.x86
和Microsoft.Visual.C++.14.0.x64
的清单分别位于C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x86\product.xml
和C:\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"/>
相关阅读: