Один или несколько типов, необходимых для компиляции динамического выражения, не найдены. Вам не хватает ссылок на Microsoft.CSharp.dll и System.Core.dll?


287

Я пытаюсь скомпилировать этот код в Microsoft Visual C # 2010

using System;
using System.Globalization;


class main
{
    static void Main()
    {

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

но я получаю эти две ошибки

Ошибка 1 Предопределенный тип «Microsoft.CSharp.RuntimeBinder.Binder» не определен или не импортирован

Ошибка 2 Не удается найти один или несколько типов, необходимых для компиляции динамического выражения. Вам не хватает ссылок на Microsoft.CSharp.dll и System.Core.dll?

Я читал этот другой пост, но я новичок в C #, и я не мог понять, в чем на самом деле проблема. Особенно что и где эти так называемые .configфайлы ..


25
Проверьте ваши рекомендации. Щелкните правой кнопкой мыши и выберите «Добавить ссылку». Найдите «Microsoft.CSharp.dll» и добавьте его. Обычно System.Core.dll поставляется стандартно, когда вы создаете новый проект, не очень уверен насчет CSharp.dll
Интернет

Ответы:


586

В окне обозревателя решений щелкните правой кнопкой мыши пункт Ссылки, выберите Добавить ссылку, перейдите на вкладку .NET, найдите и добавьте Microsoft.CSharp.


26
На мою уже ссылались, но у меня все еще была эта ошибка. Я создал новое приложение ASP.Net MVC4 в VS 2010. Ошеломил, удалил и прочитал его, и ошибка исчезла. Очистка / Восстановление не помогло.
Пол

@Paul: То же самое случилось со мной после обновления проекта с 4.0 до 4.5. Версия # / etc одинакова для 4.0 / 4.5 IIRC, что может быть причиной.
Стивен Эверс

13
Команда Visual Studio должна подумать о том, чтобы позволить людям
навести

8
@Geoyws Одно слово: ReSharper.
user2864740

2
@ user2864740 Обычно Resharper делает это. Но в этом случае ReSharper ничего не покажет.
Pulle

21

Убедитесь, что ваш проект ориентирован на .NET Framework 4.0. Visual Studio 2010 также поддерживает целевую платформу .NET 3.5, но .NET 3.5 не поддерживает dynamicключевое слово.

Вы можете настроить версию фреймворка в свойствах проекта. См. Http://msdn.microsoft.com/en-us/library/bb398202.aspx для получения дополнительной информации.


7

У меня была та же проблема, за исключением того, что удаление и добавление ссылки обратно не исправило ошибку, поэтому я изменил версию .Net с 4.5на 4.5.1.

Для этого перейдите в свой web.configфайл и измените следующие строки

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

к этому

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

и восстановить.


6

Красные линии под ViewBag были моей головной болью в течение 3 месяцев). Просто удалите ссылку Microsoft.CSharp из проекта, а затем добавьте ее снова.


3
это не сработало для меня, даже если у меня также есть красные линии в моей строке
ViewBag

1

У меня была та же проблема, и я решил ее, удалив ссылку «Microsoft.CSharp» из проекта, а затем снова добавил ее.


1

Для меня удаление и повторное добавление ссылки на Microsoft.CSharp временно исправляло проблему до тех пор, пока уязвимый файл не был отредактирован. Закрытие Visual Studio и повторное открытие проекта исправили его на более длительный срок, так что это вариант, если такая ситуация возникает, когда на Microsoft.CSharp уже есть ссылка.

Возможно, перезапуск IDE в качестве первого шага кажется тривиальным, но вот напоминание для таких людей, как я, которые не считают это первым делом.


0

Ничто из этого не помогло мне.

Мои библиотеки классов определенно ссылались как на System.Core, так и на Microsoft.CSharp. Веб-приложение было 4.0 и не могло обновиться до 4.5 из-за проблем с поддержкой.

Я столкнулся с ошибкой при компиляции шаблона бритвы с помощью Razor Engine и только с перерывами, как после перезапуска веб-приложения.

Решение, которое работало для меня, состояло в том, чтобы вручную загрузить сборку, а затем повторить ту же операцию ...

        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;
            }
        }

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


-2

Если вы пропустите, Microsoft.CSharp.dll эта ошибка может возникнуть. Проверьте ваши ссылки проекта.


3
Добро пожаловать в стек переполнения! Возможно, вы захотите включить пример кода или более объяснения. Это больше похоже на комментарий,
Гари Стори

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