Ошибка при использовании методов расширения в С#

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

Прошло несколько месяцев с тех пор, как я использовал методы расширения, но я уверен, что мне не нужно было это делать. Кто-нибудь еще сталкивается с этой проблемой?

Ответ 1

Я сам столкнулся с этой проблемой. В моем случае это было связано с тем, что я преобразовал проект 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

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

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

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

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

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

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

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

Charlie Flowers указывает, что ярлыки DLL NewtonSoft как на 3.5 не работают с 3.5. Вы должны использовать DLL, которые они обозначают как .net 2.0

Ответ 3

в VS, нажмите "Проект" (рядом с "Файл", "Редактировать", "Вид" ), выберите "Свойства"

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

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

Ответ 4

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

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

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

Нашел отзыв в этом блоге: http://blog.flexforcefive.com/?p=105

Ответ 5

Ваша инфраструктура недостаточно высока для методов расширения.
Чтобы взломать, чтобы использовать методы расширения, не будучи в 3.5

Ответ 6

Какую версию .NET вы настраиваете? Класс ExtensionAttribute поставляется в System.Core.dll(.NET 3.5), но вы можете повторно объявить его самостоятельно, если хотите использовать методы расширения в .NET 2.0/3.0 (с С# 3.0, очевидно). Фактически, LINQBridge делает это.

[update] Однако я немного смущен, потому что ошибка, которую вы должны увидеть, это:

Ошибка 1 Невозможно определить новое расширение метод, потому что требуется компилятор тип 'System.Runtime.CompilerServices.ExtensionAttribute' Не может быть найдено. Вы не нашли ссылка на System.Core.dll? [отрезанный какой-то материал пути]

Ответ 7

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

Ответ 8

Эта проблема действительно вызвана неправильной ссылкой на версию 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>

Ответ 9

Расширения вводятся в С# 3.0, который, с другой стороны, был внедрен в .NET 3.5, поэтому вы действительно не можете использовать их непосредственно в .NET 3.0.

Ответ 10

Это проект веб-сайта, случайно? Попробуйте изменить целевую структуру с .NET 3.5 на более раннюю версию, а затем вернуться к .NET 3.5.

Ответ 11

Попробуйте: Project, Add Reference, найдите System Core 3.5.0.0 в списке и нажмите ОК, чтобы добавить его.

Ответ 12

Просто настройте проект VS на платформу .NET 3.5 и выше. Скорее всего, вы преобразовали свой проект из предыдущей версии.

Ответ 13

У меня была версия Elmah.Sandbox, которая была нацелена на .net 2.0 в существующем проекте .Net 4.0. Я добавил метод расширения для моего проекта, и сборка завершилась с сообщением об ошибке "Отсутствующий компилятор требуемого члена".

DLL Elmah.Sandbox был включен как часть ранней версии ElmahR. Как только это было удалено, все построено снова.

Ответ 14

Для текущей справки:

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

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

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

Ответ 15

В моем случае причиной была неправильная версия NET20 Microsoft AntiXSSLibrary.dll. Заменен NET35 - ошибка исчезла.

Ответ 16

Отредактируйте свой csproj и убедитесь, что эти ссылки включены (он не работает простым "add reference"...):

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