Ошибка при использовании методов расширения в C#
Я столкнулся с проблемой, которая заставляет меня думать, что есть ошибка в структуре 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 ответов
Я просто столкнулся с этой проблемой сам. В моем случае это было потому, что я преобразовал проект VS 2005/.Net 2.0 в проект VS 2008/.Net 3.5. Инструмент преобразования сохранил ссылки на System.Core 2.0, и я не смог найти простой способ изменить ссылки на System.Core 3.5.
Я закончил тем, что заново создал проект в VS 2008 с нуля, и он был создан с соответствующими ссылками на System.Core 3.5
У меня точно такая же проблема. Ошибка System.Runtime.CompilerServices.ExtensionAttribute..ctor
довольно загадочно, и может означать много разных вещей.
Однако для меня все сводилось к тому, что я использую Newtonsoft.Json.Net
, Я удалил ссылку на файл Newtonsoft.Json.Net20.dll
и заново его добавил. После этого мое решение строится снова.
Самое странное, что когда я попытался выяснить, что было другим после этой процедуры с помощью Subversion Diff, похоже, ничего не изменилось.
Так что я действительно не знаю, что действительно делает удаление и повторное добавление этой ссылки, но это исправляет мою проблему сборки с этим конкретным сообщением об ошибке, упомянутым автором запроса.
ОБНОВЛЕНИЕ 1:
Для тех, кто сталкивается с этим снова, как указали комментаторы, правильный способ исправить это - загрузить ZIP-файл Json.Net, и должна быть версия 3.5, ссылаться на 3.5 каждый раз, когда вы используете Json.Net, и удалять старая ссылка, так как она, вероятно, ссылается на сборку, созданную для более старых версий.net.
ОБНОВЛЕНИЕ 2:
Charlie Flowers отмечает, что библиотека DLL NewtonSoft для 3.5 не будет работать с 3.5. Вы должны использовать DLL, которую они помечают как для.net 2.0
В VS нажмите Project (рядом с File,Edit,View), выберите Properties
затем на вкладке "Приложение" (вы заметите, что вы уже в 3.5), выберите Target Framework до 2.0, затем скомпилируйте (произойдет ошибка). затем снова установите его на 3.5, затем снова скомпилируйте, ошибка исчезнет
я думаю, что это небольшая ошибка в Visual Studio, просто обмануть IDE:-)
У меня возникла та же проблема в проекте библиотеки классов, который я обновил с VS 2008 до VS 2010 Beta 2. Я не добавил в проект никаких методов расширения до окончания обновления, затем я начал видеть ту же ошибку.
Добавление класса со следующим кодом в проект решило проблему:
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
Нашел подсказку в этом блоге: http://blog.flexforcefive.com/?p=105
Ваш фреймворк недостаточно высок для методов расширения.
Это хак для того, чтобы заставить методы расширения работать, не будучи в 3.5
На какую версию.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? [отрезал некоторые пути пути]
Для постоянной ссылки:
Я боролся с этим точно таким же сообщением об ошибках в течение последних двух часов в.Net 4.0 framework и наконец отследил его до испорченной ссылки на dll Microsoft.CSharp. Это была такая невероятно простая проблема. Я удалил оскорбительную ссылку и добавил "новую" ссылку на ту DLL, которая была расположена по адресу:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll
Надеемся, что это сэкономит кому-то еще время и затруднит поиск решения для этого сообщения об ошибке.
Эта проблема действительно вызвана неправильной ссылкой на версию 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>
Попробуйте: Project, Add Reference, найдите System Core 3.5.0.0 в списке и нажмите OK, чтобы добавить его.
У меня была версия Elmah.Sandbox, которая предназначалась для.net 2.0 в существующем проекте.Net 4.0. Я добавил метод расширения в свой проект, и сборка не удалась с сообщением об ошибке "Отсутствует обязательный элемент компилятора".
DLL Elmah.Sandbox был включен как часть ранней версии ElmahR. Как только это было удалено, это все построено снова.
Отредактируйте ваш 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" />
В моем случае причиной была неправильная версия NETXSSLibrary.dll от Microsoft. Заменил на NET35 - ошибка ушла.
Расширения введены в C# 3.0, который, с другой стороны, был представлен в.NET 3.5, поэтому вы не можете использовать их непосредственно в.NET 3.0.
Просто настройте свой VS проект на.NET Framework 3.5 и выше. Скорее всего, вы конвертировали свой проект из предыдущей версии.
Случайно ли это проект веб-сайта? Попробуйте изменить целевой фреймворк с.NET 3.5 на более раннюю версию, а затем обратно на.NET 3.5.