Es gibt einige kleinere Stellen, an denen der Code für mein Projekt möglicherweise drastisch verbessert werden kann, wenn das Zielframework eine neuere Version wäre. Ich möchte die bedingte Kompilierung in C # besser nutzen können, um diese nach Bedarf zu wechseln.
Etwas wie:
#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif
Ist eines dieser Symbole kostenlos? Muss ich diese Symbole im Rahmen der Projektkonfiguration einfügen? Dies scheint einfach zu sein, da ich weiß, auf welches Framework MSBuild abzielt.
/p:DefineConstants="NET40"
Wie gehen die Menschen mit dieser Situation um? Erstellen Sie verschiedene Konfigurationen? Übergeben Sie die Konstanten über die Befehlszeile?
Antworten:
Eine der besten Möglichkeiten, dies zu erreichen, besteht darin, verschiedene Build-Konfigurationen in Ihrem Projekt zu erstellen:
Und in einer Ihrer Standardkonfigurationen:
Was den Standard festlegen würde, wenn er nirgendwo anders definiert wäre. In diesem Fall erhalten Sie mit OutputPath jedes Mal, wenn Sie eine Version erstellen, eine separate Assembly.
Erstellen Sie dann ein AfterBuild-Ziel, um Ihre verschiedenen Versionen zu kompilieren:
In diesem Beispiel wird das gesamte Projekt neu kompiliert, wobei die Framework-Variable nach dem ersten Build auf NET20 gesetzt wird (beide kompilieren und davon ausgehen, dass der erste Build das Standard-NET35 von oben war). Für jede Kompilierung werden die bedingten Definitionswerte korrekt festgelegt.
Auf diese Weise können Sie sogar bestimmte Dateien in der Projektdatei ausschließen, wenn Sie die Dateien nicht #ifdef müssen:
oder sogar Referenzen
quelle
Eine Alternative, die bisher für mich funktioniert, besteht darin, der Projektdatei Folgendes hinzuzufügen:
Dies nimmt den Wert der TargetFrameworkVersion-Eigenschaft an, die wie "v3.5" ist und die "v" und "" ersetzt. um "NET35" zu erhalten (unter Verwendung der neuen Eigenschaftsfunktionen Eigenschaftsfunktionen"). Anschließend werden alle vorhandenen "NETxx" -Werte entfernt und am Ende der DefinedConstants hinzugefügt. Es mag möglich sein, dies zu rationalisieren, aber ich habe nicht die Zeit, herumzuspielen.
Wenn Sie auf der Registerkarte Erstellen der Projekteigenschaften in VS nachsehen, wird der resultierende Wert im Abschnitt Symbole für bedingte Kompilierungen angezeigt. Durch Ändern der Ziel-Framework-Version auf der Registerkarte "Anwendung" wird das Symbol automatisch geändert. Sie können dann
#if NETxx
Präprozessor-Direktiven auf die übliche Weise verwenden. Das Ändern des Projekts in VS scheint die benutzerdefinierte PropertyGroup nicht zu verlieren.Beachten Sie, dass dies für die Zieloptionen des Kundenprofils anscheinend nichts anderes ergibt, aber das ist für mich kein Problem.
quelle
Ich hatte Probleme mit diesen Lösungen, möglicherweise weil meine Anfangskonstanten durch diese Eigenschaften vorgefertigt wurden.
Visual Studio 2010 hat auch einen Fehler aufgrund der Semikolons ausgegeben und behauptet, es handele sich um illegale Zeichen. Die Fehlermeldung gab mir einen Hinweis, da ich die vorgefertigten Konstanten durch Kommas getrennt sehen konnte, gefolgt von meinem "illegalen" Semikolon. Nach einigen Neuformatierungen und Massagen konnte ich eine Lösung finden, die für mich funktioniert.
Ich würde einen Screenshot des Dialogfelds Erweiterte Compiler-Einstellungen veröffentlichen (geöffnet durch Klicken auf die Schaltfläche "Erweiterte Kompilierungsoptionen ..." auf der Registerkarte "Kompilieren" Ihres Projekts). Aber als neuer Benutzer fehlt mir der Repräsentant, um dies zu tun. Wenn Sie den Screenshot sehen könnten, würden Sie die benutzerdefinierten Konstanten sehen, die von der Eigenschaftsgruppe automatisch ausgefüllt werden, und dann würden Sie sagen: "Ich muss mir etwas davon besorgen."
EDIT: Habe diesen Repräsentanten überraschend schnell. Danke Jungs! Hier ist der Screenshot:
quelle
Beginnen Sie mit dem Löschen der Konstanten:
Erstellen Sie als Nächstes Ihr Debug, Ihre Ablaufverfolgung und andere Konstanten wie:
Zuletzt erstellen Sie Ihre Framework-Konstanten:
Ich denke, dieser Ansatz ist sehr lesbar und verständlich.
quelle
Fügen Sie in einer .csproj-Datei nach einer vorhandenen
<DefineConstants>DEBUG;TRACE</DefineConstants>
Zeile Folgendes hinzu:Führen Sie dies sowohl für Debug- als auch für Release-Build-Konfigurationen aus. Dann verwenden Sie in Ihrem Code:
quelle
@Azarien, Ihre Antwort kann mit der von Jeremy kombiniert werden, um sie an einem Ort zu speichern, anstatt Debug | Release usw.
Für mich funktioniert das Kombinieren beider Varianten am besten, dh das Einbeziehen von Bedingungen in Code mit #if NETXX und das gleichzeitige Erstellen für verschiedene Framework-Versionen.
Ich habe diese in meiner .csproj-Datei:
und in Zielen:
quelle
Wenn Sie das .NET Core-Buildsystem verwenden, können Sie dessen vordefinierte Symbole verwenden (die tatsächlich bereits zu Ihrem Beispiel passen und keine Änderungen an Ihrem erfordern
.csproj
!):Die Liste der vordefinierten Symbole ist unter Entwickeln von Bibliotheken mit plattformübergreifenden Tools und #if (C # -Referenz) dokumentiert :
quelle