无法从程序集'mscorlib加载'System.Runtime.CompilerServices.ExtensionAttribute'类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (359)

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

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

所有视图的第一行会突出显示,当您将鼠标悬停在它们上面时,会出现此错误

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加载类型'System.Runtime.CompilerServices.ExtensionAttribute'

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

每一个像这样有意义的改变都至少有一个没人想到的失败模式。当ILMerge被用来将多个程序集合并成一个并且该工具被错误地使用时,这似乎出错了。但如果我正确解释它,那么错误的ILMerge命令行选项会导致此问题:

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

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

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

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

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

用户回答回答于

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

可以在目标Web服务器上安装.NET 4.5,或者在未安装4.5的计算机上构建应用程序。远非理想的分辨率。

扫码关注云+社区