2010-12-26 8 views
13

Hier ist ein konkretes Beispiel für das, was ich tun möchte.Kann ich eine Präprozessor-Direktive von der .NET-Framework-Version abhängig machen?

Betrachten Sie die string.Join Funktion. Pre-.NET 4.0 gab es nur zwei Überladungen, die beide einen string[] Parameter benötigten.

Ab .NET 4.0 gibt es neue Überladungen, die flexiblere Parametertypen verwenden, einschließlich IEnumerable<string>.

Ich habe eine Bibliothek, die eine Join-Funktion enthält, die wesentlich tut, was die .NET 4.0 string.Join Funktion tut. Ich habe mich nur gefragt, ob ich die Implementierung dieser Funktion abhängig machen könnte von dem .NET-Framework, auf das es abzielt. Wenn 4.0, könnte es einfach intern string.Join aufrufen. Wenn 3.5 oder älter, könnte es seine eigene interne Implementierung aufrufen.

  1. Macht diese Idee Sinn?
  2. Wenn es sinnvoll ist, was ist der logischste Weg, es zu tun? Ich nehme an, ich nehme nur an, eine Präprozessordirektive wäre am sinnvollsten, da ein Aufruf an string.Join mit einem IEnumerable<string> Parameter nicht einmal kompilieren beim Targeting einer .NET-Version älter als 4.0; Also muss jeder Ansatz, den ich verwende, vor der Kompilierung stattfinden. (Überprüfung der Environment.Version Eigenschaft zur Laufzeit, zum Beispiel würde nicht funktionieren.)
+1

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

Antwort

14

Sie einen Blick auf eine andere Frage auf Stack-Überlauf nehmen können, die zeigt, wie bedingte Konstanten durch die Projektdatei der XML setzen: Detect target framework version at compile time

Dann können Sie feststellen, ob Sie die .NET 4 Überladungen oder Ihre eigene Bibliothek verwenden sollten.

+0

+1; sieht wie eine perfekte Lösung aus –

+0

Schön, funktionierte perfekt! Danke für den nützlichen Link. –

2

Ja, ich denke, es macht Sinn (für Ihren speziellen Fall, da die Änderung relativ gering ist), obwohl diese Art der Sache ziemlich schnell außer Kontrolle geraten könnte.

IMHO, die logischste Möglichkeit wäre, für jede Version verschiedene Lösungs-/Projektkonfigurationen zu erstellen, dann ein benutzerdefiniertes Symbol (z. B. NET40) in Ihren 4.0 Konfigurationen zu definieren und dieses dann mit #if zu verwenden. Ich bin mir nicht sicher, ob Konfigurationen es erlauben, die Laufzeitversion zu ändern (das wäre natürlich die perfekte Lösung), aber im schlimmsten Fall müssen Sie die Version manuell ändern.

EDIT: Ich sah nur die Antwort verknüpft in Joshua Antwort, und das scheint wie eine schlankere Lösung, aber ich werde das hier sowieso verlassen, da es der Fall ist, streng genommen, die Frage beantworten.

+0

Ich dachte eigentlich in die gleiche Richtung wie Sie und entschied mich, nach Alternativen zu suchen. –

1

Sie können Ihren Code für .NET 4.0 vorbereiten und den ähnlichen Code für die .NET 3.5-Basis unter framework detection schreiben.

#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 

und legte seine Zeile in * CSPROJ

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