2010-07-23 20 views
8

Wie kann ich VS2010 dazu bringen, den 3.5 C# -Compiler anstelle von 4.0 zu verwenden?Wie kann ich VS2010 dazu bringen, den 3.0 C# -Compiler anstelle von 4.0 zu verwenden?

Ist es sogar möglich, oder brauche ich eine separate VS2008-Lösungsdatei, um die Kompilierung mit dem 3.0 Compiler zu erzwingen?

(aktualisiert Compiler Version # zu beheben)

aktualisieren: Meine Motivation ist es, die Produktivität der Entwicklung in VS2010 zu bekommen, aber es muss auf einem Build-Server ausführen, die nicht ein einzelnes Bit hat. NET 4.0-Binärdateien darauf.

+1

Angesichts der vielen Befragten, die davon ausgehen, dass Sie entweder auf .NET 3.5 abzielen oder es nicht wichtig ist, dass Ihr Code möglicherweise nicht mit der älteren Version kompiliert wird der Compiler, ich denke, es würde Ihrer Sache helfen, wenn Sie mehr Details geben könnten :) –

+0

Danke für die zusätzlichen Details - Ich habe meine Antwort entsprechend aktualisiert. –

+0

Ich gehe davon aus, weil es ein * Build-Server * ist, dass Sie möchten, dass Ihr Code nicht nur ohne .NET 4 * sondern auch * ohne .NET 4 * läuft *. –

Antwort

5

Ich glaube nicht, dass Sie das tun können. Sie können eine Sprachversion in den Projekteigenschaften festlegen, aber das ist nicht dasselbe wie mit dem C# 3-Compiler von .NET 3.5. Ich glaube, es gibt feine Unterschiede um Typinferenz und Überladungsauflösung, zum Beispiel, wo die C# 4 Regeln statt dem C# 3 Regeln befolgt werden, auch beim Bau als C# 3. Hier ist ein Beispiel dafür ist:

using System; 
class Test 
{ 
    static void Main() 
    { 
     CallFunc(Demo); 
    } 

    static int Demo() { return 5; } 

    static T CallFunc<T>(Func<T> func) 
    { 
     return func(); 
    } 
} 

Dies erstellt mit dem C# 4-Compiler, auch wenn Sie/langversion: 3 angeben - aber es wird nicht mit dem C# 3-Compiler erstellt.

Sie können finden, dass Sie die Projektdatei optimieren können, um die vorherige Version des Compilers zu verwenden - aber ich weiß nicht, wie Visual Studio damit umgehen würde. Ich vermute, es würde schrecklich verwirrt werden.

EDIT: Okay, jetzt haben Sie die Motivation gegeben, ich denke, Sie möchten vielleicht tun, was wir für Noda Time tun. Wir haben eine VS2010-Lösung und eine VS2008-Lösungsdatei. Sie laden beide die gleichen Projekte, die ein ToolsVersion Attribut von 4.0 haben. Ich habe es nicht versucht, aber ich glaube das sollte absolut gut auf einer Maschine mit nur .NET 3.5 bauen.

Sie können die Sprachversion auch auf 3 und in Ihren Projektdateien einstellen, um das versehentliche Verwenden neuer Funktionen zu vermeiden. Es macht Ihre Kompatibilität nicht kugelsicher, aber wenn Sie alle Unit- und Integrationstests auf einem Build-Server aufbauen, der nur auf .NET 3.5 läuft, sind Sie unwahrscheinlich, um von den Änderungen gebissen zu werden.

+0

