2010-12-26 18 views
13

Aquí hay un ejemplo concreto de lo que quiero hacer.¿Puedo hacer que una directiva de preprocesador dependa de la versión de .NET Framework?

Considere la función string.Join. Pre.NET 4.0, solo había dos sobrecargas, y ambas requerían un parámetro string[].

A partir de .NET 4.0, hay nuevas sobrecargas que toman tipos de parámetros más flexibles, incluyendo IEnumerable<string>.

Tengo una biblioteca que incluye una función Join que hace esencialmente lo que hace la función .NET 4.0 string.Join. Me preguntaba si podría hacer que la implementación de esta función dependa del framework .NET al que se apunta. Si es 4.0, simplemente puede llamar al string.Join internamente. Si tiene 3.5 o más, podría llamar a su propia implementación interna.

  1. ¿Tiene sentido esta idea?
  2. Si tiene sentido, ¿cuál es la forma más lógica de hacerlo? Supongo que estoy asumiendo que una directiva de preprocesador tendría más sentido, ya que una llamada a string.Join con un parámetro IEnumerable<string> ni compilará al apuntar a una versión .NET anterior a la 4.0; así que cualquier enfoque que use debería tener lugar antes de la compilación. (Comprobación de la propiedad Environment.Version en tiempo de ejecución, por ejemplo, no funcionaría.)
+1

Véase también http://stackoverflow.com/questions/3436526/detect-target-framework-version-at-compile-time – Maslow

Respuesta

14

Usted puede echar un vistazo a otra pregunta sobre el desbordamiento de pila que muestra cómo establecer las constantes condicionales a través de XML del archivo de proyecto: Detect target framework version at compile time

Luego de usar eso puede determinar si debe usar las sobrecargas de .NET 4 o su propia biblioteca.

+0

+1; parece una solución perfecta –

+0

¡Agradable, funcionó a la perfección! Gracias por el útil enlace. –

2

Sí, creo que tiene sentido (para su caso particular, ya que el cambio es relativamente menor), aunque obviamente ese tipo de cosas podrían escalar fuera de control con bastante rapidez.

En mi humilde opinión, la forma más lógica de hacerlo sería crear diferentes configuraciones de solución/proyecto para cada versión, luego definir un símbolo personalizado (por ejemplo, NET40) en sus configuraciones 4.0 y luego usarlo con #if. No estoy seguro si las configuraciones le permitirán cambiar la versión en tiempo de ejecución (que obviamente sería la solución perfecta), pero su peor caso es tener que cambiar la versión manualmente.

EDIT: acabo de ver la respuesta ligada a en la respuesta de Josué, y que parece una solución más racional, pero voy a dejar esto aquí de todos modos, ya que lo hace, en sentido estricto, responder a la pregunta.

+0

Estaba pensando en la misma línea que usted y decidí buscar para ver si había alguna alternativa. –

1

Puede preparar su código para .NET 4.0 y escribir el código similar para .NET 3.5 base en framework detection.

#if NOT_RUNNING_ON_4 
public static class GuidExtensions 
{ 
    public static bool TryParse(this string s, out Guid result) 
    { 
     if (s.IsNullOrEmpty()) 
      return null; 
     try 
     { 
      return new Guid(s); 
     } 
     catch (FormatException) 
     { 
      return null; 
     } 
    } 
} 
#else 
    #error switch parsing to .NET 4.0 
#endif 

y se llevó la línea a su * .csproj

<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants> 
Cuestiones relacionadas