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'.
Jawaban:
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:
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:
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.
sumber
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.
sumber
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".
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).
sumber
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.
sumber
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
sumber
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.
sumber
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"
sumber
Dalam kasus saya, itu Blend SDK terjawab di mesin TeamCity. Ini menyebabkan kesalahan karena cara perakitan yang salah menyelesaikannya.
sumber
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.
sumber
Dalam kasus saya, saya punya masalah menggunakan Microsoft.ReportViewer.WebForms. Saya menghapus validate = true dari
add verb
baris di web.config dan mulai berfungsi:sumber