Como usar o C # 6 com o tipo de projeto Site?

126

Atualizado um tipo de projeto existente do site Visual Studio 2015, alterei o Framework para 4.6.

Eu esperava ter todos esses novos recursos disponíveis no meu código por trás dos arquivos.

Infelizmente, estou recebendo erros como:

Erro CS8026: O recurso 'propriedade corporal da expressão' não está disponível no C # 5. Use o idioma versão 6 ou superior.

ou por exemplo:

Erro CS8026: O recurso 'seqüências de caracteres interpoladas' não está disponível no C # 5. Use o idioma versão 6 ou superior.

Fiz uma rápida verificação no Google e encontrei um cara postando alguns comentários em um post do ScottGu (pesquise "8026" na página).

Como eu não entendo a solução dele, e quero que a solução seja mais visível, criei esta publicação de SO.

Minha pergunta:

Como posso ter um projeto do Visual Studio 2015 do tipo Site (por exemplo, não Aplicativo da Web ) para reconhecer os recursos do C # 6?

Uwe Keim
fonte
1
Você já tentou adicionar os elementos de configuração que ele mencionou no comentário?
scheien
Estou prestes a fazer isso, mas parece muito estranho para mim , então eu estava esperando alguma solução mais limpa.
Uwe Keim
5
Obviamente, a outra opção é parar de usar esses "projetos" do site e usar os Projetos de Aplicativos da Web.
John Saunders
1
@JohnSaunders Eu adoraria fazer isso. Como a migração é uma tarefa manual, receio o tempo que levará e todos os erros que introduzirei durante a migração. Fiz isso algumas vezes para projetos menores. Sempre foi um aborrecimento ...
Uwe Keim
1
Que bom que você considerou. O comentário foi principalmente para outros leitores que podem pensar que um projeto de "site" soa como o que eles querem.
John Saunders

Respostas:

118

Eu testei isso com o ASP.NET MVC 5 (teste 5.2.3) e sua milhagem pode variar com outras estruturas da web, mas você só precisa adicionar o Roslyn CodeDOM | Pacote NuGet

Provedores CodeDOM para .NET Compiler ...

Fornecedores de CodeDOM de substituição que usam o novo compilador .NET Compiler Platform ("Roslyn") como APIs de serviço. Isso fornece suporte para novos recursos de linguagem em sistemas que usam CodeDOM (por exemplo, compilação em tempo de execução ASP.NET), além de melhorar o desempenho da compilação desses sistemas.

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

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

O pacote NuGet deve adicionar os arquivos DLL e adicionar o seguinte ao seu 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>

Se ainda estiver faltando. Tente se adicionar.

jbtule
fonte
1
Isso funciona conforme o esperado. C # 6 agora disponível. A desvantagem é que meu App_GlobalResources / Resources.resx não gera a classe automática para acessar os recursos fortemente tipados.
Uwe Keim
1
Como uma nota, consegui criar sem erros depois que o destino do projeto foi alterado para 4,6. No entanto, eu precisava instalar este pacote para resolver rabiscos vermelhos aparecendo no intellisense.
Doug Morrow
7
Estou usando isso em um site WebForms (sem arquivo de projeto). Infelizmente, alterações simples .aspx acionam uma recompilação dolorosamente mais lenta ao solicitar novamente a página em um navegador. Talvez Roslyn seja teoricamente mais rápida para um WebApplication (com arquivo proj), mas para sites parece ser significativamente mais lento via csc na pasta App_Code ... Alguém está vendo a mesma coisa?
Stefan Anghel
4
Observe que, para WebForms compilar com C # 6, você precisa instalar os pacotes NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatforme sua dependênciaMicrosoft.Net.Compilers
3
Observe que se você tiver mais de um site em sua solução - as coisas não funcionarão, a maneira mais fácil de reproduzir é criar uma solução vazia e começar a adicionar projetos a ela, após o segundo site - você começará a receber "Não é possível encontrar o csc.exe" erros
mac
67

Veja também esta postagem do blog de Sayed Ibrahim Hashimi sobre como fazer isso por meio do VS IDE.

No Visual Studio 2015, atualização 1, incluímos um novo recurso para simplificar isso. Quando você tem uma solução aberta que possui pelo menos um projeto da web direcionado ao .NET 4.5+ e não possui o pacote DotNetCompilerPlatform NuGet no menu Projeto, você verá uma nova opção: Ativar C # 6 / VB 14.
insira a descrição da imagem aqui

Atualizar.

O VS 2017 e 2019 mudaram esse recurso para Build -> Compilação do ASP.NET . insira a descrição da imagem aqui

Vertigem
fonte
2
Você sabe onde esse item está no Visual Studio 2019?
Protector one
4
@ protector-one Build -> Compilação do ASP.NET
Vertigo
1
Abri um projeto de site baseado em pasta mais antigo no VS2019 e tive que Arquivo> Salvar o projeto antes que essa opção fosse exibida.
Corgalore 03/01
15

Instalei o DotNetCompilerPlatform como o @jbtule sugeriu, mas ainda estava recebendo os mesmos erros.

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

