2009-01-03 10 views

Respuesta

21

No creo que haya ningún símbolo preprocesador predefinido. Sin embargo se puede lograr lo que quiere de esta manera:

  1. crear diferentes configuraciones de su proyecto, una para cada versión de CLR desea apoyar.

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

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

  4. Utilice estos símbolos en bloques de compilación condicionales.

2

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

4

Puede usar la reflexión para verificar dinámicamente si un tipo determinado, como ReaderWriterLockSlim, está disponible (en lugar de utilizar 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.

+2

Pero haría que usarlo sea un cerdo completo ... factible, pero no muy atractivo. En particular, algunas de las características de .NET 3.5 (como Expression) serían * muy * difíciles de usar a través de la reflexión. –

+1

Marc, no usaría la reflexión en todo el código, solo para verificar si una cierta biblioteca/tipo está disponible en la máquina cliente. Esto sería muy similar a los símbolos del preprocesador (es decir, una condición if y luego una bifurcación dependiendo de si 3.5 está allí o no) –

+1

Obviamente, necesitaría almacenar en caché los resultados de la reflexión si realiza esta ruta. –

5

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 compilaciones para .NET 2.0, .NET 3.0, mono, CF 2.0, CF 3.5 utilizando este truco. El código tiene #if bloques basado en diferentes símbolos para control lógico - por lo que, por ejemplo, BinaryFormatter no está disponible en CF, WCF sólo está disponible con .NET 3.0, Delegate.CreateDelegate no está en CF 2.0, etc.

1

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, parece dejar allí un montón de código innecesario.

Cuestiones relacionadas