我有一个项目,我已经从
更新了编译当我尝试使用或设置@ViewBag.Title
属性时,我收到错误。
无法找到编译动态表达式所需的一种或多种类型。 您是否缺少对Microsoft.CSharp.dll和System.Core.dll的引用?
我做了以下
我不知道还能做什么?
编辑:
我注意到在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>
....
答案 0 :(得分:63)
对于它的价值,当发生这种情况时(在从MVC2自动转换为MVC3的项目中),我所要做的就是添加一个项目引用到Microsoft.CSharp。在我的例子中,web.config已经有了这里提到的4.0引用,我假设你有升级脚本。
答案 1 :(得分:49)
好的,我让它按照以下步骤进行操作。
<compilation debug="true">
更改为<compilation debug="true" targetFramework="4.0">
<providerOption name="CompilerVersion" value="v3.5" />
更改为<providerOption name="CompilerVersion" value="v4.0" />
ViewEngines.Engines.Add(new RazorViewEngine());
方法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设置,我发现这个答案对我有用。
答案 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()