Erro “Membro necessário do compilador ausente” sendo gerado várias vezes com quase nenhuma alteração no código

94

Hoje, depois de implantar algumas alterações em um site C # MVC que executo, voltei para fazer mais algumas modificações e encontrei este erro:

Membro necessário do compilador ausente System.Runtime.CompilerServices.ExtensionAttribute..ctor

O erro é um pouco vago (além da descrição, obviamente), pois não me dá um arquivo, linha ou coluna para referência, apenas o projeto. Além disso, ele gera o erro um total de 20 vezes. Só fiz três alterações no código entre o momento da implantação (estava totalmente funcional naquela época) e agora. Revertei minhas alterações e ainda está jogando o mesmo erro que não faz sentido para mim.

Não encontrei muitas informações sobre esse erro no SO ou no Google, além da solução desse pessoal e algumas referências a alguns erros de projeto Mono (não estou usando Mono). A solução que o cara acima dá requer a adição de uma definição de classe que permitirá ao compilador resolver a referência. Particularmente, não quero fazer isso porque não precisei fazer isso até este ponto e só vai bagunçar meu código.

Só estou curioso se alguém já passou por isso antes. Desde já, obrigado!

Jamesmillerio
fonte
1
Parece que você está usando um compilador C # 3.0, mas compilando com o .NET Framework 2.0. Verifique suas referências de montagem.
dtb

Respostas:

27

Este erro geralmente significa que seu projeto está compilando em .NET 2.0 ou você não está referenciando a versão correta de System.Core.dll

Para uma pergunta quase duplicada, consulte Erro ao usar métodos de extensão em C #

Robert Levy
fonte
Na verdade, descobri que eu tinha uma referência incorreta de um assembly que não estava mais usando (Azure). Não acho que o assembly do Azure foi compilado em .Net 2.0, mas removê-lo corrigiu o problema. Não sei por que isso aconteceu aleatoriamente, já que não toquei em nada relacionado aos meus assemblies ou à versão .Net (4.0) há algum tempo. Ai, obrigado por me apontar na direção certa.
Jamesmillerio
Unity3D configura o compilador para .NET 2 por padrão (no momento da escrita). Nas configurações do player, mude para a versão .NET mais recente para corrigir esse problema.
Shadow
230

No meu caso foi porque o projeto não estava referenciando Microsoft.CSharp. Depois de adicionar uma referência a esse assembly, ele compilou perfeitamente.

Mike
fonte
3
Resolveu o problema.
Anton Lyhin
16
Meu problema estava em um Teste Unitário usando objeto dinâmico e Expando. Fazer referência a Microsoft.CSharp era o truque. Obrigado!
realPT de
1
Eu tinha o tipo dinâmico NewtonSoft etc Na biblioteca de classes .NetStandard: `` `string weatherjson = await GetAsync (url); obj dinâmico = JsonConvert.DeserializeObject (weatherjson); temp dinâmico = obj.main.temp; `` `Fiz o Nuget Search for Microsoft.CSharp e instalei. A biblioteca agora é construída :) P. Posso usar esta biblioteca .NetStandard no aplicativo Linux, dada a referência da Microsofct?
David Jones
Obrigado! Por alguma razão, isso não era óbvio para mim na mensagem! Estou ajustando um projeto escrito há muito tempo e esse material de referência é assustador. Faz alguém apreciar a clareza relativa do Java que normalmente uso.
Tuntable
82

Não sei se mais alguém já passou por isso, mas de repente vejo esse erro depois de adicionar alguns códigos utilizando dynamictipos e incorporar WebAPI em um projeto que se originou como um aplicativo TypeScript no VS2013. Simplesmente adicionar uma referência ao Microsoft.CSharp resolveu meu problema.

Espero que isso ajude mais alguém.

H Boyce
fonte
3
Esse era exatamente o meu problema. Adicionar dinâmica quebrou misteriosamente o projeto.
SouthShoreAK
2
O mesmo para mim, usando dinâmico com .NetStandard2.0, tive que instalar C # Nuget para compilar
Mahmoud Hanafy
17

