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

本文关键字:类型 一个 表达式 找不到 编译 为什么 动态 | 更新日期: 2023-09-27 18:06:08

我有一个从更新的项目

  • .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视图
  9. 创建__Layout.cshtml_

我不知道还能做什么?

编辑:

我注意到广汽桂有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>
....

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

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

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

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

我想就是这样。

您必须向项目中添加Microsoft.CSharp.dll版本-v4.0.30319的引用。它可在C:''Program Files''Reference Assemblies''Microsoft''Framework''.NETFramework''v4.0''Microsoft.CSharp.dll中获得,在启动VS 2010

p>对我来说,解决方案是添加:
ViewEngines.Engines.Add(new RazorViewEngine());

与CCD_ 9中的CCD_。

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

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

我用以下方式解决了它:

首先,我注意到使用gautil(全局程序集缓存实用程序(时,它包含两个对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( 转到项目的参考资料

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

3( 如果将"本地复制"设置为True,请将其更改为False。

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

不要忘记进行构建,否则更改将不会产生影响。

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

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

哇!

我迟到了将近一年,但仍然认为我应该根据我的发现(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时,它可能not取决于配置。

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

对我来说,以上所有操作都不起作用,而是设置Copy Local = True解决了

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

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

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

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

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

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

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

如何修复";compilerVersion";IIS错误?

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

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

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

之后,我所有的编译错误和警告都消失了,Intellisense开始正常工作。完全删除<system.web>lt;页面>节最终修复了ViewBag.Title(和其他(动态表达式错误。

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

此问题的一个常见原因是您错过了更新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">

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

正如阿尔曼·比马托夫所发现的那样,情况恰恰相反:

1( 转到项目的参考资料

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

3( 如果将"本地复制"设置为False,请将其更改为True。

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

如果您仍然有相同的错误消息,您也可以尝试将System.Core Dll的"本地复制"设置为True,然后看看它现在是否有效。

问候跳过Adi

我已经为这个问题挣扎了好几天,终于解决了。

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

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

如果您已经安装了MVCSiteMapProvider,并且出现此错误,则需要用其他东西替换@ViewBag.Title,例如@Html.MvcSiteMap().SiteMapTitle()

相关文章: