Ошибка при использовании методов расширения в C # - PullRequest
56 голосов
/ 15 октября 2008

Я столкнулся с проблемой, которая заставляет меня думать, что есть ошибка в фреймворке 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 ]

73 голосов
/ 01 февраля 2010

У меня точно такая же проблема. Ошибка System.Runtime.CompilerServices.ExtensionAttribute..ctor довольно загадочная и может означать множество разных вещей.

Однако для меня все сводилось к тому, что я использую Newtonsoft.Json.Net. Я удалил ссылку на файл Newtonsoft.Json.Net20.dll и снова добавил ее. После этого мое решение строится снова.

Самое странное, что когда я пытался выяснить, что было другим после этой процедуры с помощью Subversion Diff, похоже, ничего не изменилось.

Так что я действительно не знаю, что действительно делает удаление и повторное добавление этой ссылки, но это исправляет мою проблему сборки с этим конкретным сообщением об ошибке, упомянутым автором запроса.

ОБНОВЛЕНИЕ 1 :

Для тех, кто сталкивается с этим снова, как указали комментаторы, правильный способ исправить это - Загрузите ZIP-файл Json.Net , и должна быть версия 3.5, повторно каждый раз, когда вы используете Json.Net, используйте ссылку 3.5 и удалите старую ссылку, поскольку она, вероятно, ссылается на сборку, созданную для более старых версий .net.

ОБНОВЛЕНИЕ 2 :

Чарли Флауэрс указывает, что DLL-библиотека NewtonSoft для версии 3.5 фактически не будет работать с 3.5. Вы должны использовать DLL, которую они помечают как для .net 2.0

20 голосов
/ 03 декабря 2008

Я сам столкнулся с этой проблемой. В моем случае это было потому, что я преобразовал проект VS 2005 / .Net 2.0 в проект VS 2008 / .Net 3.5. Инструмент преобразования сохранил ссылки на System.Core 2.0, и я не смог найти простой способ изменить ссылки на System.Core 3.5.

В итоге я заново создал проект в VS 2008, и он был создан с соответствующими ссылками на System.Core 3.5

17 голосов
/ 20 декабря 2008

в VS, нажмите Project (рядом с File, Edit, View), выберите Properties

затем на вкладке «Приложение» (вы заметите, что вы уже в версии 3.5), выберите Target Framework до 2.0, затем скомпилируйте (произойдет ошибка). затем снова установите его на 3.5, затем снова скомпилируйте, ошибка исчезнет

я думаю, что это небольшая ошибка в Visual Studio, просто обманите IDE: -)

16 голосов
/ 17 января 2010

У меня возникла та же проблема в проекте библиотеки классов, который я обновил с VS 2008 до VS 2010 Beta 2. Я не добавил никаких методов расширения в проект до окончания обновления, затем я начал видеть ту же ошибку.

Добавление в проект класса со следующим кодом решило проблему:

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

Нашли подсказку в этом блоге: http://blog.flexforcefive.com/?p=105

5 голосов
/ 15 октября 2008

Ваш фреймворк недостаточно высок для методов расширения.
Это хак для того, чтобы заставить методы расширения работать без 3.5

3 голосов
/ 15 октября 2008

На какую версию .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? [отрезал некоторые пути пути]

2 голосов
/ 16 октября 2008

Отсутствует ссылка System.Core даст эти симптомы.

1 голос
/ 12 сентября 2014

Для постоянной справки:

Я боролся с этим точно таким же сообщением об ошибке в течение последних двух часов в .Net 4.0 framework и наконец отследил его до испорченной ссылки на dll Microsoft.CSharp. Это была такая невероятно простая проблема. Я удалил оскорбительную ссылку и добавил «новую» ссылку на ту DLL, которая была расположена по адресу:

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

Надеюсь, это сэкономит кому-то еще время и затруднит поиск решения для этого сообщения об ошибке.

1 голос
/ 23 февраля 2009

Эта проблема действительно вызвана неправильной ссылкой на версию 2 System.Core. Обычно это происходит при обновлении с более ранней версии .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>
0 голосов
/ 05 апреля 2016

Отредактируйте ваш 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" />
...