Wielokrotne zgłaszanie błędu „Brak elementu wymaganego przez kompilator” prawie bez zmian w kodzie


95

Dzisiaj po wdrożeniu pewnych zmian w witrynie C # MVC, którą uruchamiam, wróciłem, aby wprowadzić więcej modyfikacji i natknąłem się na ten błąd:

Brak wymaganego elementu członkowskiego kompilatora System.Runtime.CompilerServices.ExtensionAttribute..ctor

Błąd jest nieco niejasny (poza opisem, oczywiście), ponieważ nie daje mi pliku, wiersza lub kolumny do odniesienia, tylko projekt. Ponadto zgłasza błąd łącznie 20 razy. Wprowadziłem tylko trzy zmiany w kodzie od czasu wdrożenia (w tamtym czasie był on całkowicie funkcjonalny) do teraz. Cofnąłem zmiany i nadal rzuca ten sam błąd, który nie ma dla mnie sensu.

Nie znalazłem wielu informacji na temat tego błędu w SO lub Google, poza tym rozwiązaniem faceta i kilkoma odniesieniami do niektórych błędów projektu Mono (nie używam Mono). Rozwiązanie, które podaje powyższy facet, wymaga dodania definicji klasy, która pozwoli kompilatorowi rozwiązać odwołanie. Nie chcę tego robić specjalnie, ponieważ nie musiałem tego robić do tego momentu, a to po prostu zmąci mój kod.

Ciekawe, czy ktoś już to spotkał. Z góry dziękuję!


1
Wygląda na to, że używasz kompilatora C # 3.0, ale kompilujesz na platformie .NET Framework 2.0. Sprawdź odniesienia do montażu.
dtb

Odpowiedzi:


27

Ten błąd zwykle oznacza, że ​​Twój projekt jest kompilowany na platformie .NET 2.0 lub nie odwołujesz się do poprawnej wersji System.Core.dll

Aby uzyskać prawie zduplikowane pytanie, zobacz błąd podczas używania metod rozszerzających w języku C #


Okazało się, że mam złe odniesienie z zestawu, którego już nie używałem (Azure). Nie sądzę, aby zestaw platformy Azure został skompilowany z .Net 2.0, ale usunięcie go rozwiązało problem. Nie jestem pewien, dlaczego to przypadkowo powstało, ponieważ od dłuższego czasu nie dotykałem niczego związanego z moimi zespołami lub wersją .Net (4.0). Niestety, dzięki za wskazanie mi właściwego kierunku.
jamesmillerio

Unity3D domyślnie ustawia kompilator na .NET 2 (w momencie pisania). W ustawieniach odtwarzacza zmień go na nowszą wersję.NET, aby rozwiązać ten problem.
Cień

234

W moim przypadku było tak, ponieważ projekt nie zawierał odniesień Microsoft.CSharp. Kiedy dodałem odniesienie do tego zestawu, skompilowałem się dobrze.


3
Rozwiązać problem.
Anton Lyhin

16
Mój problem dotyczył testu jednostkowego przy użyciu obiektu dynamicznego i Expando. Odniesienie do Microsoft.CSharp było sztuczką. Dzięki!
realPT

2
Miałem dynamiczny typ NewtonSoft itp. W bibliotece klas .NetStandard: `` string weatherjson = await GetAsync (url); dynamic obj = JsonConvert.DeserializeObject (weatherjson); dynamic temp = obj.main.temp; `` Zrobiłem Nuget Search dla Microsoft.CSharp i zainstalowałem to. Biblioteka jest teraz budowana :) P. Czy mogę używać tej biblioteki .NetStandard w aplikacji Linux, biorąc pod uwagę odniesienie do Microsofct?
David Jones

Dziękuję Ci! Z jakiegoś powodu nie było to dla mnie oczywiste z wiadomości! Poprawiam projekt napisany dawno temu i te referencje są przerażające. Sprawia, że ​​doceniamy względną przejrzystość języka Java, którego normalnie używam.
Tuntable

83

Nie wiem, czy ktokolwiek inny tego doświadczył, ale nagle dynamicwpadam w ten błąd po dodaniu kodu wykorzystującego typy i włączeniu WebAPI do projektu, który powstał jako aplikacja TypeScript w VS2013. Samo dodanie odwołania do Microsoft.CSharp rozwiązało mój problem.

Mam nadzieję, że to pomoże komuś innemu.


3
To był dokładnie mój problem. Dodanie dynamiki w tajemniczy sposób zepsuło projekt.
SouthShoreAK,

2
To samo dotyczy mnie, używając dynamiki z .NetStandard2.0, musiałem zainstalować C # Nuget, aby go skompilować
Mahmoud Hanafy

