오류 메시지 '요청한 유형 중 하나 이상을로드 할 수 없습니다. 자세한 정보는 LoaderExceptions 특성을 검색하십시오. '


347

Entity Framework , SQL Server 2000, Visual Studio 2008 및 Enterprise Library를 사용하여 응용 프로그램을 개발했습니다 .

로컬에서는 완벽하게 작동하지만 프로젝트를 테스트 환경에 배포하면 다음 오류가 발생합니다.

요청 된 유형 중 하나 이상을로드 할 수 없습니다. 자세한 정보는 LoaderExceptions 특성을 검색하십시오.

스택 추적 : System.Reflection.Module._GetTypesInternal (StackCrawlMark & ​​stackMark)

System.Reflection.Assembly.GetTypes ()에서

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadTypesFromAssembly (LoadingContext 컨텍스트)에서

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.InternalLoadAssemblyFromCache (LoadingContext 컨텍스트)에서

System.Data.Metadata.Edm.ObjectItemCollection.AssemblyCacheEntry.LoadAssemblyFromCache에서 (어셈블리 어셈블리, 부울 loadReferencedAssemblies, 사전 2 knownAssemblies, Dictionary2 및 typesInLoading, List`1 & 오류)

System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache (ObjectItemCollection objectItemCollection, 어셈블리 어셈블리, 부울 loadReferencedAssemblies)에서

System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyForType (Type type)에서

System.Data.Metadata.Edm.MetadataWorkspace.LoadAssemblyForType (유형 유형, 어셈블리 호출 어셈블리)

System.Data.Objects.ObjectContext.CreateQuery [T] (String queryString, ObjectParameter [] 매개 변수)에서

Entity Framework에 문제가있는 것 같습니다. 어떻게 고칠 수 있습니까?


이 문제를 해결하기위한 마법의 탄환은 없지만이 답변을 통해 매우 정확한 이유를 알 수 있습니다. stackoverflow.com/a/8824250/185022
AZ_

답변:


105

프로젝트 참조의 로컬 복사 속성을 true로 설정하여이 문제를 해결했습니다.


33
ReflectionTypeLoadException 유형의 예외를 볼 때까지 내부 예외를 계속 드릴 다운하면 DLL 정보 누락 또는 불일치에 대한 정보를 제공하는 "LoaderExceptions"속성이 있습니다. 그런 다음 적절한 조치를 수행 할 수 있습니다.
Sai

19
글쎄, Visual Studio에서 디버깅 할 때 좋습니다. 그러나 웹 응용 프로그램 인 경우 프로덕션 서버에서만이 오류가 발생합니까? 로컬 복사 속성을 true로 설정 한 후에도 가능합니다.
Yousi

2
로컬 Visual Studio가 아닌 프로덕션 서버의 문제에 대한 솔루션입니다. Copy Local은 빌드 타임에 참조 된 DLL을 복사하고 DLL은 먼저 실행중인 응용 프로그램과 같은 폴더에서 검색됩니다. 빌드시 복사 된 DLL을 프로덕션 서버의 올바른 폴더로 복사하지 않으면 문제가 지속될 수 있습니다.
Mentoliptus

내 경우에는 내가 또한 Microsoft.AspNetCore.Mvc.ViewFeatures에 nuget 참조를 추가했다
MFedatto

530

이 오류에는 진정한 마법의 총알 답변이 없습니다. 열쇠는 문제를 이해하기 위해 모든 정보를 얻는 것입니다. 동적으로로드 된 어셈블리에 참조 된 어셈블리가 없을 수 있습니다. 해당 어셈블리는 응용 프로그램의 bin 디렉토리에 있어야합니다.

이 코드를 사용하여 누락 된 항목을 판별하십시오.

using System.IO;
using System.Reflection;
using System.Text;

try
{
    //The code that causes the error goes here.
}
catch (ReflectionTypeLoadException ex)
{
    StringBuilder sb = new StringBuilder();
    foreach (Exception exSub in ex.LoaderExceptions)
    {
        sb.AppendLine(exSub.Message);
        FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
        if (exFileNotFound != null)
        {                
            if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
            {
                sb.AppendLine("Fusion Log:");
                sb.AppendLine(exFileNotFound.FusionLog);
            }
        }
        sb.AppendLine();
    }
    string errorMessage = sb.ToString();
    //Display or log the error based on your application.
}

4
감사! 이는 MEF를 사용하는 시스템에서 로깅 설정의 일부 여야합니다.
Bogi lenvig

4
나는 모든 시간을 upvote에 수 있다면 나는 더 5 upvotes에 대한 것 다시이 답변에 와서 ... 그리고 계산은
sǝɯɐs

2
당신은 내 생명을 구했습니다. 정말 고맙습니다. 나는 결코 문제를 발견하지 못했을 것이다. 더 이상 사용하지 않는 오래된 dll이었습니다. 프로젝트 구조에 깊이 숨어이 문제를 일으켰습니다.
richard

4
빠진 것을 빨리 찾으려면 사용 throw new Exception(errorMessage);하고 희망은 누군가를 도울 것입니다.
shaijut

2
추가 코드가 없으면 Visual Studio에서 예외 설정으로 이동하여 TypeLoadException 검색 상자에 넣은 다음 커플 히트 확인란을 활성화합니다. 또한 디버그 섹션 "Just my code"의 옵션에서 비활성화해야 할 수도 있으므로 작성하지 않은 종속성에서 발생할 때 예외를 포착 할 수 있습니다.
David Burg

56

나를 위해 일한 해결책은 bin / 및 obj / 폴더를 삭제하고 솔루션을 다시 작성하는 것이 었습니다.


테스트 프로젝트 자체를 다시 빌드해야했습니다. 여기서 테스트 프로젝트 또는 테스트중인 프로젝트를 참조하는지 확실하지 않습니다.
Jason Axelson

4
다른 의견 : "솔루션 탐색기"에서 솔루션 노드를 마우스 오른쪽 단추로 클릭하고 "솔루션 정리"를 클릭 한 다음 "솔루션 재구성"을 클릭하십시오. (소스 프로젝트에 새로운 추가-솔루션의 다른 프로젝트-파트가있는 경우 변경 사항이 프로젝트 dll 폴더에 반영
되어이

이 문제가 발생했습니다. 제안한대로 Visual Studio, Deleted bin 폴더를 닫고 프로젝트를 다시 열고 다시 빌드하면 성공했습니다.
Sagar S.

이것은 중요한 변경 사항이있는 지점 사이를 전환 할 때 발생했습니다. 쓰레기통을 삭제했습니다. 청소 및 재건이 작동하지 않았습니다.
JGTaylor

33

두 가지 가능한 솔루션 :

  1. 릴리스 모드에서 컴파일하고 있지만 디버그 디렉토리에서 이전 컴파일 된 버전을 배포합니다 (또는 그 반대).
  2. 테스트 환경에 올바른 버전의 .NET Framework가 설치되어 있지 않습니다.

나는 같은 문제가 있었는데, 포인트 1은 나에게 정확했다. 고마워 윌리엄.
Matthew

나는 같은 문제가 있습니다 ... 나는 두 가지 제안을 모두 겪었지만 여전히 같은 오류를 수신합니다 :(
David Kiff

참조 된 DLL이 "차단 된"경우에도 발생할 수 있습니다. 마우스 오른쪽 버튼으로 클릭하고 "차단 해제"를 선택하십시오
Ben

3
DLL 프로젝트 중 하나가 "Any CPU"대신 "x64"를 빌드하도록 설정된 경우에도이 문제가 발생합니다.
DCastenholz

제거하고 다시 솔루션에 프로젝트를 추가 한 후 예를 들어, 빌드 선택하지 않은 프로젝트 - 솔루션 구성이 잘못된 경우 # 1가 발생할 수 있습니다
surfen

13

이전에 언급했듯이 일반적으로 어셈블리가없는 경우입니다.

정확히 어떤 어셈블리가 누락되었는지 확인하려면 디버거를 연결하고 중단 점을 설정 한 다음 예외 개체가 표시되면 'LoaderExceptions'속성으로 드릴 다운하십시오. 누락 된 어셈블리가 있어야합니다.

그것이 도움이되기를 바랍니다!


1
또한 ReflectionTypeLoadException 유형의 예외를 볼 때까지 내부 예외를 계속 드릴 다운 할 수 있으며 DLL 정보 누락 또는 불일치에 대한 정보를 제공하는 "LoaderExceptions"속성이 있습니다.
Sai

2
여러 프로젝트가있는 솔루션에서 LoaderExceptions에서 어떤 프로젝트가 문제를 일으키는 지 어떻게 알 수 있습니까? System.Web.Mvc를 찾을 수 없지만이 솔루션의 20 개 프로젝트 중 어느 것이 문제가 될 수 있는지 잘 모르겠습니다.
mrcoulson

9

해결책은 LoaderException을 확인하는 것이 었습니다. 필자의 경우 일부 DLL 파일이 누락되었습니다.

여기에 이미지 설명을 입력하십시오


6

IIS에 배포 한 경우 IIS 에서 32 비트 응용 프로그램을 허용해야합니다 . 현재 응용 프로그램 풀의 설정에서이를 정의 할 수 있습니다.


6

ASP.NET 4 + SQL Server 2008 R2 + Entity Framework 4 응용 프로그램 에서이 오류가 발생했습니다 .

개발 시스템 (Windows Vista 64 비트)에서 제대로 작동합니다. 그런 다음 서버 ( Windows Server 2008 R2 SP1)에 배포 하면 세션 시간이 초과 될 때까지 작동합니다. 따라서 우리는 응용 프로그램을 배포하고 모든 것이 잘 보인 다음 20 분 이상의 세션 시간 초과 동안 그대로두면이 오류가 발생합니다.

이를 해결하기 위해 Ken Cox의 블로그에서이 코드를 사용 하여 LoaderExceptions 속성을 검색했습니다.

내 상황에서 누락 된 DLL은 Microsoft.ReportViewer.ProcessingObjectModel(버전 10)이었습니다. 이 DLL 은 응용 프로그램이 실행되는 시스템의 GAC 에 설치해야합니다 . Microsoft 다운로드 사이트의 Microsoft Report Viewer 2010 재배포 가능 패키지에서 찾을 수 있습니다.


5

처음에는 Fusion 로그 뷰어를 사용해 보았지만 도움이되지 않아 SOS 확장과 함께 WinDbg를 사용했습니다.

! dumpheap -stat -type 예외 / D

그런 다음 FileNotFoundExceptions를 조사했습니다. 예외의 메시지에로드되지 않은 DLL의 이름이 포함되어 있습니다.

NB, / D는 하이퍼 링크 된 결과를 제공하므로 FileNotFoundException 요약에서 링크를 클릭하십시오. 예외 목록이 나타납니다. 그런 다음 예외 중 하나에 대한 링크를 클릭하십시오. 그것은 예외를 버릴 것입니다. 그런 다음 예외 개체에서 메시지 링크를 클릭하면 텍스트가 표시됩니다.



4

이 문제의 내 인스턴스는 누락 된 참조가되었습니다. app.config에서 어셈블리를 참조했지만 프로젝트에 참조가 없습니다.


3

Entity Framework를 사용 하는 경우 다음 참조를 로컬로 복사하십시오.

  • System.Data.Entity
  • System.Web.Entity

이러한 참조에 대해 "로컬 복사"특성을 "참"으로 변경하고 공개하십시오.


3

왜 아무것도 작동하지 않는지 알 수있는 또 다른 솔루션 (Microsoft Connect에서) :

  1. 이 코드를 프로젝트에 추가하십시오.

    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        asm.GetTypes();
    }
  2. 세대 직렬화 어셈블리를 끕니다.

  3. 빌드하고 실행하십시오.

2

Visual Studio 2010에서 개발 된 .NET 4.0, ASP.NET MVC 2.0, Entity Framework 4.0 웹 응용 프로그램을 사용했습니다. 동일한 Windows Server 2008 R2 서버에서는 작동했지만 다른 Windows Server 2008 R2 서버에서는 작동하지 않았다는 동일한 문제가있었습니다. .NET 및 ASP.NET MVC 버전이 동일 하더라도이 오류와 동일한 오류가 발생합니다.

miko의 제안을 따랐으므로 실패한 서버에 Windows SDK v7.1 (x64)을 설치하여! dumpheap을 실행할 수있었습니다.

Windows SDK v7.1 (x64)을 설치하면 문제가 해결 된 것으로 나타났습니다. 누락 된 종속성이 SDK에 포함되어 있어야합니다. Windows 7 및 .NET Framework 4 용 Microsoft Windows SDK 에서 다운로드 할 수 있습니다 .


2

이 오류 메시지의 첫 번째 결과이므로 내 특정 문제 / 해결 방법을 추가하십시오. 필자의 경우 IIS의 첫 번째 응용 프로그램 폴더 내에 두 번째 응용 프로그램을 배포했을 때 오류가 발생했습니다 . 둘 다 동일한 이름의 연결 문자열을 정의하여 하위 응용 프로그램이 충돌하여 결과적으로 나에게 명백하지 않은 오류 메시지를 생성했습니다. 다음을 추가하여 해결되었습니다.

<clear/>

하위 웹 응용 프로그램의 연결 문자열 블록에서 계층 구조에서 더 높은 web.config 파일의 연결 문자열을 상속하지 못하도록 다음과 같이 보입니다.

<connectionStrings>
  <clear/>
  <add name="DbContext" connectionString="MySERVER" providerName="System.Data.SqlClient" />
</connectionStrings>

무슨 일이 일어나고 있는지 결정한 후에 도움이 된 참조 스택 오버플로 질문 은 자식 응용 프로그램이 부모 web.config에서 상속됩니까? .


2

이것은 나를 위해 일했습니다. web.config에 추가하십시오

<system.web>
  <trust level="Full" />

이 오류가 발생했습니다 :It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

2

bin폴더 에서 중복 어셈블리 파일을 삭제 한 후 문제가 해결되었습니다 .


2

다른 답변이 도움이되지 않는 경우 :

이 문제가 발생했을 때 Windows 서비스가 x64 플랫폼 용으로 만들어졌으며 32 비트 버전의 InstallUtil.exe를 실수로 실행하고있었습니다. 따라서 구축 한 플랫폼에 맞는 InstallUtil 버전을 사용하고 있는지 확인하십시오.


나는 비슷한 문제가 있었다. 내 서비스에서 사용하는 일부 DLL은 32 비트 프로세서 용으로 컴파일되어 모든 프로세서로 변경되어 이제 작동합니다.
Blake Thingstad

1

다른 제안은 모두 좋습니다. 필자의 경우 문제는 개발자 상자가 Silverlight를 포함한 다양한 API의 x86 위치를 사용하는 64 비트 시스템이라는 것입니다 .

웹 응용 프로그램이 배포 된 32 비트 서버와 일치하도록 대상 플랫폼을 변경하여 요청 된 유형 중 하나 이상을로드 할 수없는 것과 관련된 대부분의 오류를 제거했습니다.


1

Refrences의 특정 버전 속성을 false로 변경하면 도움이되었습니다.


1

Visual Studio 패키지 (VSPackage)를 컴파일 할 때 동일한 오류 메시지가보고되었습니다. 전체 솔루션이 컴파일되고 CreatePkgDef에 의해 패키지가 작성 될 때 오류가 발생합니다. LoaderExceptions 를 던지는 응용 프로그램이 아니라 Microsoft 자체 도구이므로 LoaderExceptions잡을 수 없다는 것이 분명합니다 . (저는 CreatePkgDef의 혼란에 책임이 있습니다.)

내 경우의 근본 원인 은 내 솔루션이 이미 GAC 에 등록 된 MyDll.dll을 만들고 다른 것이므로 CreatePgkDef가 어떤 것을 사용할지 혼동하여 오류가 발생하기 시작하기로 결정했습니다. 정말 도움이되지 않습니다. GAC의 MyDll.dll은 동일한 제품 (확실히 이전 버전이며 / slightly / 다른 내용)의 설치 프로그램에 의해 등록되었습니다.

고치는 방법

  1. 권장 방법 : 올바른 버전의 MyDll.dll을 사용하십시오
    1. 프로젝트를 컴파일 할 때 GAC에있는 이전 버전에서 사용한 것과 다른 버전 번호를 사용해야합니다. 다음 속성이 올바른지 확인하십시오.
      • [assembly : AssemblyVersion ( "1.0.0.1")] // 기존 DLL 파일의 버전이 1.0.0.0이라고 가정
      • [assembly : AssemblyFileVersion ( "1.0.0.1")] // 이전 DLL 파일의 버전이 1.0.0.0이라고 가정
    2. 필요한 경우 다른 프로젝트에서 참조 할 때 정규화 된 어셈블리 이름 (예 : "MyDll.dll, 버전 = 1.0.0.1, Culture = neutral, PublicKeyToken = 1234567890abcdef")을 지정하십시오.
  2. 위의 실패한 경우 : GAC에서 기존 MyDll.dll을 제거 할 수 있습니다
    1. GAC에서 어셈블리를 제거하는 방법
    2. MyDll.dll이 포함 된 응용 프로그램을 제거하십시오.

AssemblyVersion을 변경하면 충분합니다. :)

도움이 되었기를 바랍니다.


1

패키지 관리자 콘솔을 사용하여 Entity Framework 마이그레이션을 추가하려고 할 때 동일한 문제가 발생했지만 로컬에서 발생했습니다.

내가 해결 한 방법은 Main ()에 다음 코드가있는 콘솔 응용 프로그램을 만드는 것입니다.

 var dbConfig = new Configuration();
 var dbMigrator = new DbMigrator(dbConfig);
 dbMigrator.Update();

구성 클래스가 실패한 프로젝트의 마이그레이션 구성인지 확인하십시오. DbMigrator를 사용하려면 System.Data.Entity.Migrations가 필요합니다.

응용 프로그램에서 중단 점을 설정하고 실행하십시오. 디버그 세션을 중단하지 않도록 예외 유형을 설정하지 않은 경우 Visual Studio에서 예외를 포착해야하며 원하는 정보를 찾을 수 있어야합니다.

필자의 경우 누락 된 참조는 EFProviderWrapperToolkit입니다.


1

프로젝트 중 하나에 NuGet 패키지를 설치 하고 다른 프로젝트를 업데이트하는 것을 잊었을 때이 문제가 발생 했습니다.

두 프로젝트를 동일한 참조 어셈블리로 만들어서이 문제를 해결했습니다.


링크 주셔서 감사합니다! NuGet이 무엇인지 전혀 몰랐습니다.
jebar8

1

그것은 나에게도 일어났다. 다음과 같이 문제를 해결했습니다. 솔루션을 마우스 오른쪽 단추로 클릭하고 솔루션에 대한 NuGet 패키지 관리 ... 패키지를 통합하고 패키지를 동일한 버전으로 업그레이드했습니다.


0

구성 파일에서 32 비트 IIS 모드를 true로, 디버그 모드를 true로 설정하고, temp디렉토리를 삭제하고 IIS를 재설정하면 문제가 일시적으로 해결되며 일정 시간 후에 다시 나타납니다.


0

각 프로젝트가 구성 관리자 에서 올바르게 설정되어 있는지 확인하십시오 .

이 문제에 대한 William Edmondson의 이유 와 유사하게 Configuration Manager 설정을 "Debug" "Any CPU"에서 "Debug" ".NET"으로 전환했습니다. 문제는 ".NET"버전이 모든 프로젝트를 빌드하도록 구성되지 않았기 때문에 일부 DLL이 오래되었습니다 (다른 버전은 최신 버전 임). 이로 인해 응용 프로그램을 시작하는 데 많은 문제가 발생했습니다.

임시 해결책은 Kenny Eliasson의 제안에 따라 \ bin 및 \ obj 디렉토리를 정리하는 것이 었습니다. 그러나 컴파일되지 않은 프로젝트를 더 많이 변경하면 모든 것이 다시 실패합니다.


0

Visual Studio 2015로 새 Microsoft Word 추가 기능을 만들 때도이 문제가 발생합니다.이 문제는 MS Office, 2013 및 2016의 두 가지 버전이 있다는 것입니다. MS Office 2013을 제거한 다음 작동합니다.


0

SharePoint를위한 몇 가지 프로젝트를 구축하고 물론 배포했습니다. 한 번 일어났다.

C : \ Windows \ assembly \ temp \ xxx (FarManager 사용)에서 이전 어셈블리를 발견하고 재부팅 후 제거하고 모든 프로젝트를 빌드했습니다.

프로젝트와 연결된 프로젝트 어셈블리에서 모든 어셈블리는 "로컬 복사"로 표시되어 있지만 GAC에서는 그렇지 않기 때문에 MSBuild에 대한 질문이 있습니다.


0

프로젝트의 모든 참조 된 DLL 파일에 "Copy Local = True"를 표시하고 테스트 서버에서 재구성 및 배포하여이 문제를 해결할 수 있습니다.


0

오토 맵에 문제가있었습니다. 에서 bin폴더, 파일 automap.4net.dll가 있었다, 그러나 어떤 이유로 automap.xml 및 automap.dll은하지 않았다. 그것들을 bin디렉토리에 복사 하면 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.