2010-07-23 10 views
8

Come posso ottenere VS2010 per utilizzare il compilatore 3.5 C# anziché 4.0?Come posso ottenere VS2010 per utilizzare il compilatore 3.0 C# anziché 4.0?

E 'possibile, o devo avere un file di soluzione VS2008 separato per forzare la compilazione con il compilatore 3.0?

(aggiornato per correggere versione del compilatore #)

Aggiornamento: La mia motivazione è quello di ottenere la produttività di sviluppo in VS2010, ma ha bisogno di essere eseguito su un server di build che non può avere un singolo bit di. Binari NET 4.0 su di esso.

+1

Dato il numero di intervistati che sembra presupporre che si desidera utilizzare .NET 3.5 o che * non * importa * che il codice non possa essere compilato con la versione precedente di il compilatore, penso che sarebbe di aiuto alla tua causa se potessi fornire maggiori dettagli :) –

+0

Grazie per i dettagli extra - Ho aggiornato la mia risposta di conseguenza. –

+0

Suppongo, poiché è un * build server *, che vuoi che il tuo codice non solo * esca * senza .NET 4 ma anche * compile * senza .NET 4? –

risposta

5

Non credo che tu possa farlo. È possibile impostare una versione linguistica nelle proprietà del progetto, ma non è la stessa cosa che utilizzare il compilatore C# 3 da .NET 3.5. Credo che ci sono sottili differenze intorno inferenza di tipo e la risoluzione di sovraccarico, per esempio, dove i C# 4 regole saranno seguite invece dei C# 3 regole, anche quando si costruisce come C# 3. Ecco un esempio di che:

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

    static int Demo() { return 5; } 

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

Questo costruisce usando il compilatore C# 4, anche quando si specifica/langversion: 3 - ma non viene compilato con il compilatore C# 3.

È maggio trovare che è possibile modificare il file di progetto per utilizzare la versione precedente del compilatore - ma non so come Visual Studio avrebbe affrontato tale. Sospetto che sarebbe orribilmente confuso.

EDIT: Ok, ora hai dato la motivazione, penso che potresti voler fare quello che facciamo per Noda Time. Abbiamo una soluzione VS2010 e un file di soluzione VS2008. Entrambi caricano gli stessi progetti, che hanno un attributo ToolsVersion di 4.0. Non ho provato, ma I credo che dovrebbe costruire assolutamente bene su una macchina con solo .NET 3.5.

Potrebbe essere utile impostare la versione della lingua su 3 e nei file di progetto, per evitare di utilizzare accidentalmente nuove funzionalità. Non renderà la tua compatibilità a prova di proiettile, ma se hai tutti i tuoi test di integrazione e generazione su un server di generazione continua .NET 3.5 solo, sei improbabile per essere morso dalle modifiche.

+0

Questo è diverso dal framework di destinazione e controllerà il codice per incompatibilità con le versioni precedenti del compilatore? Come omissione (C# 3 compatibile) di argomenti opzionali COM, (compatibili con C# 2), metodi di estensione, ecc. –

+0

@ Ben: dà errori se si tenta di utilizzare nuove funzionalità di C# 4, sì - ma ha * alcuni * Comportamento C# 4 (vedi esempio sopra). Non ho controllato cosa succede con eventi di tipo campo - non sarei sorpreso di vedere il nuovo comportamento anche lì. –

+0

Confermo che è possibile creare un proj che utilizzi ToolVersion = 4.0 su un server senza un compilatore 4.0. Si dirà "Il file di progetto contiene ToolsVersion =" 4.0 ", che non è supportato da questa versione di MSBuild. Tratta il progetto come se fosse ToolsVersion =" 3.5 "." –

0

se si è installato 3.5 si dovrebbe essere in grado di selezionare il framework nelle proprietà del progetto. Fai clic destro sul nome del progetto -> Proprietà

+2

Non è lo stesso che usare il compilatore C# 3 fornito con .NET 3.5 sebbene ... –

+0

È vero, non è la stessa cosa, ma non è necessario utilizzare un compilatore precedente. Non è possibile utilizzare le funzionalità linguistiche che richiedono un framework successivo se si targetizza un framework precedente, si otterranno errori in fase di compilazione. – Tergiver

+2

Tuttavia, è possibile utilizzare funzionalità linguistiche che sono zucchero sintattico e non richiedono supporto runtime, il che interrompe la capacità dei programmatori che utilizzano la versione precedente di ricompilare il codice. –

3

Non è possibile. Visual Studio 2010 utilizza il compilatore 4.0 anche se si sceglie il framework 3.5.

Inoltre, non esiste una versione 3.5 del compilatore C#.

+0

Inoltre, anche se si targetizza 3.5 con Visual Studio 2010, è comunque possibile utilizzare la maggior parte delle nuove funzionalità di sintassi di C# 4, come migliore inferenza del tipo, parametri opzionali e simili e ancora compilazione rispetto a 3.5. –

+1

@Pierre: che non è una buona cosa se stai lavorando con collaboratori che usano versioni precedenti –

+0

@ Pierre-Alain: Supponi che l'OP * voglia * utilizzare le funzionalità di C# 4. Dato che ha detto che vuole per usare il compilatore "3.5 C#" (che io intendo per "il compilatore C# fornito con .NET 3.5" suppongo che voglia * impedire * l'utilizzo delle funzionalità di C# 4. –

1

Impossibile eseguire. Tuttavia, non c'è molto bisogno di questo come il compilatore C# 4 è in grado di generare assembly compatibili con .NET 2.0 (.NET 3.0 e 3.5 sono solo il motore di runtime 2.0 + nuovi compilatori e librerie).

Sei sicuro di aver bisogno del compilatore C# 3 (fornito con VS 2008/.NET 3.5) o di avere un output compatibile con esso abbastanza buono?

+0

Ho bisogno di gettare questo codice oltre la recinzione in un altro server di costruzione che solo ha 3.5 binari e non 4.0 binari del tutto. – MatthewMartin

+0

Il suggerimento di Jon Skeet di "/ langversion" è probabilmente la soluzione migliore allora. –

0

È possibile avere un progetto in VS2010 come target del framework 3.5 (non il compilatore).

Basta fare doppio clic sulla cartella delle proprietà in solution explorer (o fare clic con il tasto destro del mouse sul nome del progetto) e, nella pagina Proprietà, nella scheda Applicazione, selezionare il framework di destinazione. (È possibile selezionare da Framework 4.0 fino a 2.0.)

+0

@D Hoerster: è perfettamente possibile avere progetti che si apriranno sia in VS2008 che in VS2010. Non è possibile farlo a livello * solution *, ma è possibile farlo a livello * project *, a condizione che non si utilizzino funzioni che si trovano solo in una versione e non nell'altra. Dai un'occhiata ai progetti di Noda Time: noda-time.googlecode.com - abbiamo file di soluzione separati, ma caricano gli stessi progetti. –

+0

grazie. rimosso il mio errore. –

Problemi correlati