【问题标题】:Why am I getting 'One or more types required to compile a dynamic expression cannot be found.'?为什么我会收到“找不到编译动态表达式所需的一种或多种类型。”?
【发布时间】:2011-08-18 22:47:21
【问题描述】:

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

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

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

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

我做了以下事情

  1. 关注upgrade steps
  2. 将 Project/Properties/Application 选项卡中的目标框架设置为 .NET Framwework 4
  3. 添加了 System.Core 框架manually
  4. 添加了 Microsoft.CSharp 框架
  5. 添加了 System.Xml 框架
  6. 添加了 System.Xml.Linq 框架
  7. 确保我的 Web.Config 正确(它被 Web.Debug.Config 等覆盖)
  8. 创建了 modelcontroller 和 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>
....

【问题讨论】:

  • 我不知道该怎么做。我以为你只能在调试/运行单元测试时查看堆栈跟踪?
  • 啊,对不起,我看错了你的问题。我没有意识到您在编译 时遇到了错误。忽略我之前的评论。
  • System.Core 和 Microsoft.CSharp 都是 v4.0.30319?
  • 您是否尝试过关闭整个项目然后再次打开它并重建解决方案...
  • 您是否能够创建一个新的 MVC3 项目并正确构建和运行它?

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


【解决方案1】:

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

【讨论】:

  • 在将传统的 ASP.NET webforms 应用程序从 .NET 3.5 转换为 .NET 4.5,然后将 MVC 添加到项目中后,我遇到了这个问题。添加 Microsoft.CSharp 项目参考解决了该问题。
【解决方案2】:

好的,我通过以下步骤完成了它。

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

我想就是这样。

【讨论】:

  • 谢谢,我遇到了同样的问题。将 targetFramework="4.0" 添加到编译指令中效果很好!
  • 实际上,即使离开框架 4.5,我也只是通过添加 ViewEngine(第 3 点)解决了这个问题。谢谢!
【解决方案3】:

您必须将 Microsoft.CSharp.dll 版本的引用 - v4.0.30319 添加到项目中。安装 VS 2010 后,可在 C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Microsoft.CSharp.dll 中获得

【讨论】:

  • 我通过此工具(和 .NET 3.5 -> .NET 4)blogs.msdn.com/b/marcinon/archive/2011/01/13/… 将 MVC2 项目转换为 MVC3,并且需要显式添加对 Microsoft.CSharp 程序集的引用到我的项目中,这样我就可以使用动态关键字。
  • 这适用于我的场景。该错误出现在类程序集中,并且 Web 配置更改不适用(根据已接受的问题)。
【解决方案4】:

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

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

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

【讨论】:

  • 这也为我修复了它。为什么???在我添加之前,它对 Razor 的理解很好。
【解决方案5】:

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

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

【讨论】:

  • 不错的发现。我尝试了三件事。 1.我删除那行(MvcMovie教程项目没有它)。这给了我同样的错误。 2. 我添加了'',它给了我一个错误和一个警告说它无法加载程序集。 3. 我添加了'',这给出了同样的错误但没有警告。我将编辑我的原始帖子以显示它现在的样子。
  • 我建议创建一个新的 ASP.NET MVC 3 Web 项目并比较 web.config 中的所有相关导入和设置、项目引用(包括系统 dll),然后在重建之前进行清理.此外,如果您在 IIS(而不是本地开发 Web 服务器)上遇到错误,您可能需要从 IIS 运行 aspnet_regiis.exe。 Net 框架 4 文件夹。
  • 我成功创建了 MvcMovie 项目,它是 ASPX.Net MVC V3 教程项目。我比较了两个项目的 .config 文件和引用,一切似乎都一样。我对 IIS 没有任何问题,因为我什至无法编译我的项目。我在 GAC 中注意到有 System.Core 3.5 但没有 4.0,我应该担心吗?
  • 令人惊讶的是,我在 GAC 实用程序中看到了相同的内容 - System.Core 3.5 已列出,但 4.0 未列出。我在项目参考中显示的 System.Core 副本位于路径 C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll。这是您在项目参考中看到的路径吗?
  • 你能编译 MvcMovie 项目吗?
【解决方案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

现在我在visual studion中再次打开我的解决方案,错误消失了,它正确引用了System.Core 4.0,我不再收到动态错误了:)

希望对你也有帮助 贝斯特,N。

【讨论】:

  • 我有两个 3.5/4.0 System.Core 引用,如此处所述,但删除 3.5 似乎没有帮助。顺便说一句,删除 3.5 版本稍微“更安全”的方法:gacutil /uf System.Core,Version=3.5.0.0,Culture=neutral
  • 这解决了我在使用后端自定义 MVC 引擎的 WebFroms 项目中从 VS2012 升级到 VS2012 的问题。 3.5 版本卡在 GAC 中。这解决了问题! +1
【解决方案7】:

这是我的决定:

1) 转到项目的参考资料

2) 右键单击​​ Microsoft.CSharp -> 属性

3) 将 Copy Local 更改为 False,如果您将其设置为 True。

【讨论】:

    【解决方案8】:

    如果您在 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>
    

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

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

        哇!

        我迟到了将近一年,但仍然认为我应该根据与错误消息相关的发现(太平洋标准时间 2013 年 7 月 13 日晚上 7:15)来回答。这可能对正在寻找错误消息答案的人有所帮助:

        "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 编译成功。

        【讨论】:

          【解决方案11】:

          对我来说,上述方法都不起作用,而是设置 Copy Local = True 解决了这个问题

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

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

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

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

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

              2 小时后,我在我的 Excell 互操作类中完成了一些关键的事情,它就像一个魅力......由于某种原因,仅在 .NET 3.5 而不是 4.0 上我的解决方案在这种程度上是有效的

              【讨论】:

                【解决方案14】:

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

                How do I fix the "compilerVersion" IIS error?

                【讨论】:

                  【解决方案15】:

                  我也遇到过类似的事情,尽管我已经升级了很多东西,包括从 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>
                  

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

                  【讨论】:

                  • 好吧,这实际上只是故事的一半,这将我引向了谜题中更简单的部分。我的 web.config 中有重复的条目。查看这是否是您的问题的最佳方法是转到具有视图模型的视图,然后将鼠标悬停在 @model 声明上,看看它是否会警告您 web.config 重复。我觉得自己很愚蠢。
                  【解决方案16】:

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

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

                  【讨论】:

                    【解决方案17】:

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

                    【讨论】:

                      【解决方案18】:

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

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

                      【讨论】:

                        【解决方案19】:

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

                        这与 Arman Bimatov 发现的正好相反:

                        1) 转到项目的参考资料

                        2) 右键单击​​ Microsoft.CSharp -> 属性

                        3) 如果有的话,将 Copy Local 更改为 True。

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

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

                        问候 跳过阿迪

                        【讨论】:

                          【解决方案20】:

                          我已经为这个问题苦苦挣扎了好几天,终于弄明白了。

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

                          【讨论】:

                            【解决方案21】:

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

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

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2014-05-23
                              • 2012-07-28
                              • 2014-08-25
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多