Ошибка «Отсутствует требуемый член компилятора» выдается несколько раз без каких-либо изменений в коде


95

Сегодня, после развертывания некоторых изменений на сайте C # MVC, который я запускаю, я вернулся, чтобы внести еще несколько изменений, и наткнулся на эту ошибку:

Отсутствует обязательный член компилятора System.Runtime.CompilerServices.ExtensionAttribute..ctor

Ошибка немного расплывчата (кроме описания, очевидно), поскольку она не дает мне ссылки на файл, строку или столбец, а только на проект. Кроме того, он выдает ошибку 20 раз. Я внес только три изменения в код между моментом развертывания (в то время он был полностью функциональным) и сейчас. Я отменил свои изменения, и он по-прежнему выдает ту же ошибку, которая для меня не имеет смысла.

Я не нашел много информации об этой ошибке в SO или Google, кроме решения этого парня и пары ссылок на некоторые ошибки проекта Mono (я не использую Mono). Решение, приведенное выше, требует добавления определения класса, который позволит компилятору разрешить ссылку. Я не особо хочу этого делать, потому что до этого момента мне не нужно было этого делать, и это просто запутает мой код.

Просто любопытно, сталкивался ли кто с этим раньше. Заранее спасибо!


1
Похоже, вы используете компилятор C # 3.0, но компилируете с .NET Framework 2.0. Проверьте свои ссылки на сборку.
dtb

Ответы:


27

Эта ошибка обычно означает, что ваш проект компилируется с .NET 2.0 или вы не ссылаетесь на правильную версию System.Core.dll.

Ответ на почти повторяющийся вопрос см. В разделе Ошибка при использовании методов расширения в C #.


На самом деле оказалось, что у меня плохая ссылка из сборки, которую я больше не использовал (Azure). Я не думаю, что сборка Azure была скомпилирована для .Net 2.0, но ее удаление устранило проблему. Я не уверен, почему это произошло случайно, поскольку я довольно долго не касался ничего, связанного с моими сборками или версией .Net (4.0). Увы, спасибо, что указали мне правильное направление.
jamesmillerio

Unity3D по умолчанию устанавливает для компилятора .NET 2 (на момент написания). В настройках проигрывателя измените его на более новую версию .NET, чтобы решить эту проблему.
Shadow

234

В моем случае это было потому, что на проект не ссылались Microsoft.CSharp. Как только я добавил ссылку на эту сборку, она скомпилировалась отлично.


3
Решил проблему.
Антон Лыхин

16
Моя проблема заключалась в модульном тесте с использованием динамического объекта и объекта Expando. Ссылка на Microsoft.CSharp была уловкой. Благодарность!
realPT

2
У меня был динамический тип NewtonSoft и т. Д. В библиотеке классов .NetStandard: `` string weatherjson = await GetAsync (url); динамический объект = JsonConvert.DeserializeObject (weatherjson); динамический темп = obj.main.temp; `` Я выполнил Nuget Search для Microsoft.CSharp и установил его. Библиотека теперь собирается :) В. Могу ли я использовать эту библиотеку .NetStandard в приложении Linux, учитывая ссылку на Microsofct?
Дэвид Джонс

Спасибо! Мне почему-то это не было очевидно из сообщения! Я дорабатываю давно написанный проект, и этот справочник меня пугает. Заставляет оценить относительную ясность Java, которую я обычно использую.
Tuntable

83

Я не знаю, сталкивался ли с этим кто-нибудь еще, но я внезапно столкнулся с этой ошибкой после добавления кода, использующего dynamicтипы, и включения WebAPI в проект, который возник как приложение TypeScript в VS2013. Простое добавление ссылки на Microsoft.CSharp решило мою проблему.

Надеюсь, это поможет кому-то другому.


3
Это была моя проблема. Добавление динамики загадочным образом сломало проект.
SouthShoreAK

2
То же самое для меня, используя динамический с .NetStandard2.0, мне пришлось установить C # Nuget для его компиляции
Махмуд Ханафи

17

Я сегодня тоже столкнулся с этой ситуацией. В моем случае я ссылался на dll Newton.Json.Net v3.5 в моем приложении .NET 4.0. Я понял, что даже не использовал эту библиотеку, поэтому, как только я удалил ее из своих ссылок, она больше не выдавала мне ошибку компилятора.

Задача решена!!!


2
То же самое для меня, проблема была вызвана dll Newton.Json.Net!
Жюльен Пьер,

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

7

Фактическая ошибка возникает из-за того, что ваша сборка 2.0, вызывающая ошибку, содержит этот код:

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

Приведенный выше код позволяет сборке .NET 2.0 использовать методы расширения (см. Использование методов расширения в .NET 2.0? ). Хотя это сбивает компилятор с толку, если вы ориентируетесь на .NET 4.0 и ссылаетесь на сборку 2.0 (содержащую приведенный выше код), поскольку mscorlib.dll (4.0) содержит тот же класс в том же пространстве имен.

Я исправил это

  • путем повторной компиляции исходной сборки 2.0 без атрибута, нацеленного на 4.0
  • сняв сборку (очевидно)
  • добавив третий атрибут расширения в цель, которую вы компилируете (похоже, отменяет указанные определения)

Это как раз моя проблема, попробую ваши инструкции и отправлю обратно.
Джон Питерс

6

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

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

где вы пишете этот код? вы создали класс в корне проекта?
Alex

1
@Alex Я добавил класс под названием CompilerService в корень моего проекта с указанным кодом, и он сработал. Ницца!
Halvard

4

NLog.dll 2.0, на который ссылается проект .NET 4.0, тоже может вызвать это.


NLog для .NET 2.0, на который ссылается .NET 3.5, похоже, дает аналогичные ошибки.
Педро

3

Вероятно, вы используете dynamicключевое слово в проекте библиотеки классов .NetStandard. Если это так, вам необходимо добавить ссылку на Microsoft.CSharpбиблиотеку в проекте. Надеюсь, это решит вашу проблему.


2

У меня нет правильного решения, но я добавлю свои данные:

В моем случае ошибка вызвана ссылкой на GoogleSearchAPINet20

Вот что происходит:

  • Я закрываю решение, которое строит
  • Я снова открываю раствор. Он все еще строится
  • Как только я вношу какие-либо изменения и пытаюсь выполнить сборку, я получаю 19 ошибок «Отсутствует требуемый член компилятора ...»
  • Удаляю ссылку на GoogleSearchAPINet20
  • Добавляю обратно ссылку на GoogleSearchAPINet20
  • Я строю решение. Строится без ошибок
  • Теперь я могу вносить изменения в код, создавать или выполнять любые другие действия с решением правильно, пока моя Visual Studio открыта.
  • Я закрываю Visual Studio
  • Повторите с первого шага

Я вообще не ссылаюсь на System.Core.dll в своем решении, и моя целевая платформа - .NET 4.

Меня это немного раздражает ...


1

Получил эту ошибку при попытке использовать асинхронные задачи против .NET 4.0. Обновление Target Framework до 4.5.2 устранило проблему.


1

Я попал в тот же набор исключений после того, как добавил некоторые асинхронные методы в проект winforms. Мне нужно было поднять версию .NET с 4 до 4.5.


0

Для меня проблема возникает, когда я добавляю асинхронный метод с async Task await в свой проект .net4.0!

В предыдущих версиях .NET-Framework 4.5 необходимо установить этот пакет:

Install-package Microsoft.Bcl.Async –pre

или

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

больше информации о Nuget или Nuget

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.