¿Cómo usar C # 6 con el tipo de proyecto de sitio web?

126

Actualicé un proyecto de sitio web existente tipo Visual Studio 2015, cambié el Framework a 4.6.

Entonces esperaba tener todas esas nuevas funciones disponibles en mi código detrás de los archivos.

Lamentablemente recibo errores como:

Error CS8026: La característica 'propiedad con cuerpo de expresión' no está disponible en C # 5. Utilice la versión de lenguaje 6 o superior.

o por ejemplo:

Error CS8026: la función 'cadenas interpoladas' no está disponible en C # 5. Utilice la versión de idioma 6 o superior.

Hice una búsqueda rápida en Google y encontré a un tipo que publicaba algunos comentarios en una publicación de blog de ScottGu (busque "8026" en la página).

Como no entiendo su solución, además de que quiero que la solución sea más visible, he creado esta publicación SO.

Mi pregunta:

¿Cómo puedo tener un proyecto de Visual Studio 2015 del tipo Sitio web (es decir, no Aplicación web ) para reconocer las características de C # 6?

Uwe Keim
fuente
1
¿Has intentado agregar los elementos de configuración thw que mencionó en el comentario?
scheien
Estoy a punto de hacerlo, pero parece realmente extraño para mí , así que estaba esperando alguna solución más limpia.
Uwe Keim
55
Por supuesto, la otra opción es dejar de usar esos "proyectos" del sitio web y usar Proyectos de aplicaciones web en su lugar.
John Saunders
1
@ JohnSaunders Me encantaría hacer eso. Como la migración es una tarea manual, temo el tiempo que llevará y todos los errores que introduciré durante la migración. Lo hice algunas veces para proyectos más pequeños. Siempre fue una molestia ...
Uwe Keim
1
Me alegro de que lo hayas considerado. El comentario fue principalmente para otros lectores que podrían pensar que un proyecto de "sitio web" suena como lo que quieren.
John Saunders

Respuestas:

118

He probado esto con ASP.NET MVC 5 (probado 5.2.3), y su kilometraje puede variar con otros marcos web, pero solo necesita agregar Roslyn CodeDOM | Paquete NuGet

Proveedores de CodeDOM para el compilador .NET ...

Proveedores de CodeDOM de reemplazo que usan el nuevo compilador .NET Compiler Platform ("Roslyn") como API de servicio. Esto proporciona soporte para nuevas características de lenguaje en sistemas que usan CodeDOM (por ejemplo, compilación de tiempo de ejecución ASP.NET), así como mejorar el rendimiento de compilación de estos sistemas.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

El paquete NuGet debe agregar los archivos DLL y agregar lo siguiente a su web.config.

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>

Si aún falta. Intenta sumarte a ti mismo.

jbtule
fuente
1
Esto funciona como se esperaba. C # 6 ahora disponible. El inconveniente es que mi App_GlobalResources / Resources.resx ya no genera la clase automática para acceder a los recursos fuertemente tipados.
Uwe Keim
1
Como nota, pude construir sin errores después de que el objetivo del proyecto se cambió a 4.6. Sin embargo, necesitaba instalar este paquete para resolver los squigglies rojos que aparecen desde intellisense.
Doug Morrow
77
Estoy usando esto en un sitio web de WebForms (sin archivo de proyecto). Lamentablemente, los simples cambios de .aspx desencadenan una recompilación dolorosamente más lenta al volver a solicitar la página en un navegador. Quizás Roslyn es teóricamente más rápido para una aplicación web (con archivo de proyecto), pero para los sitios web parece ser significativamente más lento a través de csc en la carpeta App_Code ... ¿Alguien ve lo mismo?
Stefan Anghel
44
Tenga en cuenta que, para que WebForms se compile con C # 6, debe instalar los paquetes NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatformy su dependenciaMicrosoft.Net.Compilers
3
Tenga en cuenta que si tiene más de un sitio web en su solución, las cosas no funcionarán, la forma más fácil de reproducir es crear una solución vacía y comenzar a agregar proyectos, después del segundo sitio web, comenzará a recibir "no se puede encontrar csc.exe" errores
mac
67

Vea también esta publicación de blog de Sayed Ibrahim Hashimi sobre cómo hacer esto a través del VS IDE.

En Visual Studio 2015 Update 1 hemos incluido una nueva característica para simplificar esto. Cuando tenga una solución abierta que tenga al menos un proyecto web dirigido a .NET 4.5+ y no tenga el paquete DotNetCompilerPlatform NuGet en el menú Proyecto, verá una nueva opción, Habilitar C # 6 / VB 14.
ingrese la descripción de la imagen aquí

Actualizar.

VS 2017 y 2019 tienen esta característica movida a Build -> ASP.NET Compilation . ingrese la descripción de la imagen aquí

Vértigo
fuente
2
¿Sabes dónde está este artículo en Visual Studio 2019?
Protector uno
44
@ protector-one Build -> Compilación ASP.NET
Vértigo
1
Abrí un proyecto de sitio web basado en carpetas más antiguo en VS2019 y tuve que Archivo> Guardar el proyecto antes de que esa opción apareciera.
Corgalore
15

Instalé DotNetCompilerPlatform como sugirió @jbtule, pero seguía recibiendo los mismos errores.

PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Cerré la solución, eliminé las carpetas bin y obj, luego abrí la solución y la reconstruí. Ahora las características de C # 6 funcionan.

Jon Crowell
fuente
3
Solo cerrar y reabrir VS funcionó para mí (después Install-Package ...). También dirigido a 4.6.
rwalter
1
esto funcionó para mí, también noté que usar resharper podría mostrarle errores falsos, me tomó un tiempo descubrir por qué aparece "No se puede resolver el símbolo" en toda la vista ...
Niklas
1
En mi caso, solo tuve que esperar unos 30 segundos después de volver a abrir la solución y funcionó sin tener que eliminar biny obj.
Marc.2377
12

Posibles soluciones, tomadas de los comentarios en la publicación del blog de ScottGu (busque "8026" en la página):

Sugerencia de solución 1 (David Taylor)

Agregue estos elementos dom de código RTM a web.config:

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>

Luego agregue las cosas de Roslyn y Microsoft.CodeDom.Providers. *. Dll en su directorio BIN.

Es bastante fácil de configurar, pero me resultó extraño que la plantilla predeterminada no estuviera configurada si seleccionó .NET 4.6 al crear un nuevo "Sitio web" en VS 2015 RTM.

Sugerencia de solución 2 (Martin)

Además del comentario anterior de David Taylor, parece que la configuración de system.codedom es correcta cuando se crea una aplicación web con TargetFramework como v4.5.2 predeterminado. Cambiar el TargetFramework a v4.6 parece modificar la configuración del compilador para CSharp, de una manera que causa un problema.

Mi solución fue la siguiente:

  1. Archivo / Nuevo / Aplicación web ASP.NET
  2. Seleccione la plantilla "Web API" de las plantillas ASP.NET 4.5.2
  3. Tome una copia del elemento system.codedom (y su contenido) en web.config
  4. Usando Properties / TargetFramework, establezca Target Framework en 4.6
  5. Reemplace el elemento system.codedom modificado en web.config con la copia tomada antes de cambiar TargetFramework
  6. Golpear F5

La página de inicio debe cargarse como se esperaba.

Para obtener información, el contenido de system.codedom inmediatamente después de cambiar TargetFramework a v4.6. fue el siguiente (tenga en cuenta el uso del tipo "Microsoft.CSharp.CSharpCodeProvider"):

<system.codedom>
    <compilers>
        <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
            <providerOption name="CompilerVersion" value="v4.0"/>
        </compiler>
        <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
</system.codedom>
Uwe Keim
fuente
3
Con respecto a su solución 2, la Microsoft.CSharp.CSharpCodeProviderversión 4.0 significa que no está utilizando Rosyln, por lo tanto, no funcionará para C # 6.0.
jbtule
1
Al migrar desde una solución anterior, asegúrese <LangVersion>de que el csprojarchivo sea igual a 6. Puede causar problemas si es otra cosa.
Saul
7

Esto no es para un proyecto de sitio web . Así es como lo hace para un proyecto ASP.NET MVC.

Puede alternar C # 6 en la interfaz de usuario de Visual Studio. Esta es una opción tan fácil que vale la pena intentarlo primero.

  1. Haga clic derecho en su proyecto y seleccione Propiedades .
  2. Haz clic en la pestaña Construir .
  3. La pestaña de compilación tiene un botón Avanzado ... en la parte inferior.
  4. Esto abre la Configuración de compilación avanzada como se muestra a continuación. Seleccione C # 6.0.

ingrese la descripción de la imagen aquí

Encadenar
fuente
@ Manuzor, puede que tengas razón. Esto fue para un proyecto ASP.NET MVC.
Jess
@Ucho, ¿qué pasa? ¿Es un proyecto MVC? ¿Tiene la opción Avanzada en la configuración de compilación? ¿Le faltan opciones para la versión de lenguaje C #? ¿Configuraste la versión y no pudiste usar las funciones de idioma?
Jess
@Jess: Ah, probablemente esté funcionando. No noté que mi error proviene de IntelliSense, no de la compilación.
Ucho
Esta configuración no parece aplicarse al código en páginas aspx, por ejemplo <% Eval(whatever) %>.
Chris
5

Así es como se ve en VS2017 con un proyecto de sitio web:

ingrese la descripción de la imagen aquí

b_levitt
fuente
Aprecio el trabajo de recorte @Uwe pero no creo estar de acuerdo con eliminar el resto de la navegación superior ya que se pierde el contexto de dónde debería estar este elemento de menú en particular.
b_levitt
1
El último VS 2017 ha trasladado esto a 'Build -> ASP.NET Compilation'. Ver mi respuesta actualizada.
Vértigo
Para los tipos de proyectos de sitios web probé la respuesta de @ b_levitt en VS2019. (1) Asegúrese de tener un web.config. Si no, agregue uno. (2) Guarde la solución seleccionándola en el Explorador de soluciones y emitiendo [Ctrl] + [S]. (3) Seleccione el proyecto en el Explorador de soluciones y cambie el Marco de destino a 4.7.2 (4) Seleccione la opción "Habilitar la última C # ..." en el menú Generar> Compilación ASP.NET.
Denny Jacob
2

Recibí este error después de hacer CERO cambios en mi proyecto WebAPI. Desinstalé el paquete nuget DotNetCompilerPlatform y lo reinstalé, lo que solucionó el problema.

Adelante
fuente