Fechei a solução, excluí as pastas bin e obj, abri a solução e reconstruí-la. Agora, os recursos do C # 6 funcionam.

Jon Crowell
fonte
3
Apenas fechar e reabrir o VS funcionou para mim (depois Install-Package ...). Também visando 4.6.
rwalter 28/07
1
Isso funcionou para mim, também notar usando ReSharper pode mostrar u falsos erros, me levou um tempo para descobrir por que eu recebo "Não é possível símbolo determinação" todo o ponto de vista ...
Niklas
1
No meu caso, eu apenas tive que esperar cerca de 30 segundos após reabrir a solução e ela funcionou sem ter que excluir bine obj.
Marc.2377
12

Possíveis soluções, extraídas dos comentários na postagem no blog de ScottGu (pesquise "8026" na página):

Sugestão de solução 1 (David Taylor)

Adicione estes elementos de código dom RTM ao 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>

Em seguida, adicione os itens Roslyn e Microsoft.CodeDom.Providers. *. Dll ao diretório BIN.

É fácil de configurar, mas era estranho para mim que o modelo padrão não estivesse configurado para ele se você selecionasse o .NET 4.6 ao criar um novo "Site" no VS 2015 RTM.

Sugestão de solução 2 (Martin)

Além do comentário de David Taylor acima, parece que as configurações system.codedom estão corretas quando um Web App é criado com o TargetFramework como o padrão v4.5.2. Alterar o TargetFramework para v4.6 parece modificar as configurações do compilador do CSharp, de uma maneira que causa um problema.

Minhas soluções alternativas foram as seguintes:

  1. Arquivo / Novo / Aplicativo Web ASP.NET
  2. Selecione o modelo "Web API" nos modelos do ASP.NET 4.5.2
  3. Faça uma cópia do elemento system.codedom (e seu conteúdo) em web.config
  4. Usando Properties / TargetFramework, defina o Target Framework como 4.6
  5. Substitua o elemento system.codedom modificado em web.config pela cópia tirada antes de alterar o TargetFramework
  6. Acertar F5

A página inicial deve carregar conforme o esperado.

Para informações, o conteúdo system.codedom imediatamente após alterar o TargetFramework para v4.6. foi o seguinte (observe o uso do 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
fonte
3
Em relação à sua solução 2, a Microsoft.CSharp.CSharpCodeProviderversão 4.0 significa que não está usando o Rosyln. Portanto, não funcionará no C # 6.0.
Jbtule
1
Ao migrar de uma solução mais antiga, verifique se <LangVersion>o csprojarquivo é igual a 6. Pode causar problemas se for outra coisa.
Saul
7

Isso não é para um projeto de site . É assim que você faz para um projeto ASP.NET MVC.

Você pode alternar C # 6 na interface do Visual Studio. Esta é uma opção tão fácil, vale a pena tentar primeiro.

  1. Clique com o botão direito do mouse no seu projeto e selecione Propriedades .
  2. Clique na guia Build .
  3. A guia de criação possui um botão Avançado ... na parte inferior.
  4. Isso abre as Configurações avançadas de compilação, como mostrado abaixo. Selecione C # 6.0.

insira a descrição da imagem aqui

Jess
fonte
@ Manuzor, você pode estar certo. Isso foi para um projeto do ASP.NET MVC.
21417 Jess
@ Ucho, o que está errado? É um projeto MVC? Você tem a opção Avançado nas configurações de compilação? Faltam opções para a versão do idioma C #? Você definiu a versão e não conseguiu usar os recursos de idioma?
Jess
@ Jess: Ah, provavelmente está funcionando. Eu não percebi que meu erro veio do IntelliSense e não da compilação.
Ucho 17/10
Essa configuração parece não se aplicar ao código em páginas aspx, por exemplo <% Eval(whatever) %>.
Chris
5

Aqui está o que parece no VS2017 com um projeto de site:

insira a descrição da imagem aqui

b_levitt
fonte
Aprecio o trabalho de corte @Uwe, mas acho que não concordo em remover o restante da navegação superior, pois o contexto está perdido para onde esse item de menu específico deve estar.
precisa saber é o seguinte
1
O VS 2017 mais recente mudou isso para 'Compilar -> Compilação do ASP.NET'. Veja minha resposta atualizada.
Vertigo
Para tipos de projeto de site, testei a resposta de @ b_levitt no VS2019. (1) Verifique se você possui um web.config. Caso contrário, adicione um. (2) Salve a solução selecionando-a no Gerenciador de Soluções e emitindo [Ctrl] + [S]. (3) Selecione o projeto no Solution Explorer e altere o Target Framework para 4.7.2 (4) Selecione a opção "Enable latest C # ..." no menu Build> ASP.NET Compilation.
Denny Jacob
2

Eu recebi esse erro depois de fazer ZERO alterações no meu projeto WebAPI. Desinstalei o pacote de nuget DotNetCompilerPlatform e reinstalei, o que corrigiu o problema.

Entre
fonte