2010-07-23 6 views
8

¿Cómo puedo obtener VS2010 para usar el compilador 3.5 C# en lugar de 4.0?¿Cómo puedo obtener VS2010 para usar el compilador 3.0 C# en lugar de 4.0?

Es incluso posible, o tengo que tener un archivo de solución VS2008 separada para coaccionar compilación con el 3.0 compilador?

(actualizado para corregir versión del compilador #)

actualización: Mi motivación es conseguir la productividad de desarrollo en VS2010, pero que necesita para ejecutarse en un servidor de compilación que puede no tener un solo bit de. Binarios de NET 4.0 en él.

+1

Dado el número de encuestados que parecen suponer que desea orientar .NET 3.5 o que * no importa * que su código no pueda compilarse con la versión anterior de el compilador, creo que ayudaría a tu causa si pudieras dar más detalles :) –

+0

Gracias por los detalles adicionales - He actualizado mi respuesta en consecuencia. –

+0

Supongo, porque es un * servidor de compilación *, que desea que su código no solo * se ejecute * sin .NET 4, sino también * compile * sin .NET 4? –

Respuesta

5

No creo que pueda hacerlo. Puede establecer una versión de idioma en las propiedades del proyecto, pero eso no es lo mismo que usar el compilador C# 3 de .NET 3.5. Creo que hay diferencias sutiles en todo tipo de inferencia y la resolución de sobrecarga, por ejemplo, donde se seguirá el C# 4 reglas en lugar de las reglas de C# 3, aun cuando se construye como C# 3. Aquí hay un ejemplo de ello:

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

    static int Demo() { return 5; } 

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

Esto se crea utilizando el compilador C# 4, incluso cuando especifica/langversion: 3 - pero no se compila con el compilador C# 3.

puede encontrar que puede modificar el archivo del proyecto para utilizar la versión anterior del compilador, pero no sé cómo lo haría con Visual Studio. Sospecho que se pondría terriblemente confundido.

EDITAR: Bien, ahora que ha dado la motivación, creo que es posible que desee hacer lo que hacemos para Noda Time. Tenemos una solución VS2010 y un archivo de solución VS2008. Ambos cargan los mismos proyectos, que tienen un atributo ToolsVersion de 4.0. No lo he intentado, pero creo que cree que debe compilar absolutamente bien en una máquina con .NET 3.5.

Es posible que desee establecer la versión del idioma en 3 y en sus archivos de proyecto, para evitar el uso accidental de nuevas funciones. No hará que su compatibilidad sea a prueba de balas, pero si tiene todas sus unidades y pruebas de integración construidas y ejecutándose en un servidor de compilación continua .NET 3.5 solo, usted es improbable para ser mordido por los cambios.

+0

¿Esto es diferente del marco de destino y verificará el código en busca de incompatibilidades con versiones anteriores del compilador? Tal como (C# 3 compatible) omisión de COM argumentos opcionales, (C# 2 compatible) lambdas, métodos de extensión, etc. –

+0

@Ben: Da errores si intenta usar nuevas características C# 4, sí, pero tiene * algunos * Comportamiento de C# 4 (vea el ejemplo anterior). No he comprobado qué hace con los eventos de campo; tampoco me sorprendería ver el nuevo comportamiento allí. –

+0

Confirmo que puede compilar un proyecto que use ToolVersion = 4.0 en un servidor sin un compilador 4.0. Dirá "El archivo de proyecto contiene ToolsVersion =" 4.0 ", que no es compatible con esta versión de MSBuild. Tratar el proyecto como si tuviera ToolsVersion =" 3.5 "." –

0

si tiene 3.5 instalado, debería poder seleccionar el marco en las propiedades del proyecto. Haga clic con el botón derecho en el nombre del proyecto -> propiedades

+2

Eso no es lo mismo que usar el compilador C# 3 que viene con .NET 3.5 ... –

+0

Cierto, no es lo mismo, pero no es necesario usar un compilador anterior. No puede usar características de lenguaje que requieran un marco posterior si se dirige a un marco anterior, obtendrá errores en tiempo de compilación. – Tergiver

+2

Pero PUEDE usar funciones de lenguaje que son azúcar sintáctico y no necesitan soporte de tiempo de ejecución, lo que interrumpe la capacidad de los programadores que utilizan la versión anterior para recompilar el código. –

3

No puede. Visual Studio 2010 utiliza el compilador 4.0 incluso si se dirige a Framework 3.5.

Además, no existe la versión 3.5 del compilador C#.

+0

Además, incluso si apunta a 3.5 con Visual Studio 2010, aún puede usar la mayoría de las nuevas características de sintaxis de C# 4, como una mejor inferencia de tipo, parámetros opcionales y similares, y aún compilar contra 3.5. –

+1

@Pierre: lo cual no es bueno si está trabajando con colaboradores que usan versiones anteriores –

+0

@ Pierre-Alain: Asumiendo que el OP * quiere * usar las características de C# 4. Dado que se dice que quiere para usar el "compilador de 3.5 C#" (que interpreto como "el compilador de C# que viene con .NET 3.5", supongo que quiere * evitar * que se usen las características de C# 4. –

1

No se puede hacer. Sin embargo, no hay mucha necesidad de eso ya que el compilador C# 4 puede generar ensamblajes compatibles con .NET 2.0 (.NET 3.0 y 3.5 son solo el motor de tiempo de ejecución 2.0 + nuevos compiladores y bibliotecas).

¿Está seguro de que necesita el compilador C# 3 (se suministra con VS 2008/.NET 3.5) o está teniendo una salida compatible con él lo suficientemente buena?

+0

Necesito arrojar este código sobre la valla a otro servidor de compilación que solo tiene 3.5 binarios y no 4.0 binarios en absoluto. – MatthewMartin

+0

La sugerencia de Jon Skeet de '/ langversion' es probablemente la mejor opción. –

0

Puede tener un proyecto en el objetivo VS2010 del marco 3.5 (no el compilador).

Simplemente haga doble clic en la carpeta de propiedades en el explorador de soluciones (o haga clic con el botón derecho en el nombre del proyecto) y en la página Propiedades, en la pestaña Aplicación, seleccione el marco específico. (Puede seleccionar desde Frameworks 4.0 hasta 2.0.)

+0

@D Hoerster: Es perfectamente posible tener proyectos que se abrirán tanto en VS2008 como en VS2010. No puede hacerlo en el nivel * solución *, pero puede hacerlo en el nivel * project *, siempre que no use funciones que están en una versión y no en la otra. Eche un vistazo a los proyectos en Noda Time: noda-time.googlecode.com - tenemos archivos de solución separados, pero cargan los mismos proyectos. –

+0

gracias. eliminé mi error –

Cuestiones relacionadas