Không thể tải loại 'System.R.78.CompilerService.ExtensionAttribution' từ assembly 'mscorlib


145

Khi khởi động trang web của tôi lần đầu tiên, tôi gặp lỗi này

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

Tôi đang làm gì sai?

Tôi đang sử dụng .NET 4 và đang bắt đầu trang web từ Visual Studio.

Điều duy nhất tôi đã thay đổi gần đây là thêm Simple In phun (thông qua Nuget) vào dự án của mình.

Đây là dấu vết ngăn xếp

[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

Dòng đầu tiên của tất cả các chế độ xem được tô sáng và khi bạn di chuột qua chúng, bạn sẽ gặp lỗi này

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'.

1
Chúng tôi cần thêm ngữ cảnh về nơi bạn bắt đầu trang web của mình và cách thức. Bạn có chắc chắn sử dụng .NET 4 / 4.5 không?
Jon Skeet

1
Lưu ý: nếu bất kỳ ai có cùng triệu chứng đầu ra từ máy chủ bản dựng của bạn, hãy kiểm tra xem bạn có tập hợp tham chiếu .net 4.0 không, sau khi cài đặt .net 4.5, bạn sẽ cần sao chép chúng từ hộp dev của mình. Đây là những thường ở đâu đó như: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 Để biết thêm chi tiết, xem marcgravell.blogspot.co.nz/2012/09/...
Myster

1
Tôi vừa thấy một vấn đề tương tự với .NET 4.5 DLL đang được sử dụng làm plugin cho Microsoft Dynamics CRM 2011 trên một máy chỉ có .NET 4.0. Thay vì chỉ từ chối nó hoàn toàn, nó đã đăng ký nó và sau đó hoàn toàn phá vỡ tùy chỉnh dòng công việc (plugin chứa một hoạt động dòng công việc tùy chỉnh). Trace cho thấy rằng nó không thể tìm thấy ExtensionAttribution trong mscorlib, dẫn tôi đến đây, xây dựng lại nó cho .NET 4.0 và vấn đề đã được giải quyết! Thiết nghĩ rằng nên được đề cập cho Google-fu trong tương lai.
Matthew Walton

Câu trả lời:


262

Không thể tải loại 'System.R.78.CompilerService.ExtensionAttribution' từ lắp ráp mscorlib

Có, điều này về mặt kỹ thuật có thể sai khi bạn thực thi mã trên .NET 4.0 thay vì .NET 4.5. Thuộc tính đã được chuyển từ System.Core.dll sang mscorlib.dll trong .NET 4.5. Mặc dù nghe có vẻ như là một thay đổi phá vỡ khá khó chịu trong phiên bản khung được cho là tương thích 100%, nhưng thuộc tính [TypeForwardedTo] được cho là không thể quan sát được sự khác biệt này.

Như Murphy sẽ có nó, mọi thay đổi có chủ đích như thế này đều có ít nhất một chế độ thất bại mà không ai nghĩ tới. Điều này dường như sai khi ILMerge được sử dụng để hợp nhất một số hội đồng thành một và công cụ đó đã được sử dụng không chính xác. Một bài viết phản hồi tốt mô tả sự đổ vỡ này là ở đây . Nó liên kết đến một bài viết blog mô tả sai lầm. Đây là một bài viết dài, nhưng nếu tôi diễn giải chính xác thì tùy chọn dòng lệnh ILMerge sai gây ra vấn đề này:

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

Mà không đúng. Khi bạn cài đặt 4.5 trên máy xây dựng chương trình thì các cụm trong thư mục đó được cập nhật từ 4.0 lên 4.5 và không còn phù hợp với mục tiêu 4.0. Những hội đồng đó thực sự không nên ở đó nữa nhưng được giữ lại vì lý do compat. Các tập hợp tham chiếu thích hợp là các tập hợp tham chiếu 4.0, được lưu trữ ở nơi khác:

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

Vì vậy, cách giải quyết có thể là quay trở lại 4.0 trên máy dựng, cài đặt .NET 4.5 trên máy đích và sửa lỗi thực sự, để xây dựng lại dự án từ mã nguồn được cung cấp, sửa lệnh ILMerge.


Xin lưu ý rằng chế độ thất bại này không dành riêng cho ILMerge, đây chỉ là một trường hợp rất phổ biến. Bất kỳ kịch bản nào khác trong đó các hội đồng 4.5 này được sử dụng làm hội đồng tham chiếu trong dự án nhắm mục tiêu 4.0 có thể bị lỗi theo cùng một cách. Đánh giá từ các câu hỏi khác, một chế độ thất bại phổ biến khác là trong các máy chủ xây dựng được thiết lập mà không sử dụng giấy phép VS hợp lệ. Và nhìn ra rằng các gói đa mục tiêu là một tải về miễn phí .

Sử dụng các tập hợp tham chiếu trong thư mục con c: \ chương trình (x86) là một yêu cầu cứng. Bắt đầu từ .NET 4.0, điều quan trọng là tránh vô tình phụ thuộc vào một lớp hoặc phương thức đã được thêm vào trong các bản phát hành 4.01, 4.02 và 4.03. Nhưng hoàn toàn cần thiết bây giờ 4.5 được phát hành.


31
Thật là một câu trả lời tuyệt vời.
Sachin Kainth

6
Tôi đang nhận được tất cả các triệu chứng giống nhau, nhưng tôi không sử dụng ILMerge, có manh mối nào không? stacktrace ở đây problems.umbraco.org/su/U4-1708 , nó có thể là DLL của bên thứ 3 hoặc thứ 4, nhưng làm cách nào để tìm thấy nó?
Bí ẩn

3
Lưu ý: Bạn có thể không có thư mục "C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0" trong trường hợp có phiên bản windows 64 bit, trong trường hợp đó hãy kiểm tra xem bạn có "Chương trình C: \ không Tệp (x86) \ Thư mục tham khảo \ Microsoft \ Framework \ .NETFramework \ v4.0 ".
Maarten Docter

3
Tôi đã không cài đặt ILMerge và tôi gặp vấn đề này, vậy làm cách nào để khắc phục? Tôi có phải cài đặt .net 4.5 trên máy chủ đích không?
Tam sư

4
Điều này làm tôi hoang mang tại sao mọi người cứ khăng khăng rằng đây là điều mà MS nên giải quyết. Họ sẽ không, họ không thể sửa chữa các dự án bị hỏng của bạn hoặc xây dựng máy chủ. Sử dụng các hội đồng tham khảo chính xác, vấn đề được giải quyết.
Hans Passant

9

Tôi gặp vấn đề này, ngoại trừ loại nó không thể tải là System.Reflection.Ass lanhMetadataAttribution. Ứng dụng web được xây dựng trên một máy có cài đặt .NET 4.5 (chạy tốt ở đó), với 4.0 là khung đích, nhưng lỗi xuất hiện khi nó chạy trên máy chủ web chỉ cài đặt 4.0. Sau đó tôi đã thử nó trên một máy chủ web với 4.5 cài đặt và không có lỗi. Vì vậy, như những người khác đã nói, tất cả là do cách mà Microsoft phát hành 4.5, về cơ bản là một bản nâng cấp lên (và ghi đè lên) phiên bản 4.0. Tập hợp System.Reflection tham chiếu một loại không tồn tại trong 4.0 (AssociationMetadataAttribution) nên nó sẽ thất bại nếu bạn không có System.Reflection.dll mới.

Bạn có thể cài đặt .NET 4.5 trên máy chủ web đích hoặc xây dựng ứng dụng trên máy chưa cài đặt 4.5. Khác xa với một độ phân giải lý tưởng.


8

Tôi đã gặp vấn đề tương tự chính xác với một trang web (Kentico CMS), bắt đầu phát triển từ 4.5, tìm ra máy chủ sản xuất chỉ hỗ trợ 4.0, đã thử quay trở lại khung mục tiêu 4.0. Biên dịch các bài viết khác trong chuỗi này (cụ thể thay đổi khung mục tiêu thành .Net 4 và .Net 4.5 vẫn đang được tham chiếu). Tôi đã tìm kiếm thông qua giải pháp của mình và thấy rằng một số gói NuGet vẫn đang sử dụng các thư viện với 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>

Tôi đã thay đổi khung mục tiêu dự án trở lại 4.5, xóa tất cả các thư viện NuGet, quay lại 4.0 và thêm lại các thư viện (phải sử dụng một số phiên bản trước đó không phụ thuộc vào 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>

5

Tôi chỉ gặp vấn đề khó chịu ngày hôm nay. Chúng tôi sử dụng SmartAssugging để đóng gói / làm xáo trộn các cụm .NET của chúng tôi, nhưng đột nhiên sản phẩm cuối cùng không hoạt động trên các hệ thống thử nghiệm của chúng tôi. Tôi thậm chí không nghĩ rằng mình đã có .NET 4.5, nhưng rõ ràng có thứ gì đó đã cài đặt nó khoảng một tháng trước.

Tôi đã gỡ cài đặt 4.5 và cài đặt lại 4.0, và bây giờ mọi thứ đang hoạt động trở lại. Không quá ấn tượng với việc đã thổi một buổi chiều về điều này.


Cảnh báo trước cho bạn, NGAY CẢ NẾU bạn giải quyết vấn đề nếu không, phiên bản bị che giấu của bạn sẽ bị hỏng lần nữa, vì vậy bạn có thể không bao giờ biết bạn đã giải quyết nó. Đó là, bạn CÓ THỂ xây dựng trên 4.5 và triển khai mà không gặp sự cố với các máy chỉ 4.0. Tất cả những gì cần thiết đối với tôi là bản vá đa mục tiêu mà Hans Passant đề cập. Tôi có thể thấy khi nhìn vào bảng kê khai trong ILDASM rằng nó đã nhắm mục tiêu chính xác vào System.Core thay vì mscorlib. Nhưng KHÔNG phải trên phiên bản đã được chạy qua SmartAssugging (v5.5).
Josh Sutterfield 23/1/2015

4

Tôi đã gặp phải vấn đề tương tự trong khi cố gắng đọc dữ liệu từ Cơ sở dữ liệu Firebird. Sau nhiều giờ tìm kiếm, tôi phát hiện ra rằng vấn đề là do lỗi tôi gây ra trong truy vấn. Sửa chữa nó làm cho nó hoạt động hoàn hảo. Nó không liên quan gì đến phiên bản của Framework


người đàn ông, cảm ơn, tôi gặp vấn đề tương tự, làm thế nào bạn sửa nó?
Benny

3

Chúng tôi đã gặp phải vấn đề này và theo dõi nó xuống gói NuGet của Geocoding.net mà chúng tôi đang sử dụng để trợ giúp với các lượt xem Google Maps của chúng tôi (Geocoding.net phiên bản 3.1.0 được xuất bản 2/4/2014).

Dll Geocoding xuất hiện là .Net 4.0 khi bạn kiểm tra tệp gói hoặc xem nó bằng ứng dụng Dot Peek của Jet Brains; tuy nhiên, một đồng nghiệp của tôi nói rằng nó được biên soạn bằng cách sử dụng ilmerge nên rất có thể liên quan đến các vấn đề về ilmerge được liệt kê ở trên.

Đó là một quá trình dài để theo dõi nó xuống. Chúng tôi đã tìm nạp các thay đổi khác nhau từ TFS cho đến khi chúng tôi thu hẹp nó vào bộ thay đổi đã thêm gói NuGet đã nói ở trên. Sau khi gỡ bỏ nó, chúng tôi đã có thể triển khai đến máy chủ .NET 4 của chúng tôi.


Trong trường hợp của chúng tôi, sự cố được gây ra bởi Quartz.NET v2.3. Nâng cấp lên phiên bản 2.3.2 đã khắc phục sự cố.
Vertigo

2

Trong trường hợp của tôi sau khi hạ cấp từ dự án .NET 4.5 xuống .NET 4.0 đã hoạt động tốt trên máy cục bộ, nhưng đã bị lỗi trên máy chủ sau khi xuất bản.

Hóa ra đích đến đó có một số hội đồng cũ, vẫn đang tham khảo .NET 4.5.

Đã sửa nó bằng cách bật tùy chọn xuất bản "Xóa tất cả các tệp hiện có trước khi xuất bản"


1

Trong trường hợp của tôi, đó là Blend SDK bị bỏ lỡ trên máy TeamCity. Điều này gây ra lỗi do cách lắp ráp không đúng cách giải quyết sau đó.


1

Chỉ cần thêm câu trả lời này để giúp Google tiết kiệm một số người bỏ ra số giờ tôi đã dành để đến đây. Tôi đã sử dụng ILMerge trong dự án .Net 4.0 của mình, mà không có tùy chọn / targetpl platform, giả sử nó sẽ được phát hiện chính xác từ hội đồng chính của tôi. Sau đó tôi đã có khiếu nại từ người dùng chỉ trên Windows XP hay còn gọi là WinXP. Điều này bây giờ có ý nghĩa vì XP sẽ không bao giờ cài đặt> .Net 4.0 trong khi hầu hết các hệ điều hành mới hơn sẽ có. Vì vậy, nếu người dùng XP của bạn gặp sự cố, hãy xem các bản sửa lỗi ở trên.


1

Trong trường hợp của tôi, tôi đã gặp sự cố khi sử dụng Microsoft.ReportViewer.WebForms. Tôi đã xóa xác thực = true khỏi add verbdòng trong web.config và nó bắt đầu hoạt động:

<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" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.