web-dev-qa-db-fra.com

Pourquoi est-ce que je reçois le message "Un ou plusieurs types nécessaires à la compilation d'une expression dynamique sont introuvables".

J'ai eu un projet que j'ai mis à jour depuis 

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

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

  1. Suit le étapes de la mise à niveau
  2. Définissez le cadre cible dans l'onglet Projet/Propriétés/Application sur .NET Framwework 4.
  3. Ajout du framework System.Core _ ​​ manuellement
  4. Ajout du framework Microsoft.CSharp
  5. Ajout du framework System.Xml
  6. Ajout du framework System.Xml.Linq
  7. Assurez-vous que mon Web.Config est correct (il est écrasé par Web.Debug.Config, etc.)
  8. Création du model, controller et d'un rasoir View
  9. Créer un __Layout.cshtml_

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>
....
61
Lango

Okay je l'ai eu avec les étapes suivantes.

  1. Dans le fichier de configuration, j'ai changé <compilation debug="true"> en <compilation debug="true" targetFramework="4.0"> dans la section system.web
  2. Dans le fichier de configuration, j'ai changé <providerOption name="CompilerVersion" value="v3.5" /> en <providerOption name="CompilerVersion" value="v4.0" /> dans la section compilateurs
  3. Dans Global.asax.cs, j'ai ajouté ViewEngines.Engines.Add(new RazorViewEngine()); à la méthode Application_Start().

et je pense que c'était ça.

49
Lango

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.

63
centralscru

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

34
Sagar Biswas

Pour moi, la solution consistait à ajouter:

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

à la méthode Application_Start() dans global.asax.cs.

12
Patrick Neborg

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

7
Chris Shain

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.

6
kefer9

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.

5
James Wilkins

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.

5
Arman Bimatov

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.

3
Saurabh

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.

2
mohas

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>
2
jBelanger

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.

2
KMX

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

1
user1798599

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.

Comment corriger l'erreur "compilerVersion" IIS?

1
Grandizer

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).

1
Pasi Savolainen

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">
1
Brian Lacy

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

1
WaseemSabjee

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).

1
Jgreenst

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!

1
The Senator

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>
0
mornes

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().

0
Dmitry Stepanov