59

我遇到了一个问题,让我认为 3.0 框架中存在错误。当我尝试使用扩展方法时,出现以下错误:

Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'

使用此简单代码时:

public static class StringUtils {
    static void TestExtension(this String targetString) {

    }
}

消除此编译错误的唯一方法是添加以下代码:

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

自从我使用扩展方法以来已经有几个月了,但我很确定我不必这样做。有没有其他人遇到过这个问题?

4

16 回答 16

73

我有完全一样的问题。该错误System.Runtime.CompilerServices.ExtensionAttribute..ctor相当神秘,可能意味着许多不同的事情。

但是,对我来说,归结为我正在使用Newtonsoft.Json.Net. 我删除了对文件的引用Newtonsoft.Json.Net20.dll,然后重新添加了它。在此之后,我的解决方案再次构建。

最奇怪的是,当我试图通过使用 Subversion Diff 找出这个过程之后有什么不同时,似乎没有任何改变。

所以我真的不知道删除和重新添加这个引用到底做了什么,但它确实解决了我的构建问题,并解决了提问者提到的这个特定错误消息。

更新 1

对于那些再次遇到此问题的人,正如评论者指出的那样,解决此问题的正确方法是下载 Json.Net 的 ZIP,并且应该有一个 3.5 版本,在您使用 Json.Net 的每个地方重新引用 3.5 并删除旧引用,因为它可能引用了为旧版本的 .net 构建的程序集。

更新 2

Charlie Flowers指出,用于 ​​3.5 的 DLL NewtonSoft 标签实际上不适用于 3.5。您必须使用他们标记为 .net 2.0 的 DLL

于 2010-02-01T19:41:43.677 回答
20

我自己也遇到了这个问题。就我而言,这是因为我将 VS 2005/.Net 2.0 项目转换为 VS 2008/.Net 3.5 项目。转换工具保留了对 System.Core 2.0 的引用,我找不到一种简单的方法来更改对 System.Core 3.5 的引用。

我最终在 VS 2008 中从头开始重新创建该项目,并且它是通过对 System.Core 3.5 的正确引用创建的

于 2008-12-03T19:38:33.713 回答
17

在 VS 中,单击项目(在文件、编辑、视图旁边),选择属性

然后在 Application 选项卡中(您会注意到您已经在 3.5 中),选择 Target Framework 为 2.0,然后编译(它会出错)。然后再放回3.5,再编译,错误就会消失

我认为这只是 Visual Studio 中的一个小故障,只是愚弄 IDE :-)

于 2008-12-20T17:34:28.087 回答
16

我在从 VS 2008 升级到 VS 2010 Beta 2 的类库项目中遇到了同样的问题。直到升级后我才向项目添加任何扩展方法,然后我开始看到同样的错误。

将具有以下代码的类添加到项目中解决了该问题:

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

在此博客上找到提示:http ://blog.flexforcefive.com/?p=105

于 2010-01-16T21:02:05.773 回答
6

您的框架对于扩展方法来说不够高。
这是使扩展方法在不使用 3.5 的情况下工作的技巧

于 2008-10-15T17:34:04.080 回答
3

您的目标是什么版本的 .NET?ExtensionAttribute 类在 System.Core.dll (.NET 3.5) 中提供,但如果您想在 .NET 2.0/3.0(显然是 C# 3.0)中使用扩展方法,您可以自己重新声明它。事实上,LINQBridge 就是这样做的。

[更新] 但是,我有点困惑,因为您应该看到的错误是:

错误 1 ​​无法定义新的扩展方法,因为找不到编译器所需的类型“System.Runtime.CompilerServices.ExtensionAttribute”。您是否缺少对 System.Core.dll 的引用?[剪掉一些路径的东西]

于 2008-10-15T17:34:12.707 回答
2

缺少 System.Core 参考将给出这些症状。

于 2008-10-15T21:54:38.297 回答
2

供持续参考:

在过去的两个小时里,我在 .Net 4.0 框架中与这个完全相同的错误消息作斗争,最后将其追踪到对 Microsoft.CSharp dll 的损坏引用。这是一个简单得令人沮丧的问题。我删除了有问题的引用并添加了对该 dll 的“新”引用,该 dll 位于:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll

希望这将节省其他人跟踪此错误消息的解决方案的时间和麻烦。

于 2014-09-12T19:36:51.580 回答
1

这个问题确实是由对 System.Core 版本 2 的错误引用引起的。这通常是从早期版本的 .NET 升级到 .NET 3.5 时引起的。如果是您遇到此问题的网站,则可以按照以下步骤进行补救:

1) 在 web.config 中添加对 System.Core v3.5 的引用:

<assemblies>
   <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>

2) 在 web.config 中添加以下内容作为配置的子项:

<configuration>
   <!--Some other config-->
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
         <assemblyIdentity name="System.Core" publicKeyToken="B77A5C561934E089"/>
         <bindingRedirect oldVersion="2.0.0.0-2.1.0.0" newVersion="3.5.0.0"/>
      </dependentAssembly>
   </assemblyBinding>
</configuration>
于 2009-02-23T12:51:18.960 回答
0

扩展是在 C# 3.0 中引入的,而另一方面是在 .NET 3.5 中引入的,因此您不能真正在 .NET 3.0 中直接使用它们。

于 2008-10-15T17:36:15.167 回答
0

这是一个网站项目,偶然吗?尝试将目标框架从 .NET 3.5 更改为早期版本,然后再改回 .NET 3.5。

于 2008-10-15T17:48:20.307 回答
0

尝试:Project,Add Reference,在列表中找到System Core 3.5.0.0,确定添加。

于 2008-12-25T17:52:55.003 回答
0

只需将您的 VS 项目定位到 .NET 框架 3.5 及更高版本。很可能您从以前的版本转换了您的项目。

于 2011-04-05T04:48:45.443 回答
0

我有一个 Elmah.Sandbox 版本,它在现有的 .Net 4.0 项目中以 .net 2.0 为目标。我在我的项目中添加了一个扩展方法,构建失败并出现“缺少编译器所需的成员”错误消息。

Elmah.Sandbox dll 包含在 ElmahR 的早期版本中。一旦这个被删除,它就会重新构建。

于 2012-10-31T11:40:15.680 回答
0

在我的例子中,原因是微软的 AntiXSSLibrary.dll 的 NET20 版本错误。替换为 NET35 - 错误消失了。

于 2015-11-25T21:19:48.767 回答
0

编辑您的 csproj 并确保包含这些引用(它不会通过简单的“添加引用”...):

<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
于 2016-04-05T09:25:52.040 回答