为什么我会得到“编译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的引用?
我做了以下
- 遵循升级步骤
- 在Project / Properties / Application选项卡中将目标框架设置为.NET Framwework 4
- 手动添加了System.Core框架
- 添加了Microsoft.CSharp框架
- 添加了System.Xml框架
- 添加了System.Xml.Linq框架
- 确保我的Web.Config是正确的(它通过Web.Debug.Config等书写)
- 创build了模型 , 控制器和Razor 视图
- 创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引用,我假定升级脚本。
好的,我通过以下步骤来完成工作。
- 在configuration文件中,我将system.web部分中的
<compilation debug="true">
更改为<compilation debug="true" targetFramework="4.0">
- 在configuration文件中,我在
<providerOption name="CompilerVersion" value="v3.5" />
将<providerOption name="CompilerVersion" value="v3.5" />
更改为<providerOption name="CompilerVersion" value="v4.0" />
- 在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.cs
的Application_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()