Dies unterscheidet sich vom Zielframework und wird Code auf Inkompatibilitäten mit älteren Versionen des Compilers überprüfen? Wie (C# 3 kompatibel) Weglassen von COM optionale Argumente, (C# 2 kompatibel) Lambdas, Erweiterungsmethoden, etc. –

+0

@Ben: Es gibt Fehler, wenn Sie versuchen, neue C# 4 Funktionen zu verwenden, ja - aber es hat * einige * C# 4-Verhalten (siehe Beispiel oben). Ich habe nicht überprüft, was es mit Feld-ähnlichen Ereignissen tut - ich wäre nicht überrascht, das neue Verhalten auch dort zu sehen. –

+0

Ich bestätige, dass Sie ein Projekt erstellen können, das ToolVersion = 4.0 auf einem Server ohne einen 4.0-Compiler verwendet. Es wird sagen "Projektdatei enthält ToolsVersion =" 4.0 ", die von dieser Version von MSBuild nicht unterstützt wird. Das Projekt behandeln, als ob es ToolsVersion =" 3.5 "hatte." –

0

Wenn Sie 3.5 installiert haben, sollten Sie das Framework in den Projekteigenschaften auswählen können. Rechtsklick auf den Projektnamen -> Eigenschaften

+2

Das ist nicht das Gleiche wie die Verwendung des C# 3-Compilers, der mit .NET 3.5 kommt, obwohl ... –

+0

Wahr, es ist nicht das Gleiche, aber es ist nicht notwendig, einen früheren Compiler zu verwenden. Sie können keine Sprachfeatures verwenden, die ein späteres Framework erfordern, wenn Sie ein älteres Framework als Ziel haben. Dadurch treten Kompilierungsfehler auf. – Tergiver

+2

Aber Sie können Sprachfunktionen verwenden, die syntaktischer Zucker sind und keine Laufzeitunterstützung benötigen, was die Fähigkeit von Programmierern, die die ältere Version verwenden, um den Code neu zu kompilieren, beeinträchtigt. –

3

Sie können nicht. Visual Studio 2010 verwendet den 4.0-Compiler auch dann, wenn Sie auf Framework 3.5 abzielen.

Außerdem gibt es keine Version 3.5 des C# -Compilers.

+0

Auch wenn Sie mit Visual Studio 2010 3.5 als Ziel verwenden, können Sie immer noch die meisten der neuen Syntaxfunktionen von C# 4 verwenden, z. B. bessere Typ-Inferenz, optionale Parameter usw. und trotzdem mit 3.5 kompilieren. –

+1

@Pierre: was ist nicht eine gute Sache, wenn Sie mit Mitarbeitern arbeiten mit früheren Versionen –

+0

@ Pierre-Alain: Sie gehen davon aus, dass das OP * will die Funktionen von C# 4 verwenden. Angesichts, dass er sagte, er will Um den "3.5 C# -Compiler" zu verwenden (was ich für "den mit .NET 3.5 gelieferten C# -Compiler" halte) würde ich annehmen, dass er verhindern möchte, dass die C# 4-Features verwendet werden. –

1

Kann nicht gemacht werden. Dies ist jedoch nicht besonders wichtig, da der C# 4-Compiler in der Lage ist, .NET 2.0-kompatible Assemblys zu generieren (.NET 3.0 und 3.5 sind lediglich die 2.0-Laufzeit-Engine + neue Compiler und Bibliotheken).

Sind Sie sicher, dass Sie den C# 3-Compiler benötigen (wird mit VS 2008/.NET 3.5 geliefert) oder ist die Ausgabe kompatibel?

+0

Ich muss diesen Code über den Zaun zu einem anderen Build-Server als nur 3,5 Binärdateien und nicht 4,0 Binärdateien überhaupt werfen. – MatthewMartin

+0

Jon Skeets Vorschlag von '/ langversion' ist wahrscheinlich Ihre beste Wette. –

0

Sie können ein Projekt in VS2010 das 3.5 Framework (nicht den Compiler) targetieren.

Doppelklicken Sie auf den Eigenschaftenordner im Solution Explorer (oder klicken Sie mit der rechten Maustaste auf den Projektnamen), und wählen Sie auf der Seite Eigenschaften auf der Registerkarte Anwendung das gewünschte Framework aus. (Sie können zwischen Frameworks 4.0 und 2.0 wählen.)

+0

@D Hoerster: Es ist durchaus möglich Projekte zu haben, die sowohl in VS2008 als auch VS2010 geöffnet werden. Sie können es nicht auf der Ebene * solution * ausführen, aber Sie können es auf der Ebene * project * ausführen, solange Sie keine Features verwenden, die nur in einer Version und nicht in der anderen Version enthalten sind. Schauen Sie sich die Projekte in Noda Time an: noda-time.googlecode.com - wir haben separate Lösungsdateien, aber sie laden dieselben Projekte. –

+0

danke. hat meinen Fehler entfernt. –

Verwandte Themen