c# asp.net-mvc c#-4.0

c# - ¿Por qué me aparece ''Uno o más tipos necesarios para compilar una expresión dinámica no se pueden encontrar''?



asp.net-mvc c#-4.0 (21)

Tenía un proyecto que actualicé desde

  • .NET 3.5 MVC v2 a
  • .NET 4.0 MVC v3

Compilación Obtengo un error cuando intento usar o establecer la propiedad @ViewBag.Title .

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

He hecho lo siguiente

  1. Siguió los pasos de actualización
  2. Establezca el marco de destino en la pestaña Proyecto / Propiedades / Aplicación a .NET Framwework 4
  3. Se agregó el marco System.Core manualmente
  4. Se agregó el marco Microsoft.CSharp
  5. Se agregó el marco System.Xml
  6. Se agregó el marco System.Xml.Linq
  7. Me aseguré de que mi Web.Config sea ​​correcta (está escrita por Web.Debug.Config, etc.)
  8. Creó el modelo , el controlador y una Razor View
  9. Crea un __Layout.cshtml_

Estoy en la pérdida de qué más hacer?

EDITAR:

Noté en el GAC Gui que hay System.Core 3.5.0.0 pero no System.Core 4.0.0.0. ¿Esto significa que se está confundiendo y todavía está usando la versión anterior? ¿O estoy malinterpretando el GAC?

EDITAR:

Mi web.config se ve de la siguiente manera

... <compilation debug="true"> <assemblies> <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> </assemblies> </compilation> .... <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </controls> <namespaces> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.WebPages"/> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Linq" /> <add namespace="System.Collections.Generic" /> </namespaces> </pages> ....


Bien, lo tengo trabajando con los siguientes pasos.

  1. En el archivo de configuración, cambié <compilation debug="true"> a <compilation debug="true" targetFramework="4.0"> en la sección system.web
  2. En el archivo de configuración cambié <providerOption name="CompilerVersion" value="v3.5" /> a <providerOption name="CompilerVersion" value="v4.0" /> en la sección de compiladores
  3. En Global.asax.cs, agregué ViewEngines.Engines.Add(new RazorViewEngine()); al método Application_Start()

y creo que eso fue todo.


Como descubrí recientemente, algunas extensiones también pueden causar esto. En mi caso, la eliminación de la extensión AutoHistory 1.0.1 me la arregló (MVC5).


Empiezo a recibir el mismo error después de instalar el paquete MVCSiteMapProvider para hacer migas de pan para mi sitio.

Si ha instalado MVCSiteMapProvider y obtiene este error, debe reemplazar @ViewBag.Title por otra cosa, por ejemplo, @Html.MvcSiteMap().SiteMapTitle()


Esta fue mi resolución:

1) Ir a Referencias del proyecto

2) Haga clic derecho en Microsoft.CSharp -> Propiedades

3) Cambia Copiar local a Falso si lo tienes en Verdadero.


He estado luchando con este problema durante días y finalmente lo descubrí.

Todo lo que hice fue eliminar lo siguiente del web.config:

<dependentAssembly> <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31BF3856AD364E35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Razor" publicKeyToken="31BF3856AD364E35" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> </dependentAssembly>


He estado luchando con este problema también durante un día más o menos. Después de que finalmente encontré este artículo aquí y probé todas las sugerencias aquí, encontré otra solución que me solucionó el problema:

Es justo lo contrario que Arman Bimatov ha encontrado:

1) Ir a Referencias del proyecto

2) Haga clic derecho en Microsoft.CSharp -> Propiedades

3) Cambie la Copia Local a Verdadero si lo tiene en Falso.

Creo que debe tratar de alguna manera con las asambleas registradas en GAC y la forma en que Visual Studio obtiene la versión "correcta". Supongo que en mi máquina de desarrollo de alguna manera el .NET Framework 3.5 se instaló después de los Frameworks más nuevos (si esto es posible), por lo que Visual Studio obtiene la versión incorrecta de GAC. O simplemente, no está claro para VS para obtener la versión, por lo que se necesita la versión anterior ...

Si todavía tiene el mismo mensaje de error, también puede intentar configurar el Copy Local en True para System.Core Dll y verifique que funciona ahora.

Saludos SkippingAdi


Lo resolví de la siguiente manera:

Primero noté el uso de gacutil (Global Assembly Cache Utility) que contenía dos referencias a System.Core, una a la versión 4.0 y una a la versión 3.5. Aparentemente dentro de las vistas de la maquinilla de afeitar, incluso si en el proyecto tenía la referencia correcta a la versión 4.0, todavía estaba usando la versión 3.5 y es por eso que recibí el error sobre los tipos dinámicos. Para comprobar si ese es su caso, abra como administrador el símbolo del sistema de Visual Studio y ejecute:

gacutil -l System.Core

Para eliminar la referencia a la versión anterior de System.Core, hice los siguientes pasos:

- cd %systemroot%/assembly/

Desde aquí puede tener más de un directorio "gac", por lo que tendrá que buscar dentro de cada uno para encontrar su componente. Para mí, estaba dentro del directorio "gac_MSIL".

- cd gac_msil - cd System.Core - cd <assembly version number>__<public key token> - erase *.* Say "y" to are you sure. - cd .. - rd <assembly version number>__<public key token> - cd .. - rd System.Core

Ahora abrí mi solución de nuevo en Visual Studio y el error desapareció, se refiere correctamente a System.Core 4.0 y ya no estoy recibiendo los errores dinámicos :)

Espero que te ayude también, Best, N.


