wtorek, 5 czerwca 2012

Referencje do bibliotek kompilowanych na różne platformy (x86 i x64) .

Pracowałem nad dość dużą aplikacją, składającą się z wielu projektów zależnych od siebie.
Aplikacja była kompilowana na platformę "x86" i pięknie działała na wszystkich systemach z rodziny Windows.
Zapytacie dlaczego "x86" a nie "Any CPU"?  Aplikacja komunikowała się z inną przez COM.
I to nas zgubiło :)

W sytuacji gdy jedna aplikacja została wydana w wersji "x64" druga musiała się zaadaptować do nowej sytuacji.
Oczywiście dodanie kompilacji dla nowej platformy nie jest skomplikowaną rzeczą, ale ze zdziwieniem stwierdziłem, że po zmianie na "x64" projekt się nie kompiluje ponieważ referencje do zasobów prowadzą do  wersji 32-bitowych.

Referencje są podłączone statycznie i Visual Studio nie umożliwia sposobu ich modyfikacji z IDE.

Rozwiązaniem więc była "ręczna" edycja plików projektu (*.csproj).
Poniżej "domyślny" kod podlinkowania referencji do projektu:
 <ItemGroup>
  <Reference Include="PlatformIndependReference, Version=1.0.0.0, Culture=neutral">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\PlatformIndependReference.dll</HintPath>
  </Reference>
</ItemGroup>

Aby podłączyć referencje dla różnych platform kompilacji należy stworzyć osobne grupy zależne od platformy:
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
</ItemGroup>

W nich zamieszczamy referencje do bibliotek skompilowanych we właściwy sposób.
<ItemGroup Condition=" '$(Platform)' == 'x86' ">
  <Reference Include="ReferenceLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=x86">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\ReferenceLibrary.dll</HintPath>
  </Reference>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
  <Reference Include="ReferenceLibrary, Version=1.0.0.0, Culture=neutral, processorArchitecture=AMD64">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\ReferenceLibrary.dll</HintPath>
  </Reference>
</ItemGroup>

Minusem takiego rozwiązania jest jedynie to, że podczas kompilacji Visual Studio informuje nas, że
Warning 1 The referenced component 'ReferenceLibrary' could not be found.
ale myślę, że to można przeboleć.

Brak komentarzy:

Prześlij komentarz