que programacion lenguaje historia caracteristicas c# c-preprocessor conditional-compilation

programacion - c# que es



Compilación condicional según la versión del marco en C# (5)

No creo que haya ningún símbolo preprocesador predefinido. Sin embargo, puedes lograr lo que quieres así:

  1. Cree diferentes configuraciones de su proyecto, una para cada versión de CLR que desee admitir.

  2. Elija un símbolo como VERSION2 , VERSION3 , etc. por versión CLR.

  3. En cada configuración, defina el símbolo asociado e indefinir todos los demás.

  4. Use estos símbolos en bloques de compilación condicional.

¿Hay algún símbolo de preprocesador que permita algo así como

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

o de alguna otra manera para hacer esto?


No hay ninguna incorporada, pero puede suministrar la suya.

Para este escenario específico, es posible que desee encapsular la lógica en (por ejemplo) una clase contenedora (bloqueo), para que no tenga #if dispersos por todo el código; por supuesto, si solo estás haciendo un pequeño bloqueo, puede que no valga la pena.

Utilizo diferentes configuraciones y / o proyectos para construir para una variedad de plataformas, es decir, protobuf-net para .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 utilizando este truco. El código tiene #if bloques basados ​​en diferentes símbolos para controlar la lógica, por lo que, por ejemplo, BinaryFormatter no está disponible en CF, WCF solo está disponible con .NET 3.0, Delegate.CreateDelegate no está en CF 2.0, etc.


Podría usar el reflejo para verificar dinámicamente si un tipo determinado, como ReaderWriterLockSlim, está disponible (en lugar de usar el preprocesador).

Esto le daría la ventaja de que puede implementar una única versión de su producto y los usuarios que tengan (o actualicen a) .NET 3.5 se beneficiarán del código optimizado.


Puede establecer manualmente este símbolo usando el modificador de compilador / define . A continuación, crea diferentes configuraciones de compilación para cada versión clr deseada.


Si eso es todo lo que tenía que hacer, supongo que podría usar Environment.Version, pero al igual que divo''s solución divo''s , parece dejar allí un código innecesario.