Me sucedió algo muy similar, aunque en mi caso había actualizado varias cosas, desde Visual Studio 2010 hasta Visual Studio 2012. Seguí todas las sugerencias anteriores y todavía sufría. Al final, decidí volver a crear todo el proyecto. Fue solo cuando intenté volver a agregar los aspectos del proveedor de membresía a mi archivo web.config que de repente se hizo obvio dónde estaba el choque de versiones para mí.

<sessionState mode="InProc" customProvider="DefaultSessionProvider"> <providers> <clear/> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/AppName"/> </providers> </sessionState>

Aunque mirándolo ahora, es obvio. El tipo para el proveedor tiene una versión específica. Luego, simplemente eliminé la versión y encontré el tipo apropiado. Por lo tanto, la resolución en mi caso fue reemplazar lo anterior por:

<sessionState mode="InProc" customProvider="DefaultSessionProvider"> <providers> <clear/> <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers" connectionStringName="DefaultConnection" applicationName="/AppName"/> </providers> </sessionState>

Y luego volver a compilar. ¡Me ha llevado días encontrar esto, ya que estaba buscando en todos los lugares equivocados!



Para mí no funcionó lo anterior, en su lugar estableciendo Copy Local = True resolvió el problema


Para mí, la solución fue agregar:

ViewEngines.Engines.Add(new RazorViewEngine());

al método Application_Start() en global.asax.cs .


Parece que está importando System.Core 3.5 en su web.config. Debe importar System.Core desde el marco de trabajo 4.0, porque ViewBag requiere el espacio de nombres System.Dynamic.

En mi máquina, parece System.Core v4.0.30319


Por lo que vale, cuando esto me sucedió (en un proyecto convertido automáticamente de MVC2 a MVC3), todo lo que tenía que hacer era agregar una referencia de proyecto a Microsoft.CSharp. En mi caso el web.config ya tenía las 4.0 referencias mencionadas aquí, asumo cortesía del script de actualización.


Probé todas las otras sugerencias en este archivo y ninguna funcionó en mi solución MVC 4 existente. Así que después de actualizar mi VS2012 a WebTools 2013.1 para VS 2012 , creé un nuevo proyecto de MVC 5 y usé los archivos del nuevo proyecto como base, eliminé todas las líneas externas de todos mis archivos web.config.

Después de hacer eso, todos mis errores de compilación y advertencias desaparecieron y Intellisense comenzó a funcionar correctamente. Al eliminar por completo la sección <system.web> <pages> en el archivo web.config principal, finalmente se corrigieron los errores de expresión dinámica ViewBag.Title (y otros).


Recibí este error para una aplicación de Windows mientras usaba Microsoft.Office.Interop.Excel; ...... las versiones en tiempo de ejecución no parecen ser compatibles entre una o más DLL.

MI SOLUCIÓN: Convertí toda mi solución de .NET 4.0 a .NET 3.5

por el placer de hacerlo, volví a 4.0 y empecé a recibir el error nuevamente.

basado en esto para su error, intente convertir su solución a un marco .NET anterior que podría funcionar.

========== EDITAR =================

2 horas más tarde termino algunas cosas clave en mi clase de interoperabilidad Excell y funciona como un encanto ... por alguna razón solo en .NET 3.5 y no 4.0 mi solución es válida hasta este punto


Si ve ese mensaje en sus vistas MVC, necesita agregar una referencia en Views / web.config como esta:

<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> (... other references ...) <add namespace="Microsoft.CSharp" /> <-- Add this (...) </namespaces> </pages> </system.web.webPages.razor>

No te olvides de hacer una compilación, de lo contrario los cambios no tendrán efecto.


Tienes que agregar una referencia para la versión de Microsoft.CSharp.dll - v4.0.30319 al proyecto. Que está disponible en C: / Program Files / Reference Assemblies / Microsoft / Framework / .NETFramework / v4.0 / Microsoft.CSharp.dll, después de incluir VS 2010


Tuve este problema cuando actualicé la versión de MVC en mi proyecto. El problema era la directiva assemblyBinding, de alguna manera Nuget se olvidó de actualizarlo.

Tuve que cambiar

<dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> </dependentAssembly>

a

<dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /> </dependentAssembly>


Un proyecto predeterminado en Visual Studio 2010 debe tener referencias a Microsoft.CSharp y System.Core.

Si no se les hace referencia en su proyecto, debe agregarlos y los errores desaparecerán.


Una causa común de este problema es que no ha actualizado una versión de Assembly en su archivo Views/web.config . Es bastante fácil para mí <system.web><pages> en <system.web><pages> por ejemplo:

<pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">


Woow!

Llego casi un año tarde, pero sigo pensando que debería responder en función de mis hallazgos (el 13 de julio de 2013 a las 7:15 p.m. PST) relacionados con el mensaje de error. Esto podría ser útil para los tipos que están buscando la respuesta al mensaje de error:

"One or more types required to compile a dynamic expression cannot be found."

así que por favor sigue leyendo: tuve el mensaje de error similar cuando implementé System.Dynamic en mi código. La aplicación web funciona sin problemas ya que tenía la configuración correcta en web.config (marco de destino) pero cuando puse app_code en un archivo DLL separado, comenzó a lanzar errores en tiempo de compilación. Tenga en cuenta que no tenía app.config en mi dll, por lo que NO puede depender de la configuración cuando lo tenga en un proyecto dll independiente, sino la referencia al dll correcto.

Pensé que Microsoft.CSharp.dll correcto estaba en "C:/Windows/Microsoft.NET/Framework/v4.0.30319" y mi dll compiló correctamente.