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!


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 #


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.


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.


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!!!


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)

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 { }
}

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.


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.


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 ...


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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.