Sì, puoi scegliere come target sia x86 che x64 con la stessa base di codice nello stesso progetto. In generale, le cose funzioneranno semplicemente se crei le giuste configurazioni della soluzione in VS.NET (anche se P / Invoke a DLL completamente non gestite molto probabilmente richiederà un codice condizionale): gli elementi che ho riscontrato richiedono particolare attenzione sono:
- Riferimenti ad assembly gestiti esterni con lo stesso nome ma con il proprio bitness specifico (questo vale anche per gli assembly di interoperabilità COM)
- Il pacchetto MSI (che, come è già stato notato, dovrà scegliere come target x86 o x64)
- Qualsiasi azione personalizzata basata su classi .NET Installer nel pacchetto MSI
Il problema del riferimento all'assembly non può essere risolto interamente all'interno di VS.NET, poiché consentirà di aggiungere un riferimento con un determinato nome a un progetto solo una volta. Per ovviare a questo problema, modifica manualmente il file di progetto (in VS, fai clic con il pulsante destro del mouse sul file di progetto in Esplora soluzioni, seleziona Scarica progetto, quindi fai nuovamente clic con il pulsante destro del mouse e seleziona Modifica). Dopo aver aggiunto un riferimento, ad esempio, alla versione x86 di un assembly, il file di progetto conterrà qualcosa come:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
Avvolgi il tag di riferimento all'interno di un tag ItemGroup che indica la configurazione della soluzione a cui si applica, ad esempio:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
Quindi, copia e incolla l'intero tag ItemGroup e modificalo per contenere i dettagli della tua DLL a 64 bit, ad esempio:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
Dopo aver ricaricato il progetto in VS.NET, la finestra di dialogo di riferimento dell'assembly sarà un po 'confusa da queste modifiche e potresti incontrare alcuni avvisi sugli assembly con il processore di destinazione sbagliato, ma tutte le tue build funzioneranno perfettamente.
Risolvere il problema MSI è accanto, e purtroppo questo sarà un apposito strumento non-VS.NET: preferisco di Caphyon Installer avanzata a tal fine, come si tira fuori il trucco di base coinvolti (creare un MSI comune, così come a 32 bit e MSI specifici a 64 bit e utilizzare un programma di avvio di installazione .EXE per estrarre la versione corretta ed eseguire le correzioni richieste in fase di esecuzione) molto, molto bene.
Probabilmente puoi ottenere gli stessi risultati utilizzando altri strumenti o il set di strumenti XML di Windows Installer (WiX) , ma Advanced Installer rende le cose così semplici (ed è abbastanza conveniente) che non ho mai veramente guardato alle alternative.
Una cosa per cui potresti comunque richiedere WiX, anche quando usi Advanced Installer, è per le tue azioni personalizzate di .NET Installer Class. Sebbene sia banale specificare determinate azioni che dovrebbero essere eseguite solo su determinate piattaforme (utilizzando rispettivamente le condizioni di esecuzione VersionNT64 e NOT VersionNT64), le azioni personalizzate AI integrate verranno eseguite utilizzando il Framework a 32 bit, anche su macchine a 64 bit .
Questo potrebbe essere risolto in una versione futura, ma per ora (o quando si utilizza uno strumento diverso per creare i propri MSI con lo stesso problema), è possibile utilizzare il supporto di azioni personalizzate gestite di WiX 3.0 per creare DLL di azioni con il bit corretto che verrà eseguito utilizzando il Framework corrispondente.
Modifica: a partire dalla versione 8.1.2, Advanced Installer supporta correttamente le azioni personalizzate a 64 bit. Dalla mia risposta originale, il suo prezzo è aumentato un po ', sfortunatamente, anche se è ancora estremamente conveniente rispetto a InstallShield e simili ...
Modifica: se le tue DLL sono registrate nella GAC, puoi anche utilizzare i tag di riferimento standard in questo modo (SQLite come esempio):
<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>
La condizione è ridotta anche a tutti i tipi di build, release o debug e specifica solo l'architettura del processore.