Compilazione condizionale a seconda della versione del framework in C #
-
03-07-2019 - |
Domanda
Esistono simboli del preprocessore che consentono qualcosa di simile
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
o un altro modo per farlo?
Soluzione
Non credo che ci siano simboli "preprocessore" predefiniti. Tuttavia puoi ottenere ciò che desideri in questo modo:
-
Crea diverse configurazioni del tuo progetto, una per ogni versione di CLR che desideri supportare.
-
Scegli un simbolo come
VERSION2
,VERSION3
ecc. per versione CLR. -
In ogni configurazione, definire un simbolo associato ad esso e annullare la definizione di tutti gli altri.
-
Usa questi simboli nei blocchi di compilazione condizionale.
Altri suggerimenti
Non è presente alcun built-in, ma è possibile fornire il proprio.
Per questo scenario specifico, potresti voler incapsulare la logica in (ad esempio) una classe wrapper (blocco), in modo da non avere #if
sparsi in tutto il codice; ovviamente, se stai solo facendo un piccolo blocco, potrebbe non valere la pena.
Uso diverse configurazioni e / o progetti per creare una varietà di piattaforme, ad esempio protobuf- net costruisce per .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 usando questo trucco. Il codice ha blocchi #if
basati su simboli diversi per controllare la logica - quindi, ad esempio, BinaryFormatter
non è disponibile su CF, WCF
è disponibile solo con .NET 3.0, Delegate.CreateDelegate
non è su CF 2.0, ecc.
È possibile utilizzare reflection per verificare in modo dinamico se un determinato tipo come ReaderWriterLockSlim è disponibile (anziché utilizzare il preprocessore).
Questo ti darebbe il vantaggio di poter distribuire una singola versione del tuo prodotto e gli utenti che hanno (o aggiornano a) .NET 3.5 beneficeranno del codice ottimizzato.
È possibile impostare manualmente questo simbolo utilizzando / define switch di compilazione . Quindi si creano diverse configurazioni di build per ciascuna versione clr desiderata.
Se è tutto ciò che dovevi fare, suppongo che potresti utilizzare Environment.Version, ma come di divo , sembra lasciare un sacco di codice inutile lì.