Compilación condicional según la versión del framework en C #
-
03-07-2019 - |
Pregunta
¿Hay algún símbolo de preprocesador que permita algo como
#if CLR_AT_LEAST_3.5
// use ReaderWriterLockSlim
#else
// use ReaderWriterLock
#endif
o alguna otra forma de hacer esto?
Solución
No creo que haya símbolos predefinidos de 'preprocesador'. Sin embargo, puede lograr lo que quiere de esta manera:
-
Cree diferentes configuraciones de su proyecto, una para cada versión de CLR que desee admitir.
-
Elija un símbolo como
VERSION2
,VERSION3
etc. por versión CLR. -
En cada configuración, defina un símbolo asociado con él y defina todos los demás.
-
Utilice estos símbolos en bloques de compilación condicional.
Otros consejos
No hay ninguno incorporado, pero puedes suministrar el tuyo.
Para este escenario específico, es posible que desee encapsular la lógica en (por ejemplo) una clase de envoltura (bloqueo), para que no tenga #if
repartido por todo el código; por supuesto, si solo está haciendo un pequeño bloqueo, puede que no valga la pena.
Utilizo diferentes configuraciones y / o proyectos para compilar para una variedad de plataformas, es decir, protobuf- net construye para .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 usando este truco. El código tiene bloques #if
basados ??en diferentes símbolos para controlar la lógica, por lo que, por ejemplo, BinaryFormatter
no está disponible en CF, WCF
está solo disponible con .NET 3.0, Delegate.CreateDelegate
no está en CF 2.0, etc.
Puede utilizar la reflexión para comprobar dinámicamente si un tipo determinado como ReaderWriterLockSlim está disponible (en lugar de usar el preprocesador).
Esto le brindaría la ventaja de que puede implementar una versión única de su producto y los usuarios que tengan (o actualicen) a .NET 3.5 se beneficiarán con el código optimizado.
Puede configurar este símbolo manualmente usando el / define el conmutador del compilador . Luego crea diferentes configuraciones de compilación para cada versión de clr deseada.
Si eso es todo lo que necesitas hacer, supongo que podrías usar Environment.Version, pero como , la solución que depende de on-the-framework-version-in-c # 408923, parece que deja un montón de códigos innecesarios allí.