'System.Runtime.CompilerServices.ExtensionAttribute' türü derlemeden yüklenemedi mscorlib


145

Web sitemi ilk kez başlatırken bu hatayı alıyorum

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

Neyi yanlış yapıyorum?

.NET 4 kullanıyorum ve siteyi Visual Studio'dan başlatıyorum.

Son zamanlarda değiştirdiğim tek şey projeme Basit Enjektör (Nuget üzerinden) eklemektir.

İşte yığın izlemesi

[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

Tüm görünümlerin ilk satırı vurgulanır ve üzerine geldiğinizde bu hatayı alırsınız

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
Web sitenizi nereden başlattığınız ve nasıl başlayacağınız konusunda daha fazla içeriğe ihtiyacımız var. Kesinlikle .NET 4 / 4.5 kullanıyor musunuz?
Jon Skeet

1
Not: Yapı sunucunuzdaki çıktıda aynı belirtiler varsa, .net 4.0 başvuru derlemelerinizin olup olmadığını denetleyin, .net 4.5'i yükledikten sonra bunları geliştirici kutunuzdan kopyalamanız gerekir. Bunlar genellikle aşağıdaki gibidir: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 Daha fazla bilgi için bkz. Marcgravell.blogspot.co.nz/2012/09/…
Myster

1
Ben sadece .NET 4.0 olan bir makinede Microsoft Dynamics CRM 2011 için bir eklenti olarak kullanılan bir .NET 4.5 DLL ile benzer bir sorun gördüm. Sadece reddetmek yerine, onu kaydetti ve daha sonra iş akışı özelleştirmesini tamamen kırdı (eklenti özel bir iş akışı etkinliği içeriyordu). İzleme, mscorlib'de ExtensionAttribute bulamadığını, beni buraya getirdiğini, .NET 4.0 için yeniden oluşturduğunu ve sorun çözüldüğünü gösterdi! Gelecekte Google-fu için belirtilmesi gerektiğini düşündüm.
Matthew Walton

Yanıtlar:


262

Mscorlib derlemesinden 'System.Runtime.CompilerServices.ExtensionAttribute' türü yüklenemedi

Evet, .NET 4.0 yerine .NET 4.0'da kod çalıştırdığınızda bu teknik olarak yanlış gidebilir. Öznitelik, .NET 4.5'te System.Core.dll dosyasından mscorlib.dll dosyasına taşındı. Bu,% 100 uyumlu olması gereken bir çerçeve sürümünde oldukça kötü bir kırılma değişikliği gibi görünse de, bir [TypeForwardedTo] özniteliğinin bu farkı gözlemlenemez hale getirmesi gerekiyor.

Murphy'nin sahip olacağı gibi, böyle iyi tasarlanmış her değişiklik, kimsenin düşünmediği en az bir başarısızlık moduna sahiptir. ILMerge, birden fazla montajı bir araya getirmek için kullanıldığında ve bu araç yanlış kullanıldığında bu yanlış görünüyor. Bu kırılmayı açıklayan iyi bir geri bildirim makalesi burada . Hatayı açıklayan bir blog yayınına bağlantı verir . Oldukça uzun bir makaledir, ancak doğru şekilde yorumlarsam, yanlış ILMerge komut satırı seçeneği bu soruna neden olur:

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

Hangisi yanlış. Programı oluşturan makineye 4.5 yüklediğinizde, bu dizindeki derlemeler 4.0'dan 4.5'e güncelleştirilir ve hedef 4.0 için artık uygun değildir. Bu meclisler artık orada olmamalı, ancak uyum nedenlerinden ötürü tutuldular. Uygun referans düzenekleri, başka yerlerde saklanan 4.0 referans düzenekleridir:

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

Bu nedenle, olası geçici çözümler derleme makinesinde 4.0'a geri dönmek, hedef makineye .NET 4.5'i yüklemek ve gerçek düzeltmeyi sağlamak, projeyi sağlanan kaynak koddan yeniden oluşturmak ve ILMerge komutunu düzeltmektir.


Bu hata modunun ILMerge için özel olmadığını, sadece çok yaygın bir durum olduğunu unutmayın. Bu 4.5 derlemelerin 4.0 hedefleyen bir projede başvuru derlemeleri olarak kullanıldığı diğer tüm senaryolar da aynı şekilde başarısız olabilir. Diğer sorulardan yola çıkarak, başka bir yaygın hata modu, geçerli bir VS lisansı kullanılmadan ayarlanan derleme sunucularındadır. Ve çoklu hedefleme paketlerinin ücretsiz bir indirme olduğunu göz ardı edin .

C: \ program files (x86) alt dizinindeki başvuru derlemelerini kullanmak zor bir gereksinimdir. .NET 4.0'dan başlayarak, yanlışlıkla 4.01, 4.02 ve 4.03 sürümlerinde eklenen bir sınıfa veya yönteme bağımlılıktan kaçınmak için zaten önemlidir. Ancak 4.5 piyasaya çıktığında kesinlikle çok önemli.


31
Ne harika bir cevap.
Sachin Kainth

6
Aynı belirtileri alıyorum, ama ILMerge kullanmıyorum, ipucu var mı? stacktrace here issue.umbraco.org/issue/U4-1708 , 3. veya 4. taraf bir DLL olabilir, ama nasıl bulabilirim?
Myster

3
Not: 64 bit Windows sürümleri için bir "C: \ Program Files \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0" klasörünüz olmayabilir, bu durumda "C: \ Programınız olup olmadığını kontrol edin. Dosyalar (x86) \ Reference Assemblies \ Microsoft \ Framework \ .NETFramework \ v4.0 "klasörü.
Maarten Docter

3
ILMerge'i yüklemedim ve bu problemim var, bu yüzden nasıl düzeltebilirim? Hedef sunucuya .net 4.5 yüklemem gerekir mi?
TamarG

4
Herkesin neden MS'in çözmesi gereken bir şey olduğunu ısrarla sürdürmek bana şaşırtıcı geliyor. Kırılmaz projelerinizi düzeltemezler veya sunucu oluşturamazlar. Sorun çözülmüş doğru referans montajlarını kullanın.
Hans Passant

9

Yükleyemedi türü dışında System.Reflection.AssemblyMetadataAttribute dışında bu sorun vardı. Web uygulaması, 4.0 hedef çerçevesi olarak .NET 4.5 yüklü (orada iyi çalışır) bir makine üzerine inşa edildi, ancak hata yalnızca 4.0 yüklü bir web sunucusunda çalıştırıldığında kendini sundu. Sonra 4.5 yüklü bir web sunucusunda denedim ve hiçbir hata yoktu. Yani, diğerlerinin söylediği gibi, bunun nedeni Microsoft'un 4.5 sürümünü piyasaya süren vidalı yoludur, temel olarak sürüm 4.0'a yükseltme (ve üzerine yazma). System.Reflection derleme 4.0 (AssemblyMetadataAttribute) 'de mevcut olmayan bir tür başvurur, bu nedenle yeni System.Reflection.dll yoksa başarısız olur.

.NET 4.5'i hedef web sunucusuna yükleyebilir veya uygulamayı 4.5 yüklü olmayan bir makinede oluşturabilirsiniz. İdeal bir çözünürlükten uzak.


8

Bir site (Kentico CMS) ile aynı sorunu yaşadım, 4.5'te geliştirmeye başladım, üretim sunucusunun sadece 4.0'ı desteklediğini, 4.0 hedef çerçevesine geri dönmeyi denedim. Bu ileti dizisindeki diğer gönderilerin derlenmesi (özellikle hedef çerçevenin .Net 4 ve .Net 4.5 olarak değiştirilmesine devam edilmektedir). Çözümümü araştırdım ve bir avuç NuGet paketinin hala targetFramework = "net45" ile kütüphaneler kullandığını buldum.

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>

Projelerin hedef çerçevesini 4.5 olarak değiştirdim, tüm NuGet kütüphanelerini kaldırdım, 4.0'a geri döndüm ve kütüphaneleri tekrar ekledim (4.5'e bağımlı olmayan bazı eski sürümleri kullanmak zorunda kaldım).

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