17

Dziś też spotkałem się z taką sytuacją. W moim przypadku odwoływałem się do Newton.Json.Net dll v3.5 w mojej aplikacji .NET 4.0. Zdałem sobie sprawę, że nawet nie korzystałem z tej biblioteki, więc kiedy usunąłem ją z moich odniesień, nie dawała mi już błędu kompilatora.

Problem rozwiązany!!!


2
To samo dla mnie, dll Newton.Json.Net spowodował problem!
Julien Pierre

W moim przypadku przyczyną była zła wersja NET20 Microsoft's AntiXSSLibrary.dll. Zastąpiony przez NET35 - błąd zniknął.
Denis

7

Rzeczywisty błąd wynika z faktu, że Twój zestaw 2.0, który powoduje błąd, zawiera następujący kod:

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

Powyższy kod umożliwia zestawowi .NET 2.0 używanie metod rozszerzających (zobacz Używanie metod rozszerzających w .NET 2.0? ). Chociaż myli kompilator, jeśli celujesz w .NET 4.0 i odwołujesz się do zestawu 2.0 (zawierającego powyższy kod), ponieważ mscorlib.dll (4.0) zawiera tę samą klasę w tej samej przestrzeni nazw.

Naprawiłem to

  • przez ponowne kompilowanie oryginalnego zestawu 2.0 bez atrybutu przeznaczonego dla wersji 4.0
  • poprzez usunięcie zespołu (oczywiście)
  • poprzez dodanie trzeciego atrybutu rozszerzenia w kompilowanym miejscu docelowym (wydaje się, że zastępuje definicje, do których się odwołuje)

To jest dokładnie mój problem, spróbuję twoich instrukcji i odeślę.
John Peters

6

Napisanie tego kodu gdzieś w projekcie może rozwiązać Twój problem. Mi to pasuje

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

gdzie piszesz ten kod? utworzyłeś klasę w katalogu głównym projektu?
Alex

1
@Alex Dodałem klasę o nazwie CompilerService do katalogu głównego mojego projektu z kodem powyżej i zadziałało. Ładny!
Halvard

4

Może to również powodować odwołanie do pliku NLog.dll 2.0 z projektu .NET 4.0.


Wydaje się, że NLog dla .NET 2.0, do którego odwołuje się .NET 3.5, zawiera podobne błędy.
Pedro,

3

Prawdopodobnie używasz dynamicsłowa kluczowego w projekcie biblioteki klas .NetStandard. Jeśli tak, musisz dodać odwołanie do Microsoft.CSharpbiblioteki w projekcie. Mam nadzieję, że rozwiąże to twój problem.


2

Nie mam poprawnego rozwiązania, ale dodam mój punkt danych:

W moim przypadku błąd jest spowodowany odwołaniem się do GoogleSearchAPINet20

Oto, co się dzieje:

  • Zamykam rozwiązanie, które buduje
  • Ponownie otwieram rozwiązanie. Nadal się buduje
  • Gdy tylko wprowadzam jakąkolwiek zmianę i próbuję budować, otrzymuję 19 błędów „Brak elementu wymaganego przez kompilator ...”
  • Usuwam odniesienie do GoogleSearchAPINet20
  • Dodaję z powrotem odniesienie do GoogleSearchAPINet20
  • Buduję rozwiązanie. Buduje się bez błędów
  • Mogę teraz wprowadzać zmiany w kodzie, kompilować lub wykonywać inne czynności z rozwiązaniem poprawnie, o ile mój program Visual Studio jest otwarty
  • Zamykam Visual Studio
  • Powtórz od kroku pierwszego

W ogóle nie odwołuję się do System.Core.dll w moim rozwiązaniu, a moja platforma docelowa to .NET 4.

Jestem trochę zirytowany w tym momencie ...


1

Wystąpił ten błąd podczas próby użycia zadań asynchronicznych względem platformy .NET 4.0. Aktualizacja platformy docelowej do wersji 4.5.2 rozwiązała problem.


1

Trafiłem w ten sam zestaw wyjątków po dodaniu niektórych metod asynchronicznych do projektu winForms. Musiałem zmienić wersję .NET z 4 na 4.5


0

U mnie problem występuje, gdy dodaję metodę asynchroniczną z asynchronicznym zadaniem oczekującym w moim projekcie .net4.0!

W przypadku poprzednich wersji programu .NET Framework 4.5 należy zainstalować ten pakiet:

Install-package Microsoft.Bcl.Async –pre

lub

Install-Package Microsoft.CompilerServices.AsyncTargetingPack

więcej informacji o Nuget lub Nuget

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.