在C#中使用扩展方法时出错

时间:2008-10-15 17:29:08

标签: c# .net-3.5 extension-methods

我遇到了一个让我觉得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 { }
}

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

16 个答案:

答案 0 :(得分:73)

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

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

最奇怪的是,当我尝试使用Subversion Diff找出此过程后的不同之处时,似乎没有任何变化。

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

更新1

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

更新2

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

答案 1 :(得分: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的基础上创建的。

答案 2 :(得分:17)

在VS中

,单击“项目”(“文件”,“编辑”,“查看”旁边),然后选择“属性”

然后在Application选项卡中(你会注意到你已经在3.5中),选择Target Framework到2.0,然后编译(它会出错)。然后再将其重新置于3.5,然后再次编译,错误将消失

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

答案 3 :(得分:16)

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

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

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

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

答案 4 :(得分:5)

您的框架对于扩展方法来说不够高 这是hack,用于使扩展方法无需在3.5

中工作

答案 5 :(得分: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? [剪断了一些路径]

答案 6 :(得分:2)

缺少System.Core引用会产生这些症状。

答案 7 :(得分: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>

答案 8 :(得分:1)

持续参考:

我在.Net 4.0框架中最近两小时与这个完全相同的错误消息进行了斗争,并最终将其追溯到对Microsoft.CSharp dll的损坏引用。这是一个令人沮丧的简单问题。我删除了有问题的引用并添加了一个&#34; new&#34;对位于以下位置的dll的引用:

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

希望这会为其他人节省跟踪此错误消息的解决方案的时间和恶化。

答案 9 :(得分:0)

扩展是在C#3.0中引入的,另一方面是在.NET 3.5中引入的,所以你不能直接在.NET 3.0中使用它们。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

将您的VS项目定位到.NET framework 3.5及更高版本。很可能是你从以前的版本中转换了你的项目。

答案 13 :(得分:0)

我有一个Elmah.Sandbox版本,它在现有的.Net 4.0项目中定位.net 2.0。我为我的项目添加了一个扩展方法,并且构建失败,并显示“Missing compiler required member”错误消息。

Elmah.Sandbox dll是ElmahR早期版本的一部分。一旦删除它,它就会再次构建。

答案 14 :(得分:0)

在我的情况下,原因是Microsoft的AntiXSSLibrary.dll的NET20版本错误。替换为NET35 - 错误消失了。

答案 15 :(得分:0)

编辑你的csproj并确保包含这些引用(它不会通过简单的&#39;添加引用&#39; ...):

<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" />