149

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

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

我究竟做错了什么?

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

我最近唯一更改的是将 Simple Injector(通过 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'.
4

11 回答 11

265

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

是的,当您在 .NET 4.0 而不是 .NET 4.5 上执行代码时,这在技术上可能会出错。在 .NET 4.5 中,该属性已从 System.Core.dll 移至 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 命令。


请注意,这种故障模式并非 ILMerge 独有,它只是一种非常常见的情况。在以 4.0 为目标的项目中将这些 4.5 程序集用作参考程序集的任何其他情况都可能以同样的方式失败。从其他问题来看,另一种常见的故障模式是在未使用有效 VS 许可证的情况下设置的构建服务器。并且忽略了多目标包是免费下载的。

使用 c:\program files (x86) 子目录中的参考程序集是一项艰巨的要求。从 .NET 4.0 开始,避免意外依赖于 4.01、4.02 和 4.03 版本中添加的类或方法已经很重要。但现在 4.5 发布绝对必不可少。

于 2012-12-06T18:29:04.687 回答
11

我遇到了这个问题,除了它无法加载的类型是 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 的机器上构建应用程序。远非理想的分辨率。

于 2013-11-26T20:56:57.190 回答
8

我在一个站点(Kentico CMS)上遇到了同样的问题,从 4.5 开始开发,发现生产服务器只支持 4.0,尝试回到 4.0 的目标框架。编译此线程中的其他帖子(特别是将目标框架更改为 .Net 4 和 .Net 4.5 仍被引用)。我搜索了我的解决方案,发现少数 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,删除了所有 NuGet 库,回到 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>
于 2014-02-12T19:36:02.973 回答
6

我今天刚遇到这个烦人的问题。我们使用 SmartAssembly 来打包/混淆我们的 .NET 程序集,但突然间最终产品无法在我们的测试系统上运行。我什至不认为我有.NET 4.5,但显然大约一个月前安装了它。

我卸载了 4.5 并重新安装了 4.0,现在一切都恢复正常了。在这件事上吹了一个下午并没有留下太多印象。

于 2014-02-14T01:43:30.990 回答
4

我在尝试从 Firebird 数据库中读取数据时确实遇到了同样的问题。经过几个小时的搜索,我发现问题是由我在查询中犯的错误引起的。修复它使它完美地工作。它与框架的版本无关

于 2013-11-26T12:18:27.170 回答
3

我们遇到了这个问题,并将其追溯到我们用来帮助​​我们的谷歌地图视图的Geocoding.net NuGet包(Geocoding.net 版本 3.1.0 发布于 2014 年 2 月 4 日)。

当您检查包文件或使用 Jet Brains 的 Dot Peek 应用程序查看它时,Geocoding dll 似乎是 .Net 4.0;但是,我的一位同事说它是使用 ilmerge 编译的,因此很可能与上面列出的 ilmerge 问题有关。

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

于 2014-06-04T16:45:02.030 回答
2

在我的情况下,从 .NET 4.5 降级到 .NET 4.0 项目在本地计算机上运行良好,但在发布后在服务器上失败。

结果发现目的地有一些旧程序集,它们仍在引用 .NET 4.5。

通过启用发布选项“在发布前删除所有现有文件”来修复它

于 2014-07-03T19:57:33.237 回答
1

就我而言,这是在 TeamCity 机器上错过的 Blend SDK。这导致错误是由于错误的组装解决方式导致的。

于 2015-10-19T12:55:26.037 回答
1

只需添加此答案即可帮助 Google 节省我为到达这里所花费的时间。我在我的 .Net 4.0 项目中使用了 ILMerge,没有设置 /targetplatform 选项,假设它可以从我的主程序集中正确检测到。然后,我只收到了来自 Windows XP 又名 WinXP 用户的投诉。现在这很有意义,因为 XP 永远不会安装 > .Net 4.0,而大多数较新的操作系统会。因此,如果您的 XP 用户遇到问题,请参阅上面的修复程序。

于 2016-08-17T02:04:11.747 回答
1

就我而言,我在使用 Microsoft.ReportViewer.WebForms 时遇到了问题。我从 web.config 的行中删除了 validate=trueadd verb并开始工作:

<system.web>
    <httpHandlers>
      <add verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
于 2018-02-20T08:21:05.930 回答
0
AppendTargetFrameworkToOutputPath false

一个不同的边缘案例......

如果您使用该AppendTargetFrameworkToOutputPath属性并将其设置为 false,然后复制针对不同平台的多个程序集,您可能会收到此消息。基本上,框架依赖关系是冲突的。

使用AppendTargetFrameworkToOutputPath true(或只是删除)或确保所有输出模块都针对相同的框架。

于 2021-09-25T13:59:08.173 回答