[.net] 어셈블리 ‘mscorlib에서’System.Runtime.CompilerServices.ExtensionAttribute ‘유형을로드 할 수 없습니다.
웹 사이트를 처음 시작할 때이 오류가 발생합니다
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'.
답변
어셈블리 mscorlib에서 ‘System.Runtime.CompilerServices.ExtensionAttribute’유형을로드 할 수 없습니다.
예. .NET 4.5 대신 .NET 4.0에서 코드를 실행할 때 기술적으로 잘못 될 수 있습니다. .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.5 어셈블리가 4.0을 대상으로하는 프로젝트에서 참조 어셈블리로 사용되는 다른 시나리오는 같은 방식으로 실패 할 수 있습니다. 다른 질문으로 판단 할 때 또 다른 일반적인 실패 모드는 유효한 VS 라이센스를 사용하지 않고 설정 한 빌드 서버입니다. 다중 타겟팅 팩이 무료로 다운로드 되는 것을 간과합니다 .
c : \ program files (x86) 하위 디렉토리에서 참조 어셈블리를 사용하는 것은 어려운 요구 사항입니다. .NET 4.0부터는 4.01, 4.02 및 4.03 릴리스에 추가 된 클래스 나 메소드에 우연히 의존하는 것을 피하기 위해 이미 중요합니다. 그러나 4.5가 출시되었으므로 절대적으로 필수적입니다.
답변
로드 할 수없는 유형을 제외 하고이 문제가 발생했습니다 .System.Reflection.AssemblyMetadataAttribute. 웹 응용 프로그램은 대상 프레임 워크로 4.0이 설치된 .NET 4.5가 설치된 컴퓨터에서 빌드되었지만 4.0 만 설치된 웹 서버에서 실행될 때 오류가 발생했습니다. 그런 다음 4.5가 설치된 웹 서버에서 시도했지만 오류가 없었습니다. 따라서 다른 사람들이 말했듯이 이것은 Microsoft가 4.5를 출시 한 나사 방식으로 인한 것입니다. 이는 기본적으로 버전 4.0으로의 업그레이드 (및 덮어 쓰기)입니다. System.Reflection 어셈블리는 4.0 (AssemblyMetadataAttribute)에없는 형식을 참조하므로 새 System.Reflection.dll이 없으면 실패합니다.
대상 웹 서버에 .NET 4.5를 설치하거나 4.5가 설치되지 않은 시스템에서 응용 프로그램을 빌드 할 수 있습니다. 이상적인 해상도와는 거리가 멀다.
답변
4.5에서 개발을 시작한 사이트 (Kentico CMS)와 동일한 문제가 발생하여 프로덕션 서버가 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>
답변
나는 오늘이 성가신 문제에 부딪쳤다. SmartAssembly를 사용하여 .NET 어셈블리를 포장 / 난독 처리하지만 최종 제품이 테스트 시스템에서 작동하지 않게되었습니다. .NET 4.5가 있다고 생각하지는 않았지만 약 한 달 전에 설치 한 것 같습니다.
4.5를 제거하고 4.0을 다시 설치하면 이제 모든 것이 다시 작동합니다. 이것에 오후를 날려 버린 것에 너무 감동하지 않았습니다.
답변
Firebird 데이터베이스에서 데이터를 읽으려고 할 때도 같은 문제가 발생했습니다. 여러 시간 동안 검색 한 결과 쿼리에서 발생한 오류로 인해 문제가 발생했음을 알았습니다. 그것을 고치면 완벽하게 작동했습니다. Framework 버전과는 아무런 관련이 없습니다.
답변
이 문제가 발생 하여 Google지도보기에 도움이 되는 Geocoding.net NuGet 패키지 (2014 년 4 월 2 일에 게시 된 Geocoding.net 버전 3.1.0) 까지 추적했습니다 .
Jet Brains의 Dot Peek 응용 프로그램을 사용하여 패키지 파일을 보거나 볼 때 지오 코딩 dll은 .Net 4.0으로 나타납니다. 그러나 내 동료는 ilmerge를 사용하여 컴파일되었으므로 위에 나열된 ilmerge 문제와 관련이 있다고 말합니다.
그것을 추적하는 것은 긴 과정이었습니다. 위에서 언급 한 NuGet 패키지를 추가 한 변경 세트로 범위를 좁힐 때까지 TFS에서 다른 변경 세트를 가져 왔습니다. 제거한 후 .NET 4 서버에 배포 할 수있었습니다.
답변
제 경우에는 .NET 4.5에서 .NET 4.0으로 다운 그레이드 한 후 로컬 컴퓨터에서 프로젝트가 제대로 작동했지만 게시 후 서버에서 실패했습니다.
대상에 여전히 .NET 4.5를 참조하는 오래된 어셈블리가 있음이 밝혀졌습니다.
게시 옵션 “게시 전에 모든 기존 파일 삭제”를 활성화하여 수정했습니다.