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?

23
demandé sur Brian Tompsett - 汤莱恩 2009-01-03 14:03:34

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:

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

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

  3. dans chaque configuration, définissez la symbole associé et la destruction de toutes les autres.

  4. utilisez ces symboles dans les blocs de compilation conditionnelle.

21
répondu Frederick The Fool 2013-12-02 16:59:10

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.

5
répondu Marc Gravell 2009-01-03 11:24:38

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é.

4
répondu Dirk Vollmar 2009-01-03 11:13:55

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.

2
répondu driAn 2009-01-03 11:10:48

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à.

1
répondu Lucas Jones 2017-05-23 11:58:53