J'ai eu un projet que j'ai mis à jour depuis
Lors de la compilation, une erreur survient lorsque j'essaie d'utiliser ou de définir la propriété @ViewBag.Title
.
Un ou plusieurs types requis pour compiler une expression dynamique sont introuvables. Il vous manque des références à Microsoft.CSharp.dll et System.Core.dll?
J'ai fait ce qui suit
Je ne sais plus quoi faire?
MODIFIER:
Je remarque que dans l'interface graphique GAC, il y a System.Core 3.5.0.0 mais pas System.Core 4.0.0.0. Est-ce que cela signifie que cela devient confus et utilise toujours la version précédente? Ou est-ce que je comprends mal le GAC?
MODIFIER:
Mon web.config ressemble à ce qui suit
...
<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>
....
Okay je l'ai eu avec les étapes suivantes.
<compilation debug="true">
en <compilation debug="true" targetFramework="4.0">
dans la section system.web<providerOption name="CompilerVersion" value="v3.5" />
en <providerOption name="CompilerVersion" value="v4.0" />
dans la section compilateursViewEngines.Engines.Add(new RazorViewEngine());
à la méthode Application_Start()
.et je pense que c'était ça.
Pour ce que ça vaut, quand cela m'est arrivé (dans un projet converti automatiquement de MVC2 en MVC3), tout ce que j'avais à faire était d'ajouter une référence de projet à Microsoft.CSharp. Dans mon cas, web.config avait déjà les références 4.0 mentionnées ici, je suppose par courtoisie du script de mise à niveau.
Vous devez ajouter une référence pour la version Microsoft.CSharp.dll - v4.0.30319 au projet. Qui est disponible dans C:\Program Files\Assemblys de référence\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll, après avoir affiché VS 2010
Pour moi, la solution consistait à ajouter:
ViewEngines.Engines.Add(new RazorViewEngine());
à la méthode Application_Start()
dans global.asax.cs
.
On dirait que vous importez System.Core 3.5 dans votre web.config. Vous devez importer System.Core à partir de la structure 4.0, car ViewBag requiert l’espace de noms System.Dynamic.
Sur ma machine, cela ressemble à System.Core v4.0.30319
Je l'ai résolu de la manière suivante:
J'ai tout d'abord remarqué avec gacutil (Global Assembly Cache Utility) qu'il contenait deux références à System.Core, l'une vers la version 4.0 et l'autre vers la version 3.5. Apparemment, dans les vues de rasoir, même si dans le projet, la référence à la version 4.0 était correcte, elle utilisait toujours la version 3.5 et c’est pourquoi j’obtenais le message d'erreur concernant les types dynamiques .. Administrateur Invite de commandes Visual Studio et exécuter:
gacutil -l System.Core
Pour supprimer la référence à l'ancienne version de System.Core, j'ai procédé comme suit:
- cd %systemroot%\Assembly\
À partir de là, vous pouvez avoir plusieurs répertoires "gac". Vous devrez donc effectuer une recherche dans chacun d'eux pour trouver votre composant. Pour moi, c'était dans le répertoire "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
Maintenant, j'ai ouvert à nouveau ma solution dans Visual studion et l'erreur a disparu, elle fait correctement référence à System.Core 4.0 et je ne reçois plus les erreurs dynamiques :)
J'espère que cela vous aidera aussi, Mieux, N.
Si vous voyez ce message dans vos vues MVC, vous devez ajouter une référence dans le fichier Views\web.config comme suit:
<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>
N'oubliez pas de faire une construction, sinon les changements ne prendront pas effet.
C'était ma résolution:
1) Aller aux références du projet
2) Faites un clic droit sur le Microsoft.CSharp -> Propriétés
3) Changez le Copy Local en False si vous l’avez en True.
Un projet par défaut dans Visual Studio 2010 doit comporter des références à Microsoft.CSharp et System.Core.
S'ils ne sont pas référencés dans votre projet, vous devez les ajouter et les erreurs disparaîtront.
Pour moi, ce qui précède n'a pas fonctionné, mais la définition de Copy Local = True
a résolu le problème.
J'ai eu ce problème lorsque j'ai mis à jour la version MVC dans mon projet. Le problème était la directive assemblyBinding, quelque part Nuget a oublié de la mettre à jour.
Je devais changer
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
à
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
Woow!
J'ai presque un an de retard, mais je pense toujours devoir répondre en fonction de mes conclusions (le 13 juillet 2013 à 7h15 HNP) liées au message d'erreur. Cela peut être utile pour les gars qui cherchent la réponse au message d'erreur:
"One or more types required to compile a dynamic expression cannot be found."
alors s'il vous plaît lisez la suite: J'ai eu le même message d'erreur lorsque j'ai implémenté System.Dynamic
dans mon code. L’application Web fonctionne correctement car j’avais la configuration correcte dans web.config (targetframework), mais lorsque j’ai mis le code app_code dans une dll séparée, elle a commencé à générer des erreurs lors de la compilation. Veuillez noter que je n'avais pas app.config dans ma dll afin que NE PUISSE PAS être dépendant de la configuration lorsque vous l'avez dans un projet de DLL distinct, mais que la référence à la bonne DLL.
J'ai pensé que Microsoft.CSharp.dll
correct était dans "C:\Windows\Microsoft.NET\Framework\v4.0.30319"
et ma dll compilée avec succès.
Cela fait environ un jour que je me bats avec ce problème… .. Après avoir enfin trouvé cet article et essayé toutes les suggestions, je suis parvenu à une autre solution qui résout le problème pour moi:
C'est tout le contraire, comme l'a constaté Arman Bimatov:
1) Aller aux références du projet
2) Faites un clic droit sur le Microsoft.CSharp -> Propriétés
3) Changez le paramètre Copy Local en True si vous l’avez défini sur False.
Je pense que cela doit en quelque sorte concerner les assemblys enregistrés dans GAC et la manière dont Visual Studio obtient la "bonne" version. J'imagine que sur ma machine de développement, le .NET Framework 3.5 a été installé après les nouveaux frameworks (si cela est possible), donc Visual Studio obtient la mauvaise version de GAC. Ou alors, il est difficile pour VS de choisir quelle version, il faut donc la plus ancienne ...
Si vous avez toujours le même message d'erreur, vous pouvez également essayer de définir True Copy Local sur True pour la DLL System.Core et voir si cela fonctionne maintenant.
Cordialement SkippingAdi
Aucun de ce qui précède n'a fonctionné pour moi. En recherchant davantage et en parcourant les paramètres Web.Config, j'ai trouvé cette réponse satisfaisante.
Comme je viens de le découvrir, certaines extensions peuvent aussi causer cela. Dans mon cas, la suppression de l'extension AutoHistory 1.0.1 me l'a corrigé (MVC5).
Une cause fréquente de ce problème est que vous avez oublié de mettre à jour une version d'assembly dans votre fichier Views/web.config
. C'est assez facile pour moi de les manquer dans <system.web><pages>
par exemple:
<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">
J'ai reçu cette erreur pour une application Windows lors de l'utilisation de Microsoft.Office.Interop.Excel; ...... les versions d'exécution ne semblent pas être compatibles entre une ou plusieurs DLL.
Ma solution: J'ai converti toute ma solution de .NET 4.0 en .NET 3.5
pour l'enfer j'ai reconverti à 4.0 et j'ai commencé à recevoir l'erreur encore.
sur la base de ceci pour votre erreur, essayez de convertir votre solution en un framework .NET plus ancien pouvant fonctionner.
========== EDIT ==================
Deux heures plus tard, je termine certains éléments clés de mon cours d'interopérabilité Excell et cela fonctionne à merveille ... pour une raison quelconque, uniquement sur .NET 3.5 et non 4.0, ma solution est valable dans cette mesure
J'ai essayé toutes les autres suggestions de ce fichier et aucune n’a fonctionné avec ma solution MVC 4 existante. Ainsi, après avoir mis à jour mon VS2012 vers WebTools 2013.1 pour VS 2012 , j'ai créé un nouveau projet MVC 5 et en utilisant les fichiers du nouveau projet comme base, j'ai supprimé toutes les lignes superflues de tous mes fichiers web.config.
Après cela, toutes mes erreurs de compilation et mes avertissements ont disparu et Intellisense a commencé à fonctionner correctement. La suppression complète de la section <system.web> <pages> du fichier web.config principal a finalement corrigé les erreurs d’expression dynamique ViewBag.Title (et autres).
Il m’arrivait quelque chose de très similaire, bien que dans mon cas j’ai mis à niveau un certain nombre de choses, notamment de Visual Studio 2010 à Visual Studio 2012. J’avais suivi toutes les suggestions ci-dessus et je souffrais toujours. Finalement, j'ai décidé de recréer l'ensemble du projet. Ce n’est que lorsque j’ai essayé de rajouter les aspects liés au fournisseur d’appartenance à mon fichier web.config que le conflit entre les versions s’est soudainement révélé à moi.
<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>
Bien que regarder maintenant, c'est évident. Le type pour la fourniture a une version spécifique. J'ai simple puis enlevé la version et le type approprié est trouvé. La résolution dans mon cas était donc de remplacer ce qui précède par:
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
<providers>
<clear/>
<add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers" connectionStringName="DefaultConnection" applicationName="/AppName"/>
</providers>
</sessionState>
Et puis recompilez. Cela m'a pris des jours pour le trouver, car je cherchais dans tous les mauvais endroits!
Je me bats avec ce problème depuis des jours et l’ai enfin compris.
Tout ce que j'ai fait est de supprimer les éléments suivants du fichier 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>
Je commence à avoir la même erreur après avoir installé le paquet MVCSiteMapProvider pour créer des chapelures pour mon site.
Si vous avez installé MVCSiteMapProvider et que vous obtenez cette erreur, vous devez remplacer @ViewBag.Title
par autre chose, par exemple, @Html.MvcSiteMap().SiteMapTitle()
.