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