Bugün bu sinir bozucu soruna girdim. .NET derlemelerini paketlemek / gizlemek için SmartAssembly kullanıyoruz, ancak aniden son ürün test sistemlerimizde çalışmadı. .NET 4.5'e sahip olduğumu bile düşünmedim, ancak görünüşe göre bir ay önce bir şey yükledi.

4.5'i kaldırdım ve 4.0'ı yeniden kurdum ve şimdi her şey tekrar çalışıyor. Bu konuda bir öğleden sonra üflenirken çok etkilendim.


Sizin için önceden uyarı, Aksi takdirde, sorunu başka türlü çözerseniz, gizlenmiş sürümünüz tekrar bozulur, bu nedenle sorunu çözdüğünüzü asla bilemezsiniz. Yani, 4.5 üzerine inşa edebilir ve sadece 4.0 makinelere sorunsuzca dağıtabilirsiniz. Benim için gerekli olan tek şey Hans Passant'ın çok hedefli yamasıydı. ILDASM'daki manifest'e doğru şekilde mscorlib yerine System.Core'u hedeflediğini görebiliyordum. Ancak SmartAssembly (v5.5) aracılığıyla çalıştırılan sürümde DEĞİL.
Josh Sutterfield

4

Firebird Veritabanından veri okumaya çalışırken aynı sorunla karşılaştım. Saatlerce arama yaptıktan sonra, sorunun sorguda yaptığım bir hatadan kaynaklandığını öğrendim. Sabitlemek mükemmel çalışmasını sağladı. Çerçevenin sürümü ile ilgisi yoktu


