代码之家  ›  专栏  ›  技术社区  ›  Korbin

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

  •  56
  • Korbin  · 技术社区  · 16 年前

    我遇到了一个问题,使我认为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 { }
    }
    

    我已经有几个月没有使用扩展方法了,但我确信我不必这样做。还有人遇到这个问题吗?

    16 回复  |  直到 9 年前
        1
  •  20
  •   abelenky    16 年前

    我自己刚碰到这个问题。 在我的例子中,这是因为我将一个vs 2005/.net 2.0项目转换为一个vs 2008/.net 3.5项目。转换工具保留了对System.Core2.0的引用,我找不到一个简单的方法来更改对System.Core3.5的引用。

    我最终从零开始在vs 2008中重新创建了这个项目,并且它是通过对system.core 3.5的适当引用创建的。

        2
  •  73
  •   Community CDub    8 年前

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

    然而,对我来说,它归结为我正在使用 Newtonsoft.Json.Net . 我删除了对文件的引用 Newtonsoft.Json.Net20.dll ,然后重新添加。在这之后,我的解决方案又建立起来了。

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

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

    更新1 :

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

    更新2 :

    Charlie Flowers 指出,作为3.5的dll newtonsoft标签实际上不适用于3.5。必须使用它们标记为用于.NET 2.0的dll

        3
  •  17
  •   Michael Buen    16 年前

    在vs中,单击项目(文件、编辑、查看旁边),选择属性。

    然后在应用程序选项卡中(您会注意到您已经在3.5中),选择目标框架为2.0,然后编译(它将出错)。然后再把它放回3.5,然后再编译,错误就会消失。

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

        4
  •  16
  •   Andrew Myhre    15 年前

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

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

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

    在此日志中找到了提示: http://blog.flexforcefive.com/?p=105

        5
  •  5
  •   Tom Ritter    16 年前

    您的框架对于扩展方法来说不够高。
    那是一个 hack 使扩展方法工作而不在3.5中

        6
  •  3
  •   Marc Gravell    16 年前

    你的目标是什么版本的.NET?extensionattribute类在system.core.dll(.net 3.5)中提供,但如果您想在.NET 2.0/3.0中使用扩展方法(显然是使用c_3.0),则可以自己重新声明它。事实上, LINQBridge 这样做。

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

    错误1无法定义新扩展名 方法,因为编译器需要 类型 'System.Runtime.CompilerServices.ExtensionAttribute' 找不到。你错过了一个 参考 system.core.dll?[剪下一些路径的东西]

        7
  •  2
  •   jyoung    16 年前

    缺少系统。核心参考将给出这些症状。

        8
  •  1
  •   lexx    16 年前

    这个问题确实是由对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>
    
        9
  •  0
  •   Tamas Czinege    16 年前

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

        10
  •  0
  •   Gabriel Isenberg    16 年前

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

        11
  •  0
  •   Larry    16 年前

    尝试:项目,添加引用,在列表中找到SystemCore3.5.0.0,然后确定添加它。

        12
  •  0
  •   Hash    14 年前

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

        13
  •  0
  •   Gais    12 年前

    我有一个elmah.sandbox版本,它在现有的.NET 4.0项目中以.NET 2.0为目标。我向我的项目中添加了一个扩展方法,但生成失败,出现“缺少编译器必需的成员”错误消息。

    沙盒dll是早期版本的elmahr的一部分。一旦这一切被移除,它又重新建立起来。

        14
  •  0
  •   DJGray    10 年前

    供持续参考:

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

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

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

        15
  •  0
  •   Denis    9 年前

    在我的例子中,原因是错误的net20版本的微软的antixsslibrary.dll。替换为net35-错误消失。

        16
  •  0
  •   Elya Livshitz    9 年前

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