No se pueden encontrar uno o más tipos necesarios para compilar una expresión dinámica. ¿Le faltan referencias a Microsoft.CSharp.dll y System.Core.dll?

287

Estoy tratando de compilar este código en Microsoft Visual C # 2010

using System;
using System.Globalization;


class main
{
    static void Main()
    {

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

pero obtengo estos dos errores

Error 1 El tipo predefinido 'Microsoft.CSharp.RuntimeBinder.Binder' no está definido o importado

Error 2 No se pueden encontrar uno o más tipos necesarios para compilar una expresión dinámica. ¿Le faltan referencias a Microsoft.CSharp.dll y System.Core.dll?

Leí esta otra publicación, pero soy nuevo en C # y no pude entender cuál es realmente el problema. Especialmente qué y dónde están estos llamados .configarchivos ...

usuario1232138
fuente
25
Revisa tus referencias. Haga clic derecho y "Agregar referencia .." Busque "Microsoft.CSharp.dll" y agréguelo. Por lo general, System.Core.dll viene de serie cuando se crea un nuevo proyecto, no estoy tan seguro acerca de CSharp.dll
Internet

Respuestas:

586

En la ventana del explorador de soluciones, haga clic con el botón derecho en Referencias, seleccione Agregar referencia, vaya a la pestaña .NET, busque y agregue Microsoft.CSharp.

M. Mennan Kara
fuente
26
El mío ya estaba referenciado pero aún tenía este error. Había creado una nueva aplicación ASP.Net MVC4 en VS 2010. Desconcertada, la eliminé y la leí, y el error desapareció. La limpieza / reconstrucción no ayudó.
Paul
@Paul: Me pasó lo mismo después de actualizar un proyecto de 4.0 a 4.5. La versión # / etc es la misma entre 4.0 / 4.5 IIRC, que podría ser la razón.
Steven Evers
13
El equipo de Visual Studio realmente debería pensar en dejar que la gente pase el mouse sobre el error y luego seleccionar "Agregar Microsoft.CSharp a las referencias"
geoyws
8
@Geoyws Una palabra: ReSharper.
usuario2864740
2
@ user2864740 Normalmente Resharper hace esto. Pero en este caso, ReSharper no mostrará nada.
Polea
21

Asegúrese de que su proyecto esté dirigido a .NET Framework 4.0. Visual Studio 2010 también admite .NET Framework Framework Target, pero .NET 3.5 no admite la dynamicpalabra clave.

Puede ajustar la versión del marco en las propiedades del proyecto. Consulte http://msdn.microsoft.com/en-us/library/bb398202.aspx para obtener más información.

Chris Shain
fuente
7

Tuve el mismo problema, excepto que eliminar y volver a agregar la referencia no solucionó el error, por lo que cambié la versión .Net de 4.5a 4.5.1.

Para lograr esto ve a tu web.config archivo y cambie las siguientes líneas

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

a esto

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

y reconstruir

Dynamiclynk
fuente
6

Las líneas rojas debajo de la ViewBag fueron mi dolor de cabeza durante 3 meses). Simplemente elimine la referencia Microsoft.CSharp del proyecto y luego agréguela nuevamente.

romano
fuente
3
esto no funcionó para mí, incluso cuando también tengo líneas rojas en mi línea
ViewBag
1

Tuve el mismo problema y lo resolví eliminando la referencia "Microsoft.CSharp" del proyecto y luego lo agregué nuevamente.

chan
fuente
1

Para mí, eliminar y volver a agregar una referencia a Microsoft.CSharp solucionó el problema temporalmente hasta que se editó el archivo afectado. El cierre de Visual Studio y la reapertura del proyecto lo repararon a más largo plazo, por lo que es una opción si esta situación ocurre mientras Microsoft.CSharp ya está referenciado.

Quizás reiniciar el IDE como primer paso parece trivial, pero aquí hay un recordatorio para las personas como yo que no piensan en eso como lo primero que hay que hacer.

Meloso
fuente
0

Ninguno de estos funcionó para mí.

Mis bibliotecas de clase definitivamente hacían referencia a System.Core y Microsoft.CSharp. La aplicación web era 4.0 y no se pudo actualizar a 4.5 debido a problemas de soporte.

Estaba encontrando el error al compilar una plantilla de maquinilla de afeitar usando el motor de maquinilla de afeitar , y solo lo encontré de forma intermitente, como después de que la aplicación web se haya reiniciado.

La solución que funcionó para mí fue cargar manualmente el ensamblaje y luego volver a intentar la misma operación ...

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

Esperemos que esto pueda ayudar a alguien más.

Mick
fuente
-2

Si pierde, Microsoft.CSharp.dll este error puede ocurrir. Comprueba tus referencias de proyecto.

Ramkumar Thangavel
fuente
3
¡Bienvenido a Stack Overflow! Es posible que desee incluir una muestra de código o más de una explicación. Esto parece más como un comentario,
Gary Storey
55
Básicamente dijiste lo mismo que en la respuesta aceptada dada hace 3 años.
Ilya Luzyanin