在 C# 中使用扩展方法时出错
Posted
技术标签:
【中文标题】在 C# 中使用扩展方法时出错【英文标题】:Error when using extension methods in C# 【发布时间】:2010-09-17 08:46:32 【问题描述】:我遇到了一个问题,让我认为 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
我已经有几个月没有使用扩展方法了,但我很确定我不必这样做。有没有其他人遇到过这个问题?
【问题讨论】:
我在项目属性中将目标框架设置为 3.5。 在这种情况下,我想知道您引用的程序集之一 also 是否声明了此属性(感谢从 .NET 2.0 升级到 C# 3.0),并且编译器是很难选择使用哪一个?您是否在仅使用 StringUtils 等的普通(干净)项目中遇到此问题? (意思是:不是System.Core.dll,可能有内部构造函数) 相关:Catch-22 with self-defined ExtensionAttribute 如果您需要针对旧的框架版本,则会出现此错误。不知道几岁,但当我不得不针对 .Net Framework 2.0 时,我得到了它。上述解决方案有效。 【参考方案1】:我也有同样的问题。错误 System.Runtime.CompilerServices.ExtensionAttribute..ctor
相当神秘,可能意味着许多不同的事情。
但是,对我来说,归结为我使用的是Newtonsoft.Json.Net
。我删除了对文件Newtonsoft.Json.Net20.dll
的引用,并重新添加了它。在此之后我的解决方案再次构建。
最奇怪的是,当我试图通过使用 Subversion Diff 找出这个过程之后有什么不同时,似乎什么都没有改变。
所以我真的不知道删除和重新添加此引用的真正作用,但它确实解决了我的构建问题,并解决了提问者提到的这个特定错误消息。
更新 1:
对于那些再次遇到此问题的人,正如评论者指出的那样,解决此问题的正确方法是 Download Json.Net's ZIP,并且应该有一个 3.5 版本,在您使用 Json 的每个地方重新引用 3.5 .Net 并删除旧引用,因为它可能引用了为旧版本 .net 构建的程序集。
更新 2:
Charlie Flowers 指出 DLL NewtonSoft 标签为 3.5 实际上不适用于 3.5。您必须使用他们标记为 .net 2.0 的 DLL
【讨论】:
如果你在 .NET 3.5 环境中使用 Json.NET,你应该使用 .NET 3.5 的构建,而不是像现在这样的 2.0。 3.5 版本不包含 ExtensionAttribute 类。 +1 我遇到了完全相同的问题。作为 James Newton-King 的旁注,我还将 Json.NET 2.0 与 .NET 3.5 一起使用,因为在相当现代的 mono 版本(例如,来自 Ubuntu 9.10 的库存构建)上,json.net 依赖于一些奇怪的 DLL,这些 DLL 不是还支持。所以我用旧版本的 json.net 编译它,它已经工作了好几个月了。 +1 这也是我的问题。我认为 Json.NET 的 newtonsoft.json.dll 版本是针对 .net 1 编译的 伙计,我刚刚在这上面浪费了一个小时。感谢您的回答。 dll newtonsoft 标签为 3.5 实际上不适用于 3.5。您必须使用他们标记为 .net 2.0 的 dll。 这应该是公认的答案。 Newtonsoft.Json.Net20 是罪魁祸首!【参考方案2】:我自己也遇到了这个问题。 就我而言,这是因为我将 VS 2005/.Net 2.0 项目转换为 VS 2008/.Net 3.5 项目。转换工具保留了对 System.Core 2.0 的引用,我找不到简单的方法来更改对 System.Core 3.5 的引用。
我最终在 VS 2008 中从头开始重新创建该项目,并且它是在正确引用 System.Core 3.5 的情况下创建的
【讨论】:
【参考方案3】:在 VS 中,单击项目(文件、编辑、视图旁边),选择属性
然后在 Application 选项卡中(您会注意到您已经在 3.5 中),选择 Target Framework 为 2.0,然后编译(它会出错)。然后再放回3.5,再编译,错误就消失了
我认为这只是 Visual Studio 中的一个小故障,只是愚弄 IDE :-)
【讨论】:
我遇到了这个问题,这是唯一对我有用的解决方案(在 VS 内部)。 确实很奇怪,但它也对我有用!无法反驳,谢谢!【参考方案4】:我在从 VS 2008 升级到 VS 2010 Beta 2 的类库项目中遇到了同样的问题。直到升级之后我才向项目添加任何扩展方法,然后我开始看到同样的错误。
在项目中添加一个具有以下代码的类解决了这个问题:
namespace System.Runtime.CompilerServices
public class ExtensionAttribute : Attribute
在此博客上找到提示:http://blog.flexforcefive.com/?p=105
【讨论】:
链接已损坏...另外,这个hack puts you into a serious catch-22 situation【参考方案5】:您的框架对于扩展方法来说不够高。 这是一个 hack 用于使扩展方法在不使用 3.5 的情况下工作
【讨论】:
【参考方案6】:您的目标是什么版本的 .NET? ExtensionAttribute 类在 System.Core.dll (.NET 3.5) 中提供,但如果您想在 .NET 2.0/3.0(显然是 C# 3.0)中使用扩展方法,您可以自己重新声明它。事实上,LINQBridge 就是这样做的。
[update] 但是,我有点困惑,因为您应该看到的错误是:
错误 1 无法定义新的扩展 方法,因为编译器需要 类型 'System.Runtime.CompilerServices.ExtensionAttribute' 找不到。你错过了一个 参考 System.Core.dll? [剪掉一些路径的东西]
【讨论】:
【参考方案7】:缺少 System.Core 引用会出现这些症状。
【讨论】:
【参考方案8】:供持续参考:
在过去的两个小时里,我在 .Net 4.0 框架中一直在与这个完全相同的错误消息作斗争,最终将其追踪到对 Microsoft.CSharp dll 的损坏引用。这是一个简单得令人沮丧的问题。我删除了有问题的引用并添加了对该 dll 的“新”引用,该引用位于:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll
希望这将节省其他人的时间和精力来寻找此错误消息的解决方案。
【讨论】:
我也是这样。但是,我不必查找任何文件,我只需要“添加参考”并在“程序集”下搜索“csharp”。在那里,我能够选择提到的参考,从那时起一切正常。【参考方案9】:这个问题确实是由于对 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>
【讨论】:
【参考方案10】:扩展是在 C# 3.0 中引入的,而另一方面是在 .NET 3.5 中引入的,因此您不能真正在 .NET 3.0 中直接使用它们。
【讨论】:
【参考方案11】:这是一个网站项目,偶然吗?尝试将目标框架从 .NET 3.5 更改为早期版本,然后再改回 .NET 3.5。
【讨论】:
【参考方案12】:尝试:Project,Add Reference,在列表中找到System Core 3.5.0.0,确定添加。
【讨论】:
【参考方案13】:只需将您的 VS 项目定位到 .NET 框架 3.5 及更高版本。很可能您从以前的版本转换了您的项目。
【讨论】:
【参考方案14】:我有一个 Elmah.Sandbox 版本,它在现有的 .Net 4.0 项目中以 .net 2.0 为目标。我在我的项目中添加了一个扩展方法,但构建失败并出现“缺少编译器所需的成员”错误消息。
Elmah.Sandbox dll 是 ElmahR 早期版本的一部分。删除后,一切都会重新构建。
【讨论】:
【参考方案15】:在我的情况下,原因是 Microsoft AntiXSSLibrary.dll 的 NET20 版本错误。替换为 NET35 - 错误消失了。
【讨论】:
【参考方案16】:编辑您的 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" />
【讨论】:
以上是关于在 C# 中使用扩展方法时出错的主要内容,如果未能解决你的问题,请参考以下文章