El error "Falta el miembro obligatorio del compilador" se genera varias veces sin apenas cambios en el código.

94

Hoy, después de implementar algunos cambios en un sitio de C # MVC que ejecuto, volví para hacer algunas modificaciones más y encontré este error:

Falta el miembro obligatorio del compilador System.Runtime.CompilerServices.ExtensionAttribute..ctor

El error es un poco vago (aparte de su descripción, obviamente) ya que no me da un archivo, línea o columna para hacer referencia, solo el proyecto. Además, arroja el error un total de 20 veces. Solo hice tres cambios en el código entre el momento en que lo implementé (era completamente funcional en ese momento) y ahora. Revertí mis cambios y todavía arroja el mismo error que no tiene sentido para mí.

No he encontrado mucha información sobre este error en SO o Google, aparte de la solución de este tipo y un par de referencias a algunos errores del proyecto Mono (no estoy usando Mono). La solución que da el tipo anterior requiere agregar una definición de clase que permitirá al compilador resolver la referencia. En particular, no quiero hacer esto porque no he necesitado hacerlo hasta este punto y solo enturbiará mi código.

Solo tengo curiosidad por saber si alguien se ha encontrado con esto antes. ¡Gracias por adelantado!

jamesmillerio
fuente
1
Parece que está utilizando un compilador de C # 3.0 pero compilando con .NET Framework 2.0. Verifique sus referencias de ensamblaje.
dtb

Respuestas:

27

Este error generalmente significa que su proyecto se está compilando contra .NET 2.0 o no está haciendo referencia a la versión correcta de System.Core.dll

Para una pregunta casi duplicada, consulte Error al usar métodos de extensión en C #

Robert Levy
fuente
De hecho, resultó que tenía una mala referencia de un ensamblado que ya no usaba (Azure). No creo que el ensamblado de Azure se compiló con .Net 2.0, pero eliminarlo solucionó el problema. No estoy seguro de por qué surgió esto al azar, ya que no he tocado nada relacionado con mis ensamblajes o la versión .Net (4.0) en bastante tiempo. Ay, gracias por señalarme en la dirección correcta.
jamesmillerio
Unity3D establece el compilador en .NET 2 de forma predeterminada (al momento de escribir este artículo). En la configuración del reproductor, cámbielo a la versión más reciente de .NET para solucionar este problema.
Shadow
230

En mi caso fue porque el proyecto no estaba referenciando Microsoft.CSharp. Una vez que agregué una referencia a ese ensamblaje, se compiló bien.

