为什么我会得到“编译dynamicexpression式所需的一个或多个types无法find”?

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

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

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

编译dynamicexpression式所需的一个或多个types无法find。 您是否缺less对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. 创build了模型控制器和Razor 视图
  9. 创build一个__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> .... 

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

好的,我通过以下步骤来完成工作。

  1. 在configuration文件中,我将system.web部分中的<compilation debug="true">更改为<compilation debug="true" targetFramework="4.0">
  2. 在configuration文件中,我在<providerOption name="CompilerVersion" value="v3.5" /><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到项目。 在安装VS 2010之后,在C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 \ Microsoft.CSharp.dll中可用。

对我来说,解决办法是补充:

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

global.asax.csApplication_Start()方法。

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

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

我用下面的方法解决了它:

首先,我注意到使用gacutil(全局程序集caching实用工具),它包含两个引用System.Core,一个版本4.0和一个版本3.5。 显然在剃刀视图内,即使在项目中,我有正确的引用版本4.0,它仍然使用3.5版本,这就是为什么我得到有关dynamictypes的错误。 要检查您的情况是否以pipe理员Visual Studio命令提示符打开并执行:

 gacutil -l System.Core 

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

 - cd %systemroot%\assembly\ 

从这里你可能有更多的一个“gac”目录,所以你将不得不在每个search内find你的组件。 对我来说,它在“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 

现在,我再次打开我的解决scheme,视觉研究和错误消失了,它适当引用到System.Core 4.0,我没有得到dynamic错误了:)

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

这是我的决议:

1)转到项目的参考

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

3)将复制本地更改为假。

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

不要忘记做一个构build,否则的变化不会影响。

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

如果他们没有在你的项目中引用,你需要添加他们,错误将消失。

WOOW!

我差了近一年,但仍然认为我应该根据我的发现(2013年7月13日7时15分PST)回答有关错误消息。 这可能对正在查找错误消息的答案的人有所帮助:

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

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

我想正确的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。

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

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

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

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

2个小时后,我完成了一些关键的东西在我的Excell互操作课,它的作品就像一个魅力…出于某种原因只在.NET 3.5而不是4.0我的解决scheme是有效的这个程度

以上都没有为我工作。 随着更多的search和浏览Web.Config设置,我发现这个答案为我工作。

如何解决“compilerVersion”IIS错误?

我发生了一些非常类似的事情,虽然在我的情况下,我已经升级了许多东西,包括从Visual Studio 2010到Visual Studio 2012.我已经遵循了上述所有build议,但仍然受到了影响。 最后我决定重新创build整个项目。 只是当我试图重新添加成员供应商方面到我的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> 

虽然现在看,它显而易见。 提供的types具有特定的版本。 我简单,然后删除版本,并find适当的types。 因此,在我的情况下决议是取代上述:

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

然后重新编译。 我花了几天的时间才发现这一点,因为我正在寻找所有错误的地方!

我尝试了这个文件中的所有其他build议,没有任何工作在我现有的MVC 4解决scheme。 所以在将VS2012更新为VS 2012的WebTools 2013.1后 ,我创build了一个新的MVC 5项目,并使用新项目的文件作为基础,从所有web.config文件中删除了所有无关的行。

这样做后,我所有的编译错误和警告消失,智能感知开始正常工作。 完全删除主web.config文件中的<system.web> <pages>部分,最后修复ViewBag.Title(和其他)dynamicexpression式错误。

正如我最近发现的,一些扩展也可以导致这一点。 在我的情况下,删除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"> 

我一直在这个问题上挣扎了一天左右。 在我终于在这里find这篇文章,并尝试了所有的build议后,我来到另一个解决scheme,为我解决了这个问题:

正如阿曼·比马托夫(Arman Bimatov)发现的那样:

1)转到项目的参考

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

3)将复制本地更改为True,如果您将其设置为False。

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

如果你仍然有相同的错误信息,你也可以尝试为System.Core Dll设置复制本地为真,看看它现在的作品。

问候SkippingAdi

我一直在为这个问题挣扎好几天,终于搞清楚了。

我所做的只是从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,并且你得到这个错误,你需要用别的东西replace@ViewBag.Title ,例如@Html.MvcSiteMap().SiteMapTitle()