Помилка "Відсутній член компілятора" видається кілька разів, майже не змінюючи коду


94

Сьогодні після розгортання деяких змін на веб-сайті 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, щоб вирішити цю проблему.
Тінь

230

У моєму випадку це було тому, що проект не посилався Microsoft.CSharp. Одного разу, коли я додав посилання на цю збірку, вона просто склалася.


3
Вирішив проблему.
Антон Лигін

16
Моя проблема полягала в модульному тестуванні з використанням динамічного об’єкта та об’єкта Expando. Посилання на Microsoft.CSharp було фокусом. Дякую!
realPT

1
У мене був динамічний тип NewtonSoft тощо. У бібліотеці класів .NetStandard: `` рядок weatherjson = await GetAsync (url); динамічний obj = JsonConvert.DeserializeObject (weatherjson); динамічна temp = obj.main.temp; `` Я зробив пошук Nuget для Microsoft.CSharp і встановив його. Тепер бібліотека будується :) Q. Чи можу я використовувати цю бібліотеку .NetStandard у програмі Linux, враховуючи посилання Microsofct?
Девід Джонс

Дякую! Чомусь це не було очевидним для мене з повідомлення! Я налаштовую проект, написаний давно, і ця довідкова інформація лякає. Змушує оцінити відносну ясність Java, якою я зазвичай користуюся.
Ремонтоване

82

Я не знаю, чи хтось ще зазнавав цього, але я раптово потрапляю в цю помилку після додавання коду, що використовує 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 { }
}

де ви пишете цей код? ви створили клас у корені проекту?
Олексій

1
@Alex Я додав клас під назвою CompilerService до кореня мого проекту з кодом aboce, і він спрацював. Приємно!
Халвард,

4

Це також може спричинити NLog.dll 2.0, на який посилається проект .NET 4.0.


NLog для .NET 2.0, на який посилається .NET 3.5, схоже, дає подібні помилки.
Педро

3

Ймовірно, ви використовуєте dynamicключове слово In .NetStandard Class бібліотечний проект. Якщо так, то вам потрібно додати посилання на 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

Для мене проблема виникає при додаванні асинхронного методу з асинхронним завданням, що чекає в моєму проекті .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.