Tak, możesz kierować reklamy zarówno na x86, jak i x64 z tą samą bazą kodu w tym samym projekcie. Ogólnie rzecz biorąc, wszystko będzie po prostu działać, jeśli utworzysz odpowiednie konfiguracje rozwiązań w VS.NET (chociaż P / Invoke do całkowicie niezarządzanych bibliotek DLL najprawdopodobniej będzie wymagało kodu warunkowego): elementy, które według mnie wymagają szczególnej uwagi, to:
- Odwołania do zewnętrznych zestawów zarządzanych o tej samej nazwie, ale ich własnej określonej bitowości (dotyczy to również zestawów międzyoperacyjnych COM)
- Pakiet MSI (który, jak już wspomniano, będzie musiał być przeznaczony dla x86 lub x64)
- Wszelkie niestandardowe akcje oparte na klasach Instalatora .NET w pakiecie MSI
Problemu z odwołaniem do zestawu nie można całkowicie rozwiązać w VS.NET, ponieważ pozwoli to tylko raz dodać odwołanie o danej nazwie do projektu. Aby obejść ten problem, ręcznie edytuj plik projektu (w programie VS, kliknij prawym przyciskiem myszy plik projektu w Eksploratorze rozwiązań, wybierz opcję Zwolnij projekt, a następnie kliknij ponownie prawym przyciskiem myszy i wybierz opcję Edytuj). Po dodaniu odniesienia do, powiedzmy, wersji zestawu x86, plik projektu będzie zawierał coś takiego:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Umieść ten tag Reference wewnątrz tagu ItemGroup wskazującego konfigurację rozwiązania, do którego ma zastosowanie, np .:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Następnie skopiuj i wklej cały znacznik ItemGroup i edytuj go, aby zawierał szczegóły 64-bitowej biblioteki DLL, np .:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Po ponownym załadowaniu projektu w VS.NET, okno dialogowe Odniesienie do zestawu będzie nieco zdezorientowane przez te zmiany i możesz napotkać ostrzeżenia dotyczące zestawów z niewłaściwym procesorem docelowym, ale wszystkie kompilacje będą działać dobrze.
Następnym krokiem jest rozwiązanie problemu z MSI i niestety będzie to wymagało narzędzia innego niż VS.NET: wolę do tego celu zaawansowany instalator Caphyon, ponieważ wykonuje on podstawową sztuczkę (stwórz wspólny plik MSI, a także 32-bitowy i 64-bitowe pliki MSI, a także użyj programu uruchamiającego konfigurację .EXE, aby wyodrębnić odpowiednią wersję i wykonać wymagane poprawki w czasie wykonywania) bardzo dobrze.
Prawdopodobnie możesz osiągnąć te same wyniki za pomocą innych narzędzi lub zestawu narzędzi Windows Installer XML (WiX) , ale Advanced Installer sprawia, że wszystko jest tak proste (i jest na to dość przystępne), że nigdy tak naprawdę nie szukałem alternatyw.
Jedną rzeczą, do której nadal możesz potrzebować WiX, nawet podczas korzystania z Instalatora zaawansowanego, są niestandardowe akcje .NET Installer Class. Chociaż określenie pewnych akcji, które powinny być uruchamiane tylko na niektórych platformach (odpowiednio przy użyciu warunków wykonania VersionNT64 i NOT VersionNT64) jest trywialne, wbudowane niestandardowe akcje AI będą wykonywane przy użyciu 32-bitowej struktury, nawet na maszynach 64-bitowych .
Może to zostać naprawione w przyszłej wersji, ale na razie (lub gdy używasz innego narzędzia do tworzenia plików MSI, które ma ten sam problem), możesz użyć obsługi zarządzanych akcji niestandardowych przez WiX 3.0, aby utworzyć biblioteki DLL akcji o odpowiedniej bitowości, zostanie wykonany przy użyciu odpowiedniego Framework.
Edycja: od wersji 8.1.2 Advanced Installer poprawnie obsługuje 64-bitowe akcje niestandardowe. Od czasu mojej oryginalnej odpowiedzi jego cena niestety nieco wzrosła, mimo że nadal jest bardzo dobra w porównaniu z InstallShield i podobnymi ...
Edycja: jeśli biblioteki DLL są zarejestrowane w GAC, możesz również użyć standardowych tagów referencyjnych w ten sposób (na przykład SQLite):
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
Warunek jest również zredukowany do wszystkich typów kompilacji, wydania lub debugowania i określa tylko architekturę procesora.