Ya, Anda dapat menargetkan x86 dan x64 dengan basis kode yang sama dalam proyek yang sama. Secara umum, semuanya akan Berfungsi jika Anda membuat konfigurasi solusi yang tepat di VS.NET (meskipun P / Invoke ke DLL yang sepenuhnya tidak dikelola kemungkinan besar akan memerlukan beberapa kode bersyarat): item yang menurut saya memerlukan perhatian khusus adalah:
- Referensi ke rakitan yang dikelola di luar dengan nama yang sama tetapi bitness spesifiknya sendiri (ini juga berlaku untuk rakitan interop COM)
- Paket MSI (yang, seperti yang telah disebutkan, perlu menargetkan x86 atau x64)
- Tindakan berbasis Kelas Penginstal .NET kustom apa pun dalam paket MSI Anda
Masalah referensi perakitan tidak dapat diselesaikan sepenuhnya dalam VS.NET, karena ini hanya akan memungkinkan Anda untuk menambahkan referensi dengan nama tertentu ke proyek satu kali. Untuk mengatasi ini, edit file proyek Anda secara manual (di VS, klik kanan file proyek Anda di Solution Explorer, pilih Unload Project, lalu klik kanan lagi dan pilih Edit). Setelah menambahkan referensi ke, katakanlah, versi x86 dari sebuah rakitan, file proyek Anda akan berisi sesuatu seperti:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Bungkus tag Referensi itu di dalam tag ItemGroup yang menunjukkan konfigurasi solusi yang diterapkan padanya, misalnya:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Kemudian, salin dan tempel seluruh tag ItemGroup, dan edit untuk memuat detail DLL 64-bit Anda, misalnya:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Setelah memuat ulang proyek Anda di VS.NET, dialog Referensi Perakitan akan sedikit bingung dengan perubahan ini, dan Anda mungkin menemukan beberapa peringatan tentang rakitan dengan prosesor target yang salah, tetapi semua build Anda akan berfungsi dengan baik.
Memecahkan masalah MSI adalah selanjutnya, dan sayangnya ini akan membutuhkan alat non-VS.NET: Saya lebih suka Caphyon's Advanced Installer untuk tujuan itu, karena ini melakukan trik dasar yang terlibat (buat MSI umum, serta 32-bit dan MSI khusus 64-bit, serta menggunakan peluncur penyiapan .EXE untuk mengekstrak versi yang tepat dan melakukan perbaikan yang diperlukan saat runtime) dengan sangat, sangat baik.
Anda mungkin dapat mencapai hasil yang sama dengan menggunakan alat lain atau toolset Windows Installer XML (WiX) , tetapi Advanced Installer membuat segalanya menjadi sangat mudah (dan cukup terjangkau) sehingga saya tidak pernah benar-benar melihat alternatif.
Satu hal yang mungkin masih Anda perlukan untuk WiX, bahkan saat menggunakan Penginstal Lanjutan, adalah untuk tindakan kustom Kelas Penginstal .NET. Meskipun sepele untuk menentukan tindakan tertentu yang hanya boleh dijalankan pada platform tertentu (masing-masing menggunakan kondisi eksekusi VersionNT64 dan BUKAN VersionNT64), tindakan kustom AI bawaan akan dijalankan menggunakan Framework 32-bit, bahkan pada mesin 64-bit. .
Ini mungkin diperbaiki di rilis mendatang, tetapi untuk saat ini (atau saat menggunakan alat yang berbeda untuk membuat MSI Anda yang memiliki masalah yang sama), Anda dapat menggunakan dukungan tindakan kustom terkelola WiX 3.0 untuk membuat tindakan DLL dengan bitness yang tepat yang akan dieksekusi menggunakan Kerangka yang sesuai.
Sunting: mulai versi 8.1.2, Penginstal Lanjutan dengan benar mendukung tindakan kustom 64-bit. Sejak jawaban asli saya, harganya naik cukup sedikit, sayangnya, meskipun nilainya masih sangat bagus jika dibandingkan dengan InstallShield dan sejenisnya ...
Edit: Jika DLL Anda terdaftar di GAC, Anda juga dapat menggunakan tag referensi standar dengan cara ini (SQLite sebagai contoh):
<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>
Kondisi tersebut juga dikurangi menjadi semua jenis build, rilis atau debug, dan hanya menentukan arsitektur prosesor.