Compilation conditionnelle selon la version du framework en C #

Y at-il des symboles de préprocesseur qui permettent quelque chose comme

#if CLR_AT_LEAST_3.5 // use ReaderWriterLockSlim #else // use ReaderWriterLock #endif 

ou une autre façon de faire ça?

Je ne pense pas qu’il y ait de symboles prédéfinis de «préprocesseur». Cependant, vous pouvez réaliser ce que vous voulez comme ceci:

  1. Créez différentes configurations de votre projet, une pour chaque version de CLR que vous souhaitez prendre en charge.

  2. Choisissez un symbole comme VERSION2 , VERSION3 etc. par version CLR.

  3. Dans chaque configuration, définissez le symbole qui lui est associé et définissez tous les autres.

  4. Utilisez ces symboles dans des blocs de compilation conditionnels.

Il n’y en a pas intégré, mais vous pouvez fournir le vôtre.

Pour ce scénario spécifique, vous souhaiterez peut-être encapsuler la logique dans (par exemple) une classe wrapper (lock), afin de ne pas avoir #if dispersé dans tout le code; Bien sûr, si vous ne faites que verrouiller un peu, cela ne vaut peut-être pas la peine.

J’utilise différentes configurations et / ou projets pour créer différentes plates-formes – par exemple, les versions de protobuf-net pour .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 utilisant cette astuce. Le code contient des blocs #if basés sur différents symboles pour contrôler la logique. Ainsi, par exemple, BinaryFormatter n’est pas disponible sur CF, WCF n’est disponible que sur .NET 3.0, Delegate.CreateDelegate n’est pas sur CF 2.0, etc.

Vous pouvez utiliser la reflection pour vérifier de manière dynamic si un certain type tel que ReaderWriterLockSlim est disponible (au lieu d’utiliser le préprocesseur).

Cela vous donnerait l’avantage de pouvoir déployer une version unique de votre produit et que les utilisateurs disposant de (ou mettant à jour) .NET 3.5 bénéficieront du code optimisé.

Vous pouvez définir manuellement ce symbole à l’aide du commutateur / define du compilateur . Ensuite, vous créez différentes configurations de construction pour chaque version de clé souhaitée.

Si c’est tout ce que vous aviez à faire, je suppose que vous pourriez utiliser Environment.Version, mais comme la solution de divo , il semble y laisser beaucoup de code inutile.