Как указать разные BootstrapperPackage-s для платформ x86 и x64? - PullRequest
0 голосов
/ 11 января 2019

В моем проекте WPF я использую некоторые сторонние dll для платформы, например если Platform равно x86, то x86-версии этих dll копируются в папку Output, а если платформа x64, то x64-версии.

Для этих библиотек также требуется распространяемый Visual C ++. Поэтому мне нужно, чтобы он был предварительным условием для установки при запуске установки ClickOnce. Проблема в том, что мне нужна только x64 версия C ++ redist для платформы x64 и 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.

Также невозможно написать несколько тегов <ItemGroup> с <BootstrapperPackage> внутри, потому что Visual Studio превращается

<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 s для разных платформ?

1 Ответ

0 голосов
/ 22 января 2019

Даже если элемент BootstrapperPackage в файле csproj поддерживает атрибут 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"/>

Связанные чтения:

...