无法从程序集“mscorlib”加载types“System.Runtime.CompilerServices.ExtensionAttribute”

当我第一次启动我的网站,我得到这个错误

Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

我究竟做错了什么?

我正在使用.NET 4,并从Visual Studio启动站点。

我最近改变的唯一的事情是添加简单的注射器(通过Nuget)到我的项目。

这里是堆栈跟踪

 [TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.] System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) +0 System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) +180 System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +192 System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, RuntimeType& attributeType, IRuntimeMethodInfo& ctor, Boolean& ctorHasParameters, Boolean& isVarArg) +115 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes, Boolean isDecoratedTargetSecurityTransparent) +426 System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly, RuntimeType caType) +103 System.Reflection.RuntimeAssembly.GetCustomAttributes(Type attributeType, Boolean inherit) +64 WebActivator.AssemblyExtensions.GetActivationAttributes(Assembly assembly) +132 WebActivator.ActivationManager.RunActivationMethods() +216 WebActivator.ActivationManager.RunPreStartMethods() +43 WebActivator.ActivationManager.Run() +69 [InvalidOperationException: The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..] System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +423 System.Web.Compilation.BuildManager.CallPreStartInitMethods() +306 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +677 [HttpException (0x80004005): The pre-application start initialization method Run on type WebActivator.ActivationManager threw an exception with the following error message: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'..] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9090876 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97 System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +258 

所有视图的第一行会突出显示,当您将鼠标hover在其上时,您会看到此错误

 The pre-application start initialisation method Run on type WebActivator.ActivationManager threw an exception with the following error message Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. 

无法从程序集mscorlib中加载types“System.Runtime.CompilerServices.ExtensionAttribute”

是的,当您在.NET 4.0而不是.NET 4.5上执行代码时,技术上可能会出错。 该属性已从System.Core.dll移到.NET 4.5中的mscorlib.dll。 虽然这听起来像是一个相当可怕的突破变化,应该是100%兼容的框架版本,[TypeForwardedTo]属性应该使这种差异不可观察。

就像墨菲所说的那样,每一个像这样有意义的改变都至less有一个没人想到的失败模式。 当使用ILMerge将多个程序集合并成一个程序并且该工具使用不正确时,这似乎出错。 描述这种破损的好的反馈文章就在这里 。 它链接到描述错误的博客文章 。 这是一个很长的文章,但如果我正确解释它,那么错误的ILMerge命令行选项会导致此问题:

  /targetplatform:"v4,c:\windows\Microsoft.NET\Framework\v4.0.30319" 

这是不正确的。 在构build程序的机器上安装4.5时,该目录中的程序集将从4.0更新到4.5,不再适合目标4.0。 那些集会真的不应该在那里,但由于兼容的原因。 正确的引用程序集是其他地方存储的4.0引用程序集:

  /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0" 

因此,可能的解决方法是在构build机器上回退到4.0,在目标机器上安装.NET 4.5并且真正修复,从所提供的源代码重build项目,修复ILMerge命令。


请注意,这种故障模式并不是ILMerge专有的,这只是一个非常常见的情况。 任何其他情况下,这些4.5程序集被用作目标为4.0的项目中的引用程序集时,可能会以同样的方式失败。 从其他问题来看,另一种常见的故障模式是在没有使用有效的VS许可证的情况下build立服务器。 并且忽略了多目标包是免费下载的 。

在c:\ program files(x86)子目录中使用引用程序集是非常困难的要求。 从.NET 4.0开始,对于避免意外地依赖4.01,4.02和4.03版本中添加的类或方法,这一点已经很重要。 但现在发布的4.5是绝对必要的。

我有这个问题,除了它无法加载的types是System.Reflection.AssemblyMetadataAttribute。 该Web应用程序是build立在安装了.NET 4.5的机器上(在那里运行得很好),目标框架为4.0,但是当它只在安装了4.0的Web服务器上运行时出现错误。 然后我在安装了4.5的Web服务器上试了一下,没有错误。 所以,正如其他人所说的那样,这全部归功于微软发布的4.5版本,基本上是版本4.0的升级(和覆盖)。 System.Reflection程序集引用4.0(AssemblyMetadataAttribute)中不存在的types,因此如果您没有新的System.Reflection.dll它将会失败。

您可以在目标Web服务器上安装.NET 4.5,或者在未安装4.5的计算机上构build应用程序。 远非理想的解决scheme。

我有一个与网站(Kentico CMS)完全相同的问题,从4.5开始开发,发现生产服务器只支持4.0,尝试回到4.0的目标框架。 编译这个线程中的其他post(特别是将目标框架更改为.Net 4和.Net 4.5仍被引用)。 我search了我的解决scheme,发现一些NuGet包仍在使用targetFramework =“net45”的库。

 packages.config (before): <?xml version="1.0" encoding="utf-8"?> <packages> <package id="AutoMapper" version="3.1.0" targetFramework="net45" /> <package id="EntityFramework" version="5.0.0" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net45" /> <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" /> </packages> 

我把项目目标框架改回到4.5,删除了所有的Nu​​Get库,再回到4.0,重新添加这些库(必须使用一些不依赖于4.5的先前版本)。

 packages.config (after): <?xml version="1.0" encoding="utf-8"?> <packages> <package id="AutoMapper" version="3.1.1" targetFramework="net40" /> <package id="EntityFramework" version="6.0.2" targetFramework="net40" /> <package id="Microsoft.AspNet.WebApi.Client" version="4.0.30506.0" targetFramework="net40" /> <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40" /> <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" /> </packages> 

我今天刚遇到这个烦人的问题。 我们使用SmartAssembly来打包/混淆我们的.NET程序集,但是突然间最终的产品在我们的testing系统上没有工作。 我甚至没有想到我有.NET 4.5,但是显然在一个月前安装了它。

我卸载4.5,并重新安装4.0,现在一切正常工作。 在这个问题上吹了一个下午,我不觉得印象深刻。

我试图从Firebird数据库读取数据时遇到同样的问题。 经过几个小时的search之后,我发现问题是由我在查询中发生的一个错误引起的。 修复它使它完美的工作。 它与框架的版本无关

我们遇到了这个问题,并将其跟踪到我们用来帮助​​Google地图视图(Geocoding.net version 3.1.0 published 2/4/2014)的Geocoding.net NuGet包。

当你检查包文件或使用Jet Brains的Dot Peek应用程序查看时,Geocoding DLL似乎是.Net 4.0; 然而,我的一个同事说,它是用ilmerge编译的,所以最有可能与上面列出的ilmerge问题有关。

追踪它是一个漫长的过程。 我们从TFS获取不同的变更集,直到我们缩小到添加了上述NuGet包的变更集。 删除后,我们能够部署到我们的.NET 4服务器。

在我的情况下,从.NET 4.5降级到.NET 4.0项目在本地机器上工作正常,但在发布后在服务器上失败。

原来,目的地有一些旧的程序集,仍然参考.NET 4.5。

通过启用发布选项“发布之前删除所有现有文件”

就我而言,在TeamCity机器上错过了Blend SDK。 这造成了错误,因为不正确的解决方法,然后解决。

只是添加这个答案,以帮助Google节省一些下水时间,我花了这里。 我使用ILMerge在我的.Net 4.0项目,没有/ targetplatform选项设置,假设它会从我的主要组件正确检测到。 然后,我只有在Windows XP又名WinXP用户的投诉。 这现在是有道理的,因为XP永远不会安装> .Net 4.0,而大多数更新的操作系统将会。 所以,如果你的XP用户有问题,请参阅上面的修复程序。