2010-12-26 14 views
13

Ecco un esempio concreto di ciò che voglio fare.Posso rendere una direttiva per il preprocessore dipendente dalla versione del framework .NET?

Considerare la funzione string.Join. Pre-.NET 4.0, c'erano solo due sovraccarichi, entrambi richiedevano un parametro string[].

A partire da. NET 4.0, ci sono nuovi sovraccarichi che richiedono tipi di parametri più flessibili, incluso IEnumerable<string>.

Ho una libreria che include una funzione Join che fa essenzialmente ciò che fa la funzione .NET 4.0 string.Join. Mi stavo chiedendo se avrei potuto rendere l'implementazione di questa funzione dipendente dal framework .NET preso di mira. Se 4.0, potrebbe semplicemente chiamare string.Join internamente. Se 3.5 o più vecchio, potrebbe chiamare la sua propria implementazione interna.

  1. Questa idea ha senso?
  2. Se ha senso, qual è il modo più logico per farlo? Suppongo che stia solo partendo dal presupposto che una direttiva per il preprocessore sarebbe più sensata, dal momento che una chiamata a string.Join con un parametro IEnumerable<string> non comporterà nemmeno compilando per il targeting di una versione .NET precedente alla 4.0; quindi qualunque approccio io usi dovrebbe aver luogo prima della compilazione. (Controllo della proprietà Environment.Version in fase di esecuzione, ad esempio, non avrebbe funzionato.)
+1

Vedi anche http://stackoverflow.com/questions/3436526/detect-target-framework-version-at-compile-time – Maslow

risposta

14

È possibile dare un'occhiata a un'altra domanda su Stack Overflow che illustra come impostare le costanti condizionali tramite XML del file di progetto: Detect target framework version at compile time

Quindi utilizzando questo è possibile determinare se è necessario utilizzare i sovraccarichi .NET 4 o la propria libreria.

+0

+1; sembra una soluzione perfetta –

+0

Bello, ha funzionato perfettamente! Grazie per il link utile. –

2

Sì, penso che abbia senso (per il tuo caso particolare, dal momento che il cambiamento è relativamente minore), anche se ovviamente quel genere di cose potrebbe sfuggire al controllo abbastanza rapidamente.

IMHO, il modo più logico per andare a questo proposito sarebbe quello di creare diverse configurazioni soluzione/progetto per ogni versione, quindi definire un simbolo personalizzato (ad esempio, NET40) nelle configurazioni 4.0, quindi utilizzare quello con un #if. Non sono sicuro se le configurazioni ti permetteranno di cambiare la versione di runtime (che sarebbe ovviamente la soluzione perfetta), ma nel tuo caso peggiore dovresti cambiare la versione manualmente.

EDIT: Ho appena visto la risposta legata al risposta di Joshua, e che sembra una soluzione più snella, ma lascio questo qui comunque, dal momento che, a rigor di termini, rispondere alla domanda.

+0

In realtà stavo pensando come te e ho deciso di cercare in giro per vedere se c'erano alternative. –

1

È possibile preparare il codice per .NET 4.0 e scrivere il codice simile per .NET 3.5 su 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 

E mettere la sua linea al vostro * .csproj

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