多次抛出“缺少编译器所需成员”错误,几乎没有对代码进行任何更改


94

今天,在将一些更改部署到我运行的C#MVC站点后,我回去进行了一些修改,并遇到了此错误:

缺少编译器所需的成员System.Runtime.CompilerServices.ExtensionAttribute..ctor

该错误有点含糊(显然不是其描述),因为它没有给我文件,行或列供参考,仅给我项目。另外,它总共抛出20次错误。从我部署到现在(该功能完全正常)之间,我仅对代码进行了三处更改。我恢复了更改,但仍然抛出相同的错误,这对我来说毫无意义。

除了这种解决方案以及一些关于某些Mono项目错误的引用(我没有使用Mono),我没有在SO或Google上找到关于此错误的大量信息。上面那个家伙给出的解决方案需要添加一个类定义,该类定义将允许编译器解析引用。我并不想这样做,因为直到现在我都不需要这样做,这只会使我的代码变得混乱。

只是好奇是否有人遇到过这个问题。提前致谢!


1
似乎您使用的是C#3.0编译器,但针对.NET Framework 2.0进行了编译。检查您的程序集引用。
2011年

Answers:


27

此错误通常意味着您的项目正在针对.NET 2.0进行编译,或者您未引用的System.Core.dll的正确版本。

有关几乎重复的问题,请参见在C#中使用扩展方法时出错


事实证明,我对不再使用的程序集有不好的引用(Azure)。我认为Azure程序集不是针对.Net 2.0编译的,但是删除它可以解决此问题。我不确定为什么会这样随机产生,因为我已经有一段时间没有接触任何与程序集或.Net版本(4.0)相关的内容了。las,感谢您为我指明了正确的方向。
jamesmillerio

默认情况下(在撰写本文时),Unity3D将编译器设置为.NET 2。在播放器设置中,将其更改为较新的.NET版本以解决此问题。
Shadow

230

就我而言,这是因为该项目未引用Microsoft.CSharp。一旦添加了对该程序集的引用,它就可以正常编译了。


3
解决了问题。
安东·莱因

16
我的问题是在使用动态和Expando对象的单元测试中。引用Microsoft.CSharp是诀窍。谢谢!
realPT

1
我在.NetStandard类库中有动态类型NewtonSoft等:```string weatherjson = await GetAsync(url); 动态obj = JsonConvert.DeserializeObject(weatherjson); 动态温度= obj.main.temp; 我做了Nuget Search for Microsoft.CSharp并安装了它。库现在可以构建:)问:给定Microsofct参考,我可以在Linux应用程序中使用此.NetStandard库吗?
David Jones

谢谢!由于某种原因,这对我来说并不明显!我正在调整一个很久以前编写的项目,此参考资料令人恐惧。使我赞赏我通常使用的Java的相对清晰度。
可调

82

我不知道是否有人遇到过这种情况,但是在添加了一些使用dynamic类型的代码并将WebAPI合并到一个源于VS2013中的TypeScript应用程序的项目中之后,我突然陷入了这个错误。只需添加对Microsoft.CSharp的引用即可解决我的问题。

希望这对其他人有帮助。


3
这正是我的问题。动态添加神秘地打破了项目。
SouthShoreAK '16

2
对我来说也一样,在.NetStandard2.0中使用动态,我必须安装C#Nuget才能进行编译
Mahmoud Hanafy

17

今天我也遇到了这种情况。以我为例,我在.NET 4.0应用程序中引用了Newton.Json.Net dll v3.5。我意识到我什至没有使用这个库,因此一旦将其从引用中删除,它就不再给我编译器错误。

问题解决了!!!


2
对我一样,Newton.Json.Net dll引起了问题!
朱利安·皮埃尔

以我为例,原因是Microsoft的AntiXSSLibrary.dll的NET20版本错误。替换为NET35-错误消失了。
丹尼斯

7

实际错误来自以下事实:导致错误的2.0程序集包含以下代码:

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

上面的代码允许.NET 2.0程序集使用扩展方法(请参阅在.NET 2.0中使用扩展方法?)。如果您以.NET 4.0为目标并引用2.0程序集(包含上面的代码),则会使编译器感到困惑,因为mscorlib.dll(4.0)在同一名称空间中包含相同的类。

我修好了

  • 通过再次编译原始2.0程序集而没有以4.0为目标的属性
  • 通过拆下组件(显然)
  • 通过在您编译的目标中添加第三个扩展属性(似乎推翻了引用的定义)

这正是我的问题,我将尝试您的说明并发回。
约翰·彼得斯

6

在项目中的某处编写此代码可能会解决您的问题。这个对我有用

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

您在哪里编写此代码?您在项目的根目录中创建了一个类?
亚历克斯(Alex)2015年

1
@Alex我使用代码aboce将一个名为CompilerService的类添加到我的项目的根目录,并且可以正常工作。真好!
哈佛

4

从.NET 4.0项目引用的NLog.dll 2.0也可能导致此问题。


从.NET 3.5引用的.NET 2.0的NLog似乎给出了类似的错误。
Pedro

3

可能您dynamic在.NetStandard类库项目中使用关键字。如果是这样,则需要Microsoft.CSharp在项目中添加对库的引用。希望它能解决您的问题。


2

我没有正确的解决方案,但是我将添加数据点:

就我而言,该错误是由引用GoogleSearchAPINet20引起的

这是发生了什么:

  • 我关闭构建的解决方案
  • 我再次打开解决方案。它仍然建立
  • 进行任何更改并尝试构建后,都会出现19个“缺少编译器必需的成员...”错误。
  • 我删除了对GoogleSearchAPINet20的引用
  • 我将引用添加回GoogleSearchAPINet20
  • 我建立解决方案。它建立没有错误
  • 现在,只要打开Visual Studio,我就可以正确地更改代码,使用解决方案构建或执行任何其他操作
  • 我关闭Visual Studio
  • 从第一步重复

我根本没有在解决方案中引用System.Core.dll,我的目标框架是.NET 4。

在这一点上我有点生气...


1

尝试对.NET 4.0使用异步任务时出现此错误。将目标框架更新为4.5.2解决了该问题。


1

在将一些异步方法添加到winforms项目后,我遇到了相同的一组异常。我需要将.NET版本从4提高到4.5


0

对我来说,当我在.net4.0项目中添加带有异步Task的异步方法时,就会出现问题!

对于.NET-Framework 4.5的早期版本,必须安装此软件包:

Install-package Microsoft.Bcl.Async pre

要么

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

有关NugetNuget的更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.