C# 为什么我会得到';找不到编译动态表达式所需的一个或多个类型;?

C# 为什么我会得到';找不到编译动态表达式所需的一个或多个类型;?,c#,asp.net-mvc,c#-4.0,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的引用 我已经做了以下工作 跟随 将项目/属性/应用程序选项卡中的目标框架设置为.NET FramWork 4 添加了System.Core框架 添加了Microsoft.CSharp框架 添加了System.Xml框架 添

我有一个更新过的项目

  • .NET 3.5 MVC v2至
  • .NET 4.0 MVC v3
编译尝试使用或设置
@ViewBag.Title
属性时出错

找不到编译动态表达式所需的一个或多个类型。 是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用

我已经做了以下工作

  • 跟随
  • 将项目/属性/应用程序选项卡中的目标框架设置为.NET FramWork 4
  • 添加了System.Core框架
  • 添加了Microsoft.CSharp框架
  • 添加了System.Xml框架
  • 添加了System.Xml.Linq框架
  • 确保我的Web.Config是正确的(它被Web.Debug.Config等写入)
  • 创建了模型、控制器和Razor视图
  • 创建一个_Layout.cshtml_
  • 我不知道还能做什么

    编辑:

    我注意到在GACGUI中有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>
    ....
    
    。。。
    ....
    ....
    
    看起来您正在web.config中导入System.Core 3.5。您需要从4.0框架导入System.Core,因为ViewBag需要System.Dynamic命名空间


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

    好的,我通过以下步骤使它工作

  • 在配置文件中,我将system.web部分中的
    更改为
  • 在配置文件中,我将编译器部分的
    更改为
  • 在Global.asax.cs中,我添加了
    ViewEngines.Engines.Add(新的RazorViewEngine())
    应用程序启动()
    方法

  • 我想就是这样。

    我用以下方法解决了这个问题:

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

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

    - cd %systemroot%\assembly\
    
    在这里,您可能有多个“gac”目录,因此您必须在每个目录中进行搜索才能找到您的组件。对我来说,它在“gacmsil”目录中

    - 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
    
    -cd gacmsil
    -cd系统核心
    -光盘__
    -删除**说“y”以确定。
    -cd。。
    -研发部__
    -cd。。
    -研发系统核心
    
    现在我在VisualStudion中再次打开了我的解决方案,错误消失了,它正确地引用了System.Core4.0,我不再得到动态错误:)

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

    值得一提的是,当这件事发生在我身上时(在一个从MVC2自动转换为MVC3的项目中),我所要做的就是向Microsoft.CSharp添加一个项目引用。在我的例子中,web.config已经有了这里提到的4.0引用,我想这是升级脚本的功劳。

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

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

    对于
    global.asax.cs

    中的
    Application\u Start()
    方法,必须在项目中添加Microsoft.CSharp.dll版本-v4.0.30319的参考。在安装VS 2010后,可在C:\Program Files\Reference Assembly\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll上获得该文件。我在使用Microsoft.Office.Interop.Excel时收到windows应用程序的此错误;。。。。。。运行时版本在一个或多个DLL之间似乎不兼容

    我的解决方案: 我将整个解决方案从.NET 4.0转换为.NET 3.5

    该死的,我转换回4.0,然后又开始收到错误

    基于此,针对您的错误,尝试将您的解决方案转换为可以工作的旧.NET框架

    =============编辑=================


    2小时后,我完成了我的ExcelInterop课程中的一些关键内容,它非常有效……出于某种原因,仅在.NET 3.5而不是4.0上,我的解决方案在某种程度上是有效的

    以上所有内容都不适用于我。通过更多的搜索和查看Web.Config设置,我发现这个答案对我很有用


    我也经历过类似的事情,不过就我而言,我已经升级了很多东西,包括从Visual Studio 2010到Visual Studio 2012。我遵循了上面所有的建议,但仍然很痛苦。最后,我决定重新创建整个项目。只有当我尝试将成员资格提供程序方面重新添加到web.config文件时,我才突然意识到版本冲突的地方

    <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>
    
    
    
    虽然现在来看,这是显而易见的。提供的类型具有特定版本。我简单地删除了这个版本,找到了合适的类型。因此,就我而言,决议是用以下内容取代上述内容:

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

    然后重新编译。我花了好几天才找到这个,因为我找错了地方

    Visual Studio 2010中的默认项目应具有对Microsoft.CSharp和System.Core的引用

    如果项目中没有引用它们,您需要添加它们,错误就会消失。

    Woow

    我几乎晚了一年,但仍然认为我应该根据我的发现(太平洋标准时间2013年7月13日晚上7:15)回答这个错误消息。这可能对正在寻找的人有帮助
    "One or more types required to compile a dynamic expression cannot be found."
    
    <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">
    
    <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>
    
      <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>
    
    <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>