Eu também me deparei com essa situação hoje. No meu caso, eu estava fazendo referência à dll Newton.Json.Net v3.5 em meu aplicativo .NET 4.0. Percebi que nem estava usando essa biblioteca, portanto, uma vez que a removi das minhas referências, ela não me dava mais o erro do compilador.

Problema resolvido!!!

Bat_Programmer
fonte
2
O mesmo para mim, Newton.Json.Net dll causou o problema!
Julien Pierre
No meu caso, o motivo foi a versão NET20 errada do AntiXSSLibrary.dll da Microsoft. Substituído por NET35 - o erro desapareceu.
Denis
7

O erro real vem do fato de que o assembly 2.0 que causa o erro contém este código:

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}

O código acima permite que o .NET 2.0 Assembly use métodos de extensão (consulte Usando métodos de extensão no .NET 2.0? ). Embora isso confunda o compilador se você direcionar o .NET 4.0 e fazer referência a um assembly 2.0 (contendo o código acima), pois mscorlib.dll (4.0) contém a mesma classe no mesmo namespace.

Eu consertei isso

  • compilando o assembly 2.0 original novamente sem o atributo que visa 4.0
  • removendo o conjunto (obviamente)
  • adicionando um terceiro Atributo de extensão no destino que você compilar (parece anular as definições referenciadas)
Console
fonte
Este é exatamente o meu problema, vou tentar suas instruções e postar de volta.
John Peters
6

Escrever este código em algum lugar do seu projeto pode resolver o seu problema. Funciona para mim

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}
Jalal Ahmadi Tabriz
fonte
onde você escreve este código? você criou uma classe na raiz do projeto?
Alex
1
@Alex Eu adicionei uma classe chamada CompilerService à raiz do meu projeto com o código aboce e funcionou. Agradável!
Halvard
4

NLog.dll 2.0 referenciado de um projeto .NET 4.0 também pode causar isso.

Queijo
fonte
O NLog para .NET 2.0, referenciado a partir de um .NET 3.5, parece apresentar erros semelhantes.
Pedro
3

Provavelmente você usa a dynamicpalavra-chave no projeto de biblioteca de classes .NetStandard. Nesse caso, você precisa adicionar uma referência à Microsoft.CSharpbiblioteca no projeto. Espero que isso resolva seu problema.

Towhidul Islam Tuhin
fonte
2

Não tenho uma solução correta, mas adicionarei meu ponto de dados:

No meu caso, o erro é causado pela referência a GoogleSearchAPINet20

Aqui está o que acontece:

  • Eu fecho a solução que constrói
  • Abro a solução novamente. Ainda constrói
  • Assim que faço qualquer alteração e tento construir, recebo 19 erros de "Membro necessário do compilador ausente ..."
  • Eu removo a referência a GoogleSearchAPINet20
  • Eu adiciono de volta a referência a GoogleSearchAPINet20
  • Eu construo a solução. Constrói sem erros
  • Agora posso fazer alterações no código, criar ou executar quaisquer outras ações com a solução corretamente, desde que meu Visual Studio esteja aberto
  • Eu fecho o Visual Studio
  • Repita a partir do primeiro passo

Não estou fazendo referência a System.Core.dll em minha solução e minha estrutura de destino é .NET 4.

Estou um pouco irritado neste ponto ...

Evgeny
fonte
1

Recebi este erro ao tentar usar tarefas assíncronas no .NET 4.0. Atualizar o Target Framework para 4.5.2 corrigiu o problema.

Eterno 21
fonte
1

Eu atingi o mesmo conjunto de exceções depois de adicionar alguns métodos assíncronos a um projeto winforms. Eu precisava aumentar minha versão .NET de 4 para 4.5

user8675309
fonte
0

Para mim, o problema ocorre quando adiciono o método assíncrono com async Task await no meu projeto .net4.0!

Com versões anteriores do .NET-Framework 4.5, você deve instalar este pacote:

Install-package Microsoft.Bcl.Async pre

ou

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

mais informações sobre Nuget ou Nuget

A. Morel
fonte