为什么我得到'无法找到编译动态表达式所需的一种或多种类型.'?

Lan*_*ngo 61 c# asp.net-mvc c#-4.0

我有一个项目,我已经更新

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

编译我尝试使用或设置@ViewBag.Title属性时收到错误.

无法找到编译动态表达式所需的一种或多种类型.您是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用?

我做了以下事情

  1. 遵循升级步骤
  2. 将Project/Properties/Application选项卡中的目标框架设置为.NET Framwework 4
  3. 手动添加了System.Core框架
  4. 添加了Microsoft.CSharp框架
  5. 添加了System.Xml框架
  6. 添加了System.Xml.Linq框架
  7. 确保我的Web.Config是正确的(它由Web.Debug.Config等编写)
  8. 创建了模型,控制器和Razor View
  9. 创建__Layout.cshtml_

我不知道还能做什么?

编辑:

我注意到在GAC Gui中有System.Core 3.5.0.0但没有System.Core 4.0.0.0.这是否意味着它变得困惑并仍在使用以前的版本?或者我误解了GAC?

编辑:

我的web.config看起来如下

...
<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>
....
Run Code Online (Sandbox Code Playgroud)

cen*_*cru 63

对于它的价值,当我遇到这种情况时(在从MVC2自动转换为MVC3的项目中),我所要做的就是添加一个项目引用到Microsoft.CSharp.在我的情况下,web.config已经有了这里提到的4.0引用,我假设升级脚本.


Lan*_*ngo 49

好的,我让它使用以下步骤.

  1. 在配置文件中我改变<compilation debug="true">,以<compilation debug="true" targetFramework="4.0">在system.web节
  2. 在配置文件中我改变<providerOption name="CompilerVersion" value="v3.5" />,以<providerOption name="CompilerVersion" value="v4.0" />在编译器部分
  3. 在Global.asax.cs中,我添加ViewEngines.Engines.Add(new RazorViewEngine());了该Application_Start()方法

我认为就是这样.

  • 谢谢,我遇到了同样的问题.将targetFramework ="4.0"添加到编译指令非常有效! (3认同)
  • 实际上,即使离开框架4.5,我只是通过添加ViewEngine解决了这个问题(第3点).谢谢! (2认同)

小智 34

您必须将Microsoft.CSharp.dll版本的参考 - v4.0.30319添加到项目中.在执行VS 2010之后,可以在C:\ Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll中找到它


小智 12

对我来说,解决方案是添加:

ViewEngines.Engines.Add(new RazorViewEngine());
Run Code Online (Sandbox Code Playgroud)

到了Application_Start()方法global.asax.cs.

  • 这也为我解决了这个问题.为什么???在我加入之前,我很了解Razor. (3认同)

Chr*_*ain 7

看起来您正在web.config中导入System.Core 3.5.您需要从4.0框架导入System.Core,因为ViewBag需要System.Dynamic命名空间.

在我的机器上,它看起来像System.Core v4.0.30319

  • 我建议创建一个新的ASP.NET MVC 3 Web项目,并比较web.config中的所有相关导入和设置,项目引用(包括系统dll),然后在重建之前进行清理.此外,如果您在IIS上收到错误(而不是本地开发Web服务器),您可能需要从中运行aspnet_regiis.exe.Net framework 4文件夹. (3认同)

kef*_*er9 6

我用以下方式解决了它:

首先我注意到使用gacutil(全局程序集缓存实用程序),它包含两个对System.Core的引用,一个引用到4.0版,一个引用到3.5版.显然在剃刀视图中,即使在项目中我有正确的4.0版本引用,它仍然使用版本3.5,这就是为什么我得到关于动态类型的错误.要检查您的案例是否以管理员身份打开Visual Studio命令提示符并执行:

gacutil -l System.Core
Run Code Online (Sandbox Code Playgroud)

要删除对旧版System.Core的引用,我执行了以下步骤:

- cd %systemroot%\assembly\
Run Code Online (Sandbox Code Playgroud)

从这里你可能有一个"gac"目录,所以你必须在每个目录中搜索才能找到你的组件.对我来说,它位于"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
Run Code Online (Sandbox Code Playgroud)

现在我在视觉研究中再次打开我的解决方案并且错误消失了,它正确地引用了System.Core 4.0并且我不再获得动态错误:)

我希望它也能帮助你,Best,N.


Arm*_*tov 5

这是我的决议:

1)转到项目的参考

2)右键单击Microsoft.CSharp - > Properties

3)如果将其复制为True,则将Copy Local更改为False.


Jam*_*ins 5

如果在MVC视图中看到该消息,则需要在Views\web.config中添加引用,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

不要忘记进行构建,否则更改不会生效.