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

时间:2011-08-18 22:47:22

标签: c# asp.net-mvc c#-4.0

我有一个项目,我已经从

更新了
  • .NET 3.5 MVC v2 to
  • .NET 4.0 MVC v3

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

  

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

我做了以下

  1. 关注upgrade steps
  2. 将项目/属性/应用程序选项卡中的目标框架设置为 .NET Framwework 4
  3. 添加了 System.Core 框架manually
  4. 添加了 Microsoft.CSharp 框架
  5. 添加了 System.Xml 框架
  6. 添加了 System.Xml.Linq 框架
  7. 确保我的 Web.Config 是正确的(它由Web.Debug.Config等编写)
  8. 创建了模型控制器和Razor 查看
  9. 创建__Layout.cshtml _
  10. 我不知道还能做什么?

    编辑:

    我注意到在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 个答案:

答案 0 :(得分:63)

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

答案 1 :(得分:49)

好的,我让它按照以下步骤进行操作。

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

    我认为就是这样。

答案 2 :(得分:34)

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

答案 3 :(得分:12)

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

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

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

答案 4 :(得分:7)

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

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

答案 5 :(得分:6)

我通过以下方式解决了这个问题:

首先我注意到使用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并且我不再获得动态错误:)

我希望它对你有所帮助, 最好的,N。

答案 6 :(得分: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>

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

答案 7 :(得分:5)

这是我的决议:

1)转到项目的参考资料

2)右键单击Microsoft.CSharp - &gt;特性

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

答案 8 :(得分:3)

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

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

答案 9 :(得分:2)

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项目中有 NOT 依赖于配置但是对正确的引用时DLL。

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

答案 10 :(得分:2)

当我在项目中更新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>

答案 11 :(得分:2)

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

答案 12 :(得分:1)

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

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

答案 13 :(得分:1)

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

答案 14 :(得分:1)

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

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

How do I fix the "compilerVersion" IIS error?

答案 17 :(得分:1)

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

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

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

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

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

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

答案 18 :(得分:1)

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

正如Arman Bimatov所发现的那样:

1)转到项目的参考资料

2)右键单击Microsoft.CSharp - &gt;特性

3)如果您将其复制为False,请将Copy Local更改为True。

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

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

此致 SkippingAdi

答案 19 :(得分:0)

我几天来一直在努力解决这个问题并最终弄明白了。

我所做的就是从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>

答案 20 :(得分:0)

安装MVCSiteMapProvider软件包后,我开始收到相同的错误,为我的网站制作面包屑。

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