2016-05-23 22 views
5

Sto scrivendo un'applicazione C# utilizzando Visual Studio 2015. Questa applicazione è destinata a "Qualsiasi CPU" (senza l'opzione "Prefer 32-bit" abilitata), il che significa che l'applicazione viene compilata su una singola destinazione di build che verrà eseguita a 32 bit modalità su sistemi operativi a 32 bit e modalità a 64 bit su sistemi operativi a 64 bit.Come copiare un file in Visual Studio in base all'architettura del sistema operativo dello sviluppatore?

Questa applicazione richiede che una determinata DLL nativa venga copiata nella relativa cartella di output (ad esempio, la cartella bin/Debug o bin/Release). Esistono versioni x86 e x64 separate di questa DLL e quella corretta deve essere copiata nella cartella di output in base al sistema operativo dello sviluppatore.

Finora ho capito che io posso copiare i file nella cartella di output condizionale con l'aggiunta di qualcosa di simile al seguente al mio Csproj file:

<ItemGroup Condition="MY CONDITION HERE"> 
    <Content Include="MyNativeLib.dll"> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

Quindi la mia domanda è, come faccio scrivere una condizione equivalente a "il sistema operativo dello sviluppatore è x86" o "... x64"?

(Per essere super chiaro, io sono non chiedendo come copiare un file condizionalmente sul bersaglio piattaforma di costruzione, che nel mio caso è sempre "Qualsiasi CPU". Mi sto chiedendo come copiare un file in modo condizionale a seconda dell'architettura del sistema operativo su cui è in esecuzione Visual Studio.

+0

Lo farei correttamente in un evento di post-produzione. –

+0

@ AllanS.Hansen Sì, questo è stato il mio primo istinto (uso già post-build per copiare un sacco di altri file); Non sono riuscito a trovare alcun consiglio sulla copia dei file * condizionalmente * negli eventi post-build, non condizionata all'architettura del sistema operativo. Se qualcuno può dirmi come farlo in un evento post-compilazione, sarebbe accettabile al 100%! –

+0

Dai un'occhiata a questo: http://stackoverflow.com/questions/3832552/condially-use-32-64-bit-reference-when-building-in-visual-studio – Alex

risposta

1

Grazie a un paio di commenti utili alla domanda originale di cui sopra che mi ha indirizzato nella giusta direzione, ho capito come risolvere questo:

Ho deciso di copiare il file in un evento post-build e ho utilizzato i comandi di script batch per verificare le variabili di ambiente PROCESSOR_ARCHITECTURE e PROCESSOR_ARCHITEW6432. (. Maggiori informazioni su queste variabili here)

Ecco un esempio di come fare questo negli eventi-costruire pubblicare:

set isX64=FALSE 
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" set isX64=TRUE 
if "%PROCESSOR_ARCHITEW6432%"=="AMD64" set isX64=TRUE 
if "%isX64%"=="TRUE" (
    echo "Copying x64 dependencies..." 
    copy "$(ProjectDir)Dependencies\x64\MyNativeLib.dll" "$(TargetDir)" 
) ELSE (
    echo "Copying x86 dependencies..." 
    copy "$(ProjectDir)Dependencies\x86\MyNativeLib.dll" "$(TargetDir)" 
) 

Presumibilmente ho anche possibile utilizzare queste variabili di ambiente nel file Csproj come ho ho pensato di fare nella domanda originale, ma farlo nell'evento post-build mi è sembrato un po 'più facile e chiaro, e stavo già usando post-build per copiare altri file.

Problemi correlati