Compilation conditionnelle en fonction de la version cadre en C#
y a-t-il des symboles de préprocesseur qui permettent quelque chose comme
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
ou un autre moyen de faire ça?
5 réponses
Je ne pense pas qu'il y ait de symboles prédéfinis 'préprocesseur'. Cependant, vous pouvez réaliser ce que vous voulez comme ceci:
-
" créez différentes configurations de votre projet, une pour chaque version de CLR que vous voulez prendre en charge.
-
choisissez un symbole comme
VERSION2
,VERSION3
etc. par version CLR. -
dans chaque configuration, définissez la symbole associé et la destruction de toutes les autres.
-
utilisez ces symboles dans les blocs de compilation conditionnelle.
il n'y en a pas, mais vous pouvez fournir les vôtres.
pour ce scénario spécifique, vous pourriez vouloir encapsuler la logique dans (par exemple) une classe wrapper (lock), de sorte que vous n'ayez pas #if
dispersé à travers tout le code; Bien sûr, si vous ne faites qu'un petit verrouillage, il pourrait ne pas valoir la peine de la peine.
j'utilise différentes configurations et / ou projets pour construire pour une variété de plates - formes- i.e. protobuf-net construit pour .NET 2.0, .net 3.0, mono, CF 2.0, CF 3.5 en utilisant cette astuce. Le code a des blocs #if
basés sur différents symboles pour contrôler la logique - donc, par exemple, BinaryFormatter
n'est pas disponible sur CF, WCF
n'est disponible qu'avec .NET 3.0, Delegate.CreateDelegate
n'est pas sur CF 2.0, etc.
vous pouvez utiliser la réflexion pour vérifier dynamiquement si un certain type comme ReaderWriterLockSlim est disponible (au lieu d'utiliser le préprocesseur).
cela vous donnerait l'avantage que vous pouvez déployer une seule version de votre produit et les utilisateurs ayant (ou la mise à jour à) .NET 3.5 bénéficiera du code optimisé.
vous pouvez régler manuellement ce symbole en utilisant le commutateur /define compiler . Ensuite, vous créez différentes configurations de construction pour chaque version clr désirée.
si c'est tout ce que vous avez à faire, je suppose que vous pourrait utiliser L'environnement.Version, mais comme la solution divo , il semble laisser beaucoup de code inutile là.