首页 文章

我为什么要'One or more types required to compile a dynamic expression cannot be found.'?

提问于
浏览
61

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

  • .NET 3.5 MVC v2 to

  • .NET 4.0 MVC v3

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

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

我做了以下事情

  • 关注upgrade steps

  • 将Project / Properties / Application选项卡中的目标框架设置为.NET Framwework 4

  • 添加了System.Core框架manually

  • 添加了Microsoft.CSharp框架

  • 添加了System.Xml框架

  • 添加了System.Xml.Linq框架

  • 确保我的Web.Config是正确的(它由Web.Debug.Config等编写)

  • 创建了模型,控制器和Razor View

  • 创建__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>
....

21 回答

  • 3

    对我来说,不是上述工作,而是设置 Copy Local = True 解决了问题

  • 1

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

  • 2

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

    • 在配置文件中,我在system.web部分中将 <compilation debug="true"> 更改为 <compilation debug="true" targetFramework="4.0">

    • 在配置文件中,我在编译器部分将 <providerOption name="CompilerVersion" value="v3.5" /> 更改为 <providerOption name="CompilerVersion" value="v4.0" />

    • 在Global.asax.cs中,我将 ViewEngines.Engines.Add(new RazorViewEngine()); 添加到 Application_Start() 方法中

    我认为就是这样 .

  • 5

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

  • 1

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

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

    global.asax.cs 中的 Application_Start() 方法 .

  • 1

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

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

  • 63

    我用以下方式解决了它:

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

    gacutil -l System.Core
    

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

    - cd %systemroot%\assembly\
    

    从这里你可能有一个“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
    

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

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

  • 1

    这是我的决议:

    1)转到项目的参考

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

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

  • 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>
    

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

  • 1

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

    如果它们未在您的项目中引用,则需要添加它们,并且错误将消失 .

  • 1

    WOOW!

    我差不多一年了,但仍然认为我应该根据我的调查结果(2013年7月13日太平洋标准时间7:15p)与错误信息相关 . 这可能对正在寻找错误消息答案的人有所帮助:

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

    所以请继续阅读:当我在我的代码中实现 System.Dynamic 时,我收到了类似的错误消息 . Web应用程序运行顺利,因为我在web.config(targetframework)中有正确的配置但是当我将app_code放在一个单独的dll中时,它开始在编译时抛出错误时间 . 请注意,我的dll中没有 app.config ,因此当您在单独的dll项目中使用它时,它可能不依赖于配置,而是对正确的dll的引用 .

    我认为正确的 Microsoft.CSharp.dll"C:\Windows\Microsoft.NET\Framework\v4.0.30319" ,我的dll编译成功 .

  • 49

    当我在项目中更新MVC版本时,我遇到了这个问题 . 问题是assemblyBinding指令,不知何故Nuget忘了更新它 .

    我不得不改变

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

    我在使用Microsoft.Office.Interop.Excel时收到此错误的Windows应用程序; ......运行时版本似乎在一个或多个DLL之间不兼容 .

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

    为了它的地狱,我转换回4.0,我又开始收到错误 .

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

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

    2个小时后,我完成了我的Excell互操作类中的一些关键功能,它就像一个魅力......出于某种原因只在.NET 3.5而不是4.0上,我的解决方案在这个范围内有效

  • 0

    以上都不适合我 . 通过更多搜索和浏览Web.Config设置,我发现这个答案对我有用 .

    How do I fix the "compilerVersion" IIS error?

  • 2

    我有一些非常相似的事情发生在我身上,虽然在我的情况下我已经升级了很多东西,包括从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>
    

    然后重新编译 . 我花了好几天才找到这个,因为我正在寻找所有错误的地方!

  • 7

    我尝试了这个文件中的所有其他建议,但没有一个在我现有的MVC 4解决方案上工作 . 因此,在将我的VS2012更新为WebTools 2013.1 for VS 2012之后,我创建了一个新的MVC 5项目并使用新项目的文件作为基础,从我的所有web.config文件中删除了所有无关的行 .

    完成后,我的所有编译错误和警告都消失了,Intellisense开始正常工作 . 完全删除主web.config文件中的<system.web> <pages>部分最终修复了ViewBag.Title(和其他)动态表达式错误 .

  • 12

    正如我最近发现的,一些扩展也可能导致这种情况 . 在我的情况下删除AutoHistory 1.0.1扩展为我修复它(MVC5) .

  • 6

    此问题的一个常见原因是您错过了更新 Views/web.config 文件中的程序集版本 . 我很容易在_1739428中错过它们,例如:

    <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">
    
  • 34

    我也一直在努力解决这个问题一天左右 . 在我终于在这里找到这篇文章并尝试了所有建议后,我找到了另一个解决问题的解决方案:

    正如Arman Bimatov所发现的那样:

    1)转到项目的参考

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

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

    我认为它必须以某种方式处理在GAC中注册的程序集以及Visual Studio获得“正确”版本的方式 . 我想在我的开发人员机器上以某种方式在较新的框架之后安装了.NET Framework 3.5(如果可能的话),因此Visual Studio从GAC获取了错误的版本 . 或者简单地说,目前还不清楚VS要获得哪个版本,所以它需要较旧版本......

    如果您仍然有相同的错误消息,您还可以尝试为System.Core Dll设置Copy Local to True,并查看它现在可以正常工作 .

    问候SkippingAdi

  • 2

    几天来我一直在努力解决这个问题,终于弄明白了 .

    我所做的只是从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>
    
  • 1

    我安装MVCSiteMapProvider包后为我的网站制作面包屑后,我开始收到同样的错误 .

    如果您安装了MVCSiteMapProvider并且出现此错误,则需要将 @ViewBag.Title 替换为其他内容,例如, @Html.MvcSiteMap().SiteMapTitle()

相关问题