2 votes

Comment spécifier des BootstrapperPackage-s différents pour les plateformes x86 et x64 ?

Dans mon projet WPF, j'utilise quelques dlls tiers spécifiques à la plate-forme, par exemple si Platform es x86 puis les versions x86 de ces dlls sont copiées dans le fichier Output et si la plate-forme est x64 alors les versions x64 sont.

Ces dlls nécessitent également Visual C++ Redistributable. J'ai donc besoin qu'il s'agisse d'un prérequis à installer lors de l'exécution de l'installation de ClickOnce. Le problème est que je n'ai besoin que de x64 version de C++ redist pour la plate-forme x64, et x86 pour la plate-forme x86. Mais je ne peut pas écrivez juste

<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>

parce que <BootstrapperPackage> ne prend pas en charge Condition attribut.

Il est également impossible d'écrire plusieurs <ItemGroup> tags avec <BootstrapperPackage> à l'intérieur de ceux-ci parce que Visual Studio transforme

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

en

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

Je ne peux pas inclure les deux paquets, car sur les systèmes x86, l'installateur de x64 C++ affichera une erreur, et sur les systèmes x64, x86 C++ sera installé mais ne sera pas utilisé.

Comment puis-je surmonter ces difficultés et spécifier différents BootstrapperPackage pour différentes plateformes ?

1voto

Vache Points 13219

Même si le BootstrapperPackage dans le fichier csproj a pris en charge l'élément Condition il ne serait appliqué qu'au moment de la compilation, ce qui n'est probablement pas ce que vous souhaitez.

Malheureusement, vous allez devoir modifier le manifeste du paquet ClickOnce Bootstrapper sur votre machine (et sur toutes les machines qui déploient ce code).

Sur ma machine, les manifestes pour Microsoft.Visual.C++.14.0.x86 y Microsoft.Visual.C++.14.0.x64 sont situés à C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x86\product.xml y C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\vcredist_x64\product.xml respectivement. (Ils peuvent aussi être dans C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages ou toute autre version du SDK Windows en fonction de votre système d'exploitation. Le journal de construction lorsque vous publiez votre application mentionne probablement d'où il copie le prérequis).

Dans ces fichiers, vous trouverez une section comme celle-ci (tirée de mon manifeste 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>

Cette ligne provoque l'erreur :

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

Modifiez-le pour

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

pour ignorer le prérequis au lieu d'échouer. Le vcredist_x86 est configuré pour être installé sur les OS 32 et 64 bits, si vous voulez le forcer à être installé uniquement sur les systèmes 32 bits, ajoutez la ligne suivante dans son fichier InstallConditions

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

Lecture connexe :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X