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

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

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

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

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

我最终从头开始在VS 2008中重新创build项目,并使用适当的System.Core 3.5引用创build它

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

但是,对我来说,这归结于我使用Newtonsoft.Json.Net的事实。 我删除了文件Newtonsoft.Json.Net20.dll的引用,并重新添加它。 在此之后,我的解决scheme再次build立。

最奇怪的是,当我试图通过使用Subversion Diff来查明这个过程之后有什么不同时,什么都没有改变。

所以我真的不知道什么删除和重新添加这个参考真的,但它确实修复了提问者提到的这个特定的错误消息我的生成问题。

更新1

对于那些再次遇到这个,正如comenters指出的,解决这个问题的正确方法是下载Json.Net的ZIP ,并且应该有一个3.5版本,重新引用3.5每个你使用Json.Net和删除旧的引用,因为它可能引用了一个为旧版本.net构build的程序集。

更新2

查理花指出,NewtonSoft的标签为3.5的实际上是不会与3.5。 您必须使用它们标记为.net 2.0的DLL

在VS中,单击Project(在File,Edit,View旁边),selectProperties

然后在应用程序选项卡(你会注意到你已经在3.5),select目标框架2.0,然后编译(这将是错误的)。 然后再把它放回到3.5,然后重新编译,错误将会消失

我认为这只是在Visual Studio中的一个小故障,只是愚弄IDE 🙂

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

用下面的代码添加一个类到项目解决了这个问题:

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

在这个博客上find提示: http : //blog.flexforcefive.com/?p = 105

扩展方法的框架不够高。
这是一个黑客 ,使扩展方法的工作,而不是在3.5

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

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

错误1无法定义新的扩展方法,因为找不到编译器所需的types“System.Runtime.CompilerServices.ExtensionAttribute”。 你是否缺less对System.Core.dll的引用? [剪下一些path的东西]

缺lessSystem.Core引用将会出现这些症状。

这个问题确实是由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的子项:

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

在C#3.0中引入了扩展,而在.NET 3.5中引入了扩展,因此您不能直接在.NET 3.0中使用它们。

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

尝试:Project,添加引用,在列表中findSystem Core 3.5.0.0,然后单击确定添加它。

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

我有一个版本的Elmah.Sandbox在一个现有的.net 4.0项目中使用.net 2.0。 我添加了一个扩展方法到我的项目和生成失败的“缺less编译器所需的成员”错误消息。

Elmah.Sandbox dll被包含在ElmahR的早期版本中。 一旦这个被删除,这一切都build立了。

供持续参考:

我已经在.Net 4.0框架中的最后两个小时中遇到了完全相同的错误消息,并最终将其跟踪到Microsoft.CSharp dll的损坏引用。 这是一个令人沮丧的简单问题。 我删除了违规引用,并添加了一个“新的”引用该dll位于:

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

希望这可以节省其他人追踪这个错误信息的解决scheme的时间和恶化。

在我的情况下,原因是微软的AntiXSSLibrary.dll错误的NET20版本。 用NET35取代 – 错误消失了。

编辑你的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" />