我遇到了一个让我觉得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 { }
}
自从我使用扩展方法已经有几个月,但我很确定我没有必要这样做。还有其他人遇到过这个问题吗?
答案 0 :(得分:73)
我有完全相同的问题。错误System.Runtime.CompilerServices.ExtensionAttribute..ctor
相当神秘,可能意味着许多不同的事情。
然而,对我来说,归结为我使用的是Newtonsoft.Json.Net
。我删除了对文件Newtonsoft.Json.Net20.dll
的引用,然后重新添加它。在此之后我的解决方案再次构建。
最奇怪的是,当我尝试使用Subversion Diff找出此过程后的不同之处时,似乎没有任何变化。
所以我真的不知道删除和重新添加此引用的确是什么,但它确实解决了我的构建问题,提问者提到的这个特定错误消息。
对于那些再次遇到这种情况的人,正如评论者指出的那样,解决这个问题的正确方法是 Download Json.Net's ZIP,并且应该有一个3.5版本,每个地方重新引用3.5使用Json.Net并删除旧的引用,因为它可能引用了为旧版本的.net构建的程序集。
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)
,单击“项目”(“文件”,“编辑”,“查看”旁边),然后选择“属性”
然后在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" />