Nie można znaleźć jednego lub więcej typów wymaganych do skompilowania wyrażenia dynamicznego. Brakuje odniesień do Microsoft.CSharp.dll i System.Core.dll?


287

Próbuję skompilować ten kod w Microsoft Visual C # 2010

using System;
using System.Globalization;


class main
{
    static void Main()
    {

        dynamic d;
        d = "dyna";
        Console.WriteLine(d);    
    }
}

ale dostaję te dwa błędy

Błąd 1 Predefiniowany typ „Microsoft.CSharp.RuntimeBinder.Binder” nie jest zdefiniowany ani importowany

Błąd 2 Nie można znaleźć jednego lub więcej typów wymaganych do skompilowania wyrażenia dynamicznego. Brakuje odniesień do Microsoft.CSharp.dll i System.Core.dll?

Przeczytałem ten inny post, ale jestem nowy w C # i nie mogłem zrozumieć, na czym naprawdę polega problem. Zwłaszcza co i gdzie są te tak zwane .configpliki ...


25
Sprawdź swoje referencje. Kliknij prawym przyciskiem myszy i „Dodaj odniesienie ..” Wyszukaj „Microsoft.CSharp.dll” i dodaj go. Zazwyczaj System.Core.dll jest standardem podczas tworzenia nowego projektu, nie jestem pewien co do CSharp.dll
Internet

Odpowiedzi:


586

W oknie eksploratora rozwiązań kliknij prawym przyciskiem myszy pozycję Referencje, wybierz opcję Dodaj referencję, przejdź do karty .NET, znajdź i dodaj Microsoft.CSharp.


26
Mój był już wymieniony, ale wciąż miałem ten błąd. W VS 2010 utworzyłem nową aplikację ASP.Net MVC4. Zaskoczony, usunąłem ją i przeczytałem, a błąd zniknął. Czyszczenie / przebudowa nie pomogła.
Paul

@Paul: To samo przydarzyło mi się po uaktualnieniu projektu z 4.0 do 4.5. Wersja # / etc jest taka sama między 4.0 / 4.5 IIRC, co może być przyczyną.
Steven Evers

13
Zespół Visual Studio powinien naprawdę pomyśleć o tym, aby pozwolić ludziom na
przesuwanie wskaźnika

8
@Geoyws Jedno słowo: ReSharper.
user2864740

2
@ user2864740 Normalnie Resharper to robi. Ale w tym przypadku ReSharper niczego nie pokaże.
Pulle


7

Miałem ten sam problem, ale usunięcie i dodanie referencji nie naprawiło błędu, więc zmieniłem wersję .Net z 4.5na 4.5.1.

Aby to osiągnąć, przejdź do web.configpliku i zmień następujące wiersze

<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />

do tego

<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />

i odbuduj.


6

Czerwone linie pod ViewBag sprawiły mi ból głowy przez 3 miesiące). Po prostu usuń referencję Microsoft.CSharp z projektu, a następnie dodaj ją ponownie.


3
to nie działało dla mnie, nawet gdy mam również czerwone linie na mojej linii
ViewBag

1

Miałem ten sam problem i rozwiązałem go, usuwając z projektu referencję „Microsoft.CSharp”, a następnie dodałem ją ponownie.


1

Dla mnie usunięcie i ponowne dodanie odwołania do Microsoft.CSharp naprawiło problem tymczasowo do czasu edycji pliku, którego dotyczy problem. Zamknięcie programu Visual Studio i ponowne otwarcie projektu naprawiło go bardziej długoterminowo, więc jest to opcja, jeśli taka sytuacja występuje, gdy Microsoft.CSharp jest już przywoływany.

Może ponowne uruchomienie IDE jako pierwszy krok wydaje się trywialne, ale oto przypomnienie dla ludzi takich jak ja, którzy nie uważają tego za pierwszą rzecz.


0

Żadne z tych nie działało dla mnie.

Moje biblioteki klas zdecydowanie odnosiły się zarówno do System.Core, jak i Microsoft.CSharp. Aplikacja internetowa miała wersję 4.0 i nie można jej było zaktualizować do wersji 4.5 z powodu problemów z obsługą.

Wystąpił błąd podczas kompilowania szablonu maszynki do golenia przy użyciu mechanizmu Razor Engine i występowałem tylko sporadycznie, jak po ponownym uruchomieniu aplikacji internetowej.

Rozwiązaniem, które działało dla mnie było ręczne ładowanie zestawu, a następnie ponawianie tej samej operacji ...

        bool retry = true;
        while (retry)
        {
            try
            {
                string textTemplate = File.ReadAllText(templatePath);
                Razor.CompileWithAnonymous(textTemplate, templateFileName);
                retry = false;
            }
            catch (TemplateCompilationException ex)
            {
                LogTemplateException(templatePath, ex);
                retry = false;

                if (ex.Errors.Any(e  => e.ErrorNumber == "CS1969"))
                {
                    try
                    {
                        _logger.InfoFormat("Attempting to manually load the Microsoft.CSharp.RuntimeBinder.Binder");
                        Assembly csharp = Assembly.Load("Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
                        Type type = csharp.GetType("Microsoft.CSharp.RuntimeBinder.Binder");
                        retry = true;
                    }
                    catch(Exception exLoad)
                    {
                        _logger.Error("Failed to manually load runtime binder", exLoad);
                    }
                }

                if (!retry)
                    throw;
            }
        }

Mam nadzieję, że może to pomóc komuś innemu.


-2

Jeśli przegapisz, Microsoft.CSharp.dll ten błąd może wystąpić. Sprawdź referencje projektów.


3
Witamy w Stack Overflow! Możesz dołączyć próbkę kodu lub więcej wyjaśnień. To wydaje się bardziej komentarzem
Gary Storey

5
Zasadniczo powiedziałeś to samo, co w zaakceptowanej odpowiedzi udzielonej 3 lata temu.
Ilya Luzyanin
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.