Miguel
fuente
3
Resuelve el problema.
Anton Lyhin
16
Mi problema fue en una prueba unitaria usando objeto dinámico y Expando. Hacer referencia a Microsoft.CSharp fue el truco. ¡Gracias!
realPT
1
Tenía el tipo dinámico NewtonSoft, etc.En la biblioteca de clases .NetStandard: `` `string weatherjson = await GetAsync (url); obj dinámico = JsonConvert.DeserializeObject (weatherjson); temperatura dinámica = obj.main.temp; `` Hice Nuget Search para Microsoft.CSharp y lo instalé. La biblioteca ahora se compila :) P. ¿Puedo usar esta biblioteca .NetStandard en la aplicación de Linux, dada la referencia de Microsofct?
David Jones
¡Gracias! ¡Por alguna razón, esto no me resultó obvio en el mensaje! Estoy modificando un proyecto escrito hace mucho tiempo y este material de referencia es aterrador. Hace que uno aprecie la relativa claridad de Java que normalmente uso.
Tuntable
82

No sé si alguien más ha experimentado esto, pero de repente me dynamicaparece este error después de agregar código utilizando tipos e incorporar WebAPI en un proyecto que se originó como una aplicación TypeScript en VS2013. Simplemente agregando una referencia a Microsoft.CSharp resolvió mi problema.

Espero que esto ayude a alguien más.

H Boyce
fuente
3
Este era exactamente mi problema. Agregar dinámica rompió misteriosamente el proyecto.
SouthShoreAK
2
Lo mismo para mí, usando dynamic con .NetStandard2.0, tuve que instalar C # Nuget para que se compilara
Mahmoud Hanafy
17

Hoy también me encontré con esta situación. En mi caso, estaba haciendo referencia a Newton.Json.Net dll v3.5 en mi aplicación .NET 4.0. Me di cuenta de que ni siquiera estaba usando esta biblioteca, por lo que una vez que la eliminé de mis referencias, ya no me dio el error del compilador.

¡¡¡Problema resuelto!!!

Bat_Programador
fuente
2
Lo mismo para mí, Newton.Json.Net dll causó el problema.
Julien Pierre
En mi caso, la razón fue la versión NET20 incorrecta de AntiXSSLibrary.dll de Microsoft. Reemplazado con NET35: el error desapareció.
Denis
7

El error real proviene del hecho de que su ensamblado 2.0 que causa el error contiene este código:

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

El código anterior permite que .NET 2.0 Assembly utilice métodos de extensión (consulte ¿ Usar métodos de extensión en .NET 2.0? ). Si bien confunde al compilador si apunta a .NET 4.0 y hace referencia a un ensamblado 2.0 (que contiene el código anterior), ya que mscorlib.dll (4.0) contiene la misma clase en el mismo espacio de nombres.

Arreglé esto

  • compilando el ensamblado original 2.0 nuevamente sin el atributo dirigido a 4.0
  • quitando el conjunto (obviamente)
  • agregando un tercer atributo de extensión en el destino que compila (parece anular las definiciones referenciadas)
Consola
fuente
Este es exactamente mi problema, probaré tus instrucciones y te enviaré una publicación.
John Peters
6

Escribir este código en algún lugar de su proyecto puede resolver su problema. Esto funciona para mi

namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}
Jalal Ahmadi Tabriz
fuente
donde escribes este código? ¿Creaste una clase en la raíz del proyecto?
Alex
1
@Alex Agregué una clase llamada CompilerService a la raíz de mi proyecto con el código anterior y funcionó. ¡Agradable!
Halvard
4

NLog.dll 2.0 referenciado desde un proyecto .NET 4.0 también puede causar esto.

cheesus
fuente
NLog para .NET 2.0, referenciado desde .NET 3.5 parece dar errores similares.
Pedro
3

Probablemente use la dynamicpalabra clave en el proyecto de biblioteca .NetStandard Class. Si es así, debe agregar una referencia a la Microsoft.CSharpbiblioteca en el proyecto. Espero que resuelva su problema.

Towhidul Islam Tuhin
fuente
2

No tengo una solución correcta, pero agregaré mi punto de datos:

En mi caso, el error es causado por hacer referencia a GoogleSearchAPINet20

Esto es lo que sucede:

  • Cierro la solución que construye
  • Abro la solución de nuevo. Todavía se construye
  • Tan pronto como hago algún cambio e intento compilar, obtengo 19 errores "Falta el miembro requerido por el compilador ..."
  • Elimino la referencia a GoogleSearchAPINet20
  • Vuelvo a agregar la referencia a GoogleSearchAPINet20
  • Construyo la solución. Se construye sin errores
  • Ahora puedo hacer cambios de código, compilar o realizar cualquier otra acción con la solución correctamente siempre que mi Visual Studio esté abierto
  • Cierro Visual Studio
  • Repita desde el paso uno

No estoy haciendo referencia a System.Core.dll en mi solución y mi marco de destino es .NET 4.

Estoy un poco molesto en este punto ...

Evgeny
fuente
1

Obtuve este error al intentar usar tareas asíncronas contra .NET 4.0. La actualización de Target Framework a 4.5.2 solucionó el problema.

Eterno21
fuente
1

Llegué al mismo conjunto de excepciones después de agregar algunos métodos asíncronos a un proyecto winforms. Necesitaba subir mi versión .NET de 4 a 4.5

usuario8675309
fuente
0

Para mí, el problema se produce cuando agrego un método asincrónico con async Task await en mi proyecto .net4.0.

Con versiones anteriores de .NET-Framework 4.5, debe instalar este paquete:

Install-package Microsoft.Bcl.Async pre

o

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

más información sobre Nuget o Nuget

A. Morel
fuente