Tidak dapat memuat jenis 'System.Runtime.CompilerServices.ExtensionAttribute' dari majelis 'mscorlib

145

Saat memulai situs web saya untuk pertama kalinya, saya mendapatkan kesalahan ini

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

Apa yang saya lakukan salah?

Saya menggunakan .NET 4 dan memulai situs dari Visual Studio.

Satu-satunya hal yang saya ubah baru-baru ini adalah menambahkan Simple Injector (via Nuget) ke proyek saya.

Inilah jejak tumpukan

[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

Baris pertama dari semua tampilan disorot dan ketika Anda mengarahkan kursornya Anda mendapatkan kesalahan ini

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'.
Sachin Kainth
sumber
1
Kami membutuhkan lebih banyak konteks tentang di mana Anda memulai situs web Anda, dan bagaimana caranya. Apakah Anda pasti menggunakan .NET 4 / 4.5?
Jon Skeet
1
NB: jika ada orang yang memiliki gejala yang sama pada output dari server build Anda, periksa apakah Anda memiliki rujukan referensi .net 4.0, setelah menginstal .net 4.5 Anda harus menyalinnya dari kotak dev Anda. Ini biasanya di suatu tempat seperti: C: \ Program Files (x86) \ Assemblies Referensi \ Microsoft \ Framework \ .NETFramework \ v4.0 Untuk lebih jelasnya lihat marcgravell.blogspot.co.nz/2012/09/…
Myster
1
Saya baru saja melihat masalah serupa dengan .NET 4.5 DLL yang digunakan sebagai plugin untuk Microsoft Dynamics CRM 2011 pada mesin yang hanya memiliki .NET 4.0. Alih-alih hanya menolaknya secara langsung, ia mendaftarkannya dan kemudian benar-benar memecah kustomisasi alur kerja (plugin berisi aktivitas alur kerja kustom). Trace menunjukkan bahwa ia tidak dapat menemukan ExtensionAttribute di mscorlib, membawa saya ke sini, membangunnya kembali untuk .NET 4.0 dan masalah terpecahkan! Pemikiran yang harus disebutkan untuk Google-fu masa depan.
Matthew Walton

Jawaban:

262

Tidak dapat memuat jenis 'System.Runtime.CompilerServices.ExtensionAttribute' dari assembly mscorlib

Ya, ini secara teknis bisa salah ketika Anda mengeksekusi kode pada. NET 4.0 bukannya .NET 4.5. Atribut dipindahkan dari System.Core.dll ke mscorlib.dll di .NET 4.5. Sementara itu terdengar seperti perubahan melanggar yang agak jahat dalam versi kerangka kerja yang seharusnya 100% kompatibel, atribut [TypeForwardedTo] seharusnya membuat perbedaan ini tidak dapat diobservasi.

Seperti yang akan dilakukan Murphy, setiap perubahan yang dimaksudkan dengan baik seperti ini memiliki setidaknya satu mode kegagalan yang tak seorang pun pikirkan. Ini tampaknya salah ketika ILMerge digunakan untuk menggabungkan beberapa rakitan menjadi satu dan alat itu digunakan secara tidak benar. Artikel umpan balik yang baik yang menjelaskan kerusakan ini ada di sini . Itu tautan ke posting blog yang menggambarkan kesalahan. Artikel ini agak panjang, tetapi jika saya menafsirkannya dengan benar maka opsi perintah ILMerge yang salah menyebabkan masalah ini:

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

Yang salah Ketika Anda menginstal 4,5 pada mesin yang membangun program maka rakitan dalam direktori tersebut diperbarui dari 4.0 hingga 4.5 dan tidak lagi sesuai untuk menargetkan 4.0. Kebaktian-kebaktian itu seharusnya tidak ada di sana lagi tetapi disimpan untuk alasan yang sama. Majelis referensi yang tepat adalah majelis referensi 4.0, disimpan di tempat lain:

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

Jadi solusi yang mungkin adalah kembali ke 4.0 pada mesin build, instal .NET 4.5 pada mesin target dan perbaikan nyata, untuk membangun kembali proyek dari kode sumber yang disediakan, memperbaiki perintah ILMerge.


Perhatikan bahwa mode kegagalan ini tidak eksklusif untuk ILMerge, itu hanya kasus yang sangat umum. Skenario lain di mana 4,5 majelis ini digunakan sebagai majelis referensi dalam proyek yang menargetkan 4.0 cenderung gagal dengan cara yang sama. Dilihat dari pertanyaan lain, mode kegagalan umum lainnya adalah dalam membangun server yang disetel tanpa menggunakan lisensi VS yang valid. Dan mengabaikan bahwa paket multi-penargetan adalah unduhan gratis .

Menggunakan rakitan referensi dalam subdirektori c: \ program (x86) adalah persyaratan yang sulit. Mulai dari. NET 4.0, sudah penting untuk menghindari ketergantungan pada kelas atau metode yang ditambahkan dalam rilis 4.01, 4.02 dan 4.03 secara tidak sengaja. Tapi sangat penting sekarang bahwa 4,5 dirilis.

Hans Passant
sumber
31
Sungguh jawaban yang luar biasa.
Sachin Kainth
6
Saya mendapatkan semua gejala yang sama, tetapi saya tidak menggunakan ILMerge, ada petunjuk? stacktrace di sini issues.umbraco.org/issue/U4-1708 , bisa jadi DLL pihak ke-3 atau ke-4, tetapi bagaimana cara menemukannya?
Myster
3
Catatan: Anda mungkin tidak memiliki folder "C: \ Program Files \ Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0" untuk versi windows 64 bit, dalam hal ini periksa apakah Anda memiliki "C: \ Program File (x86) \ Referensi Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 "folder.
Maarten Docter
3
Saya tidak menginstal ILMerge dan saya memiliki masalah ini, jadi bagaimana saya bisa memperbaikinya? Apakah saya harus menginstal .net 4.5 di server target?
TamarG
4
Ini membingungkan saya mengapa semua orang terus bersikeras bahwa ini adalah sesuatu yang harus dipecahkan MS. Mereka tidak akan, mereka tidak dapat memperbaiki proyek Anda yang rusak atau membangun server. Gunakan rakitan referensi yang benar, masalah dipecahkan.
Hans Passant
9

Saya punya masalah ini, kecuali tipe yang tidak dapat dimuatnya adalah System.Reflection.AssemblyMetadataAttribute. Aplikasi web dibangun pada mesin dengan .NET 4.5 diinstal (berjalan dengan baik di sana), dengan 4.0 sebagai kerangka kerja target, tetapi kesalahan muncul dengan sendirinya ketika dijalankan pada server web dengan hanya 4.0 yang diinstal. Saya kemudian mencobanya di server web dengan 4,5 diinstal dan tidak ada kesalahan. Jadi, seperti yang orang lain katakan, ini semua disebabkan oleh cara edan Microsoft merilis 4.5, yang pada dasarnya merupakan upgrade ke (dan menimpa) versi 4.0. Majelis System.Reflection referensi jenis yang tidak ada di 4.0 (AssemblyMetadataAttribute) sehingga akan gagal jika Anda tidak memiliki System.Reflection.dll baru.

Anda dapat menginstal .NET 4.5 di server web target, atau membangun aplikasi pada mesin yang tidak memiliki 4,5 diinstal. Jauh dari resolusi ideal.

EricP
sumber
8

Saya punya masalah yang sama persis dengan sebuah situs (Kentico CMS), memulai pengembangan di 4,5, mencari tahu server produksi hanya mendukung 4.0, mencoba kembali ke kerangka kerja target 4.0. Kompilasi posting lain di utas ini (khusus mengubah kerangka target menjadi .Net 4 dan .Net 4.5 masih dirujuk). Saya mencari solusi saya dan menemukan bahwa beberapa paket NuGet masih menggunakan perpustakaan dengan 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>

Saya mengubah kerangka target proyek kembali ke 4,5, menghapus semua perpustakaan NuGet, kembali ke 4,0 dan menambahkan kembali perpustakaan (harus menggunakan beberapa versi sebelumnya yang tidak bergantung pada 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>
vandsh
sumber
5

Saya baru saja mengalami masalah yang mengganggu ini hari ini. Kami menggunakan SmartAssembly untuk mengemas / mengaburkan rakitan .NET kami, tetapi tiba-tiba produk akhir tidak berfungsi pada sistem pengujian kami. Saya bahkan tidak berpikir saya memiliki .NET 4.5, tetapi ternyata sesuatu menginstalnya sekitar sebulan yang lalu.

Saya menghapus 4,5 dan menginstal ulang 4.0, dan sekarang semuanya berfungsi kembali. Tidak terlalu terkesan dengan hal ini pada sore hari.

Profesor1942
sumber
Peringatan di muka untuk Anda, BAHKAN JIKA Anda menyelesaikan masalah sebaliknya, versi membingungkan Anda akan rusak lagi, sehingga Anda mungkin tidak pernah tahu Anda mengatasinya. Artinya, Anda BISA membangun di atas 4,5 dan menyebarkan tanpa masalah ke mesin hanya 4.0. Yang penting bagi saya adalah tambalan multi-penargetan yang disebutkan Hans Passant. Saya bisa melihat dari melihat manifes di ILDASM bahwa ia benar menargetkan System.Core, bukan mscorlib. Tapi BUKAN pada versi yang telah dijalankan melalui SmartAssembly (v5.5).
Josh Sutterfield
4

Saya memang mengalami masalah yang sama ketika mencoba membaca data dari Firebird Database. Setelah berjam-jam mencari, saya menemukan bahwa masalah itu disebabkan oleh kesalahan yang saya buat dalam permintaan. Memperbaikinya membuatnya bekerja dengan sempurna. Itu tidak ada hubungannya dengan versi Kerangka

pengguna3036330
sumber
***, terima kasih, saya mengalami masalah yang sama, bagaimana Anda memperbaikinya?
Benny
3

Kami mengalami masalah ini dan melacaknya ke paket NuGet Geocoding.net yang kami gunakan untuk membantu tampilan Google Maps kami (Geocoding.net versi 3.1.0 diterbitkan 2/4/2014).

Dll Geocoding tampaknya .Net 4.0 ketika Anda memeriksa file paket atau melihatnya menggunakan aplikasi Dot Peek Jet Brains '; Namun, seorang rekan saya mengatakan bahwa itu dikompilasi menggunakan ilmerge sehingga kemungkinan besar terkait dengan masalah ilmerge yang tercantum di atas.

Itu adalah proses yang panjang untuk melacaknya. Kami mengambil perubahan yang berbeda dari TFS sampai kami mempersempitnya ke perubahan yang menambahkan paket NuGet tersebut. Setelah menghapusnya, kami dapat menggunakan server .NET 4 kami.

David Yates
sumber
Dalam kasus kami masalahnya disebabkan oleh Quartz.NET v2.3. Memutakhirkan ke versi 2.3.2 memperbaiki masalah.
Vertigo
2

Dalam kasus saya setelah downgrade dari proyek .NET 4.5 ke .NET 4.0 bekerja dengan baik pada mesin lokal, tetapi gagal pada server setelah penerbitan.

Ternyata tujuan itu memiliki beberapa majelis lama, yang masih merujuk pada .NET 4.5.

Memperbaikinya dengan mengaktifkan opsi penerbitan "Hapus semua file yang ada sebelum dipublikasikan"

Alexander Puchkov
sumber
1

Dalam kasus saya, itu Blend SDK terjawab di mesin TeamCity. Ini menyebabkan kesalahan karena cara perakitan yang salah menyelesaikannya.

Yury Schkatula
sumber
1

Hanya menambahkan jawaban ini untuk membantu Google menghemat beberapa jam yang telah saya habiskan untuk sampai di sini. Saya menggunakan ILMerge pada proyek .Net 4.0 saya, tanpa set opsi / targetplatform, dengan asumsi itu akan terdeteksi dengan benar dari perangkat utama saya. Saya kemudian mendapat keluhan dari pengguna hanya pada Windows XP alias WinXP. Ini sekarang masuk akal karena XP tidak akan pernah menginstal> .Net 4.0 sedangkan sebagian besar OS yang lebih baru. Jadi, jika pengguna XP Anda mengalami masalah, lihat perbaikan di atas.

LMK
sumber
1

Dalam kasus saya, saya punya masalah menggunakan Microsoft.ReportViewer.WebForms. Saya menghapus validate = true dari add verbbaris di web.config dan mulai berfungsi:

<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" />
Matthew Lock
sumber