dostum, teşekkürler, aynı problemle karşılaştım, nasıl düzelttin?
Benny

3

Biz bu sorunu koştu ve onu takip Geocoding.net Nuget bizim Google Maps görünümleri (2/4/2014 yayınlanan Geocoding.net sürüm 3.1.0) ile yardıma kullandığını paketin.

Paket dosyasını incelediğinizde veya Jet Beyin Dot Peek uygulamasını kullanarak görüntülediğinizde Geocoding dll .Net 4.0 gibi görünüyor; ancak, bir meslektaşım, ilmerge kullanılarak derlendiğini ve büyük olasılıkla yukarıda listelenen ilmerge problemleriyle ilişkili olduğunu söylüyor.

Bunu takip etmek uzun bir süreçti. Yukarıda belirtilen NuGet paketini ekleyen değişiklik kümesine daraltana kadar TFS'den farklı değişiklik kümeleri getirdik. Kaldırdıktan sonra .NET 4 sunucumuza dağıtabildik.


Bizim durumumuzda sorun Quartz.NET v2.3'ten kaynaklandı. 2.3.2 sürümüne yükseltmek sorunu çözdü.
Vertigo

2

Benim durumumda .NET 4.5'ten .NET 4.0'a düşürüldükten sonra proje yerel bir makinede iyi çalışıyordu, ancak yayınlandıktan sonra sunucuda başarısız oldu.

Hedefin hala .NET 4.5'e atıfta bulunan bazı eski montajları olduğu ortaya çıkıyor.

"Yayınlamadan önce mevcut tüm dosyaları sil" yayınlama seçeneği etkinleştirilerek düzeltildi


1

Benim durumumda, Blend SDK'nın TeamCity makinesinde kaçırdığı oldu. Bu, yanlış montaj yolu çözümlemesi nedeniyle hataya neden oldu.


1

Bu cevabı ekleyerek, Google'ın buraya gitmek için harcadığım saatleri biraz kurtarmasına yardımcı olmak için ekliyorum. .Net 4.0 projemde / targetplatform seçenek seti olmadan ILMerge kullandım, ana derlememden doğru olarak algılanacağını varsayarak. Daha sonra yalnızca Windows XP, yani WinXP'de kullanıcılardan şikayet aldım. Bu, XP'nin hiçbir zaman> .Net 4.0 yüklü olmayacağı gibi, çoğu yeni işletim sistemi ise mantıklı olacaktır. XP kullanıcılarınız sorun yaşıyorsa yukarıdaki düzeltmelere bakın.


1

Benim durumumda Microsoft.ReportViewer.WebForms kullanımı ile ilgili bir sorun vardı. Ben validate = true add verbweb.config satırından kaldırıldı ve çalışmaya başladı:

<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" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.