2010-12-14 6 views
1

특정 인터페이스를 구현하는 모든 클래스에 대해로드 된 어셈블리를 모두 검색하는 프로젝트가 있습니다. 그런 다음 해당 클래스의 인스턴스를 만들고 인터페이스의 메서드를 호출합니다. 이 코드는 테스트 환경의 간단한 프로젝트에서 훌륭하게 실행되었습니다.현재 도메인의 .NET 어셈블리를 찾을 수 없습니다.

public static List<Type> GetLoadedTypes(Type targetType) 
    { 
     var types = AppDomain.CurrentDomain.GetAssemblies().ToList() 
      .SelectMany(a => a.GetTypes()) 
      .Where(t => targetType.IsAssignableFrom(t)).ToList(); 
     return types; 
    } 

I가이 코드를 삽입하고 도메인의 어셈블리 중 하나를 찾을 수 없기 때문에 LINQ 쿼리가 실패 할 다른 프로젝트 : 그것의 핵심은 다음과 같은 기능입니다.

System.IO.FileNotFoundException은 ', Microsoft.Practices.ObjectBuilder 버전 = 1.0.51206.0, 문화 = 중립, PublicKeyToken은 = b03f5f7f11d50a3a'파일 또는 어셈블리를로드 할 수 없습니다 또는 해당 종속성 중 하나. 시스템이 지정된 파일을 찾을 수 없습니다.

내 프로젝트에서이 어셈블리를 직접 참조하지 않습니다. 어떤 어셈블리가 그것을 참조하는지 어떻게 알 수 있습니까? 어셈블리를 찾을 수없는 경우 어떻게 어셈블리를 도메인에 추가 할 수 있습니까?

편집 : 나는이 프로젝트에 엔터프라이즈 라이브러리를 사용하고 있지만 이미 Microsoft.Practices.ObjectBuilder2.dll를 참조하고있다. 외관상으로는 두 어셈블리간에 차이가 있습니다. 그 맞습니까?

감사합니다. Jeff

+0

... 나는 .NET 3.5을 사용하고 – Aliostad

답변

2

당신은 사용하여 dotnet2.0sdk에 속한다 (Fuslogvw.exe) "총회는 로그 뷰어를 바인딩" (어쩌면 최신판에서도). 로깅이 활성화 된 경우 어셈블리가로드되고로드가 발생한 어셈블리를 표시 할 수 있습니다.

는 세부 사항 http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.80).aspx

+0

나는 결과를 내기 위해 이것을 얻을 수 없었다. 그것이 .net 3.5에서 작동합니까? 설정 섹션에서 로깅을 사용할 수 없습니다 (사용할 수없는 모든 필드). 사용하도록 설정하는 방법을 알고 있습니까? 몇 가지 다른 용어를 알아내어 인터넷 검색을하면 아무것도 나올 수 없습니다. – Jeff

+1

맞춤 로그 위치를 설정해야합니다. 그렇지 않으면 작동하지 않는 것 같습니다. http://automaticchainsaw.blogspot.com/2007/11/debugging-with-fusion-logger.html – Pedro

+0

이 작업이 성공했습니다! fuslogvw.exe는 어떤 어셈블리가 누락 된 어셈블리를로드하고 있는지 보여 주었고, 어쨌든 그 프로젝트에서 불쾌한 assmbly에 대한 참조가 필요하지 않게되었습니다. 참조를 삭제하고 모든 것이 작동 중입니다! 감사! ! 1 에 HKLM \ 소프트웨어 \ 마이크로 소프트 \ 퓨전 EnableLog (DWORD)로 설정 : – Jeff

1

이것은 Microsoft의 Unity에서 사용됩니다. 빌드 할 때 (스크립트를 사용하여 ...) DLL을 저장소로 복사하거나 참조를 추가하십시오.


업데이트

알아 내기 위해, 당신은 응용 프로그램 도메인의 AssemblyResolve 이벤트를 추가 할 수 있으며 인수에 RequestingAssembly 속성을 확인합니다.


업데이트 2

OK, 여기에 내가 접근했을 어떻게 : 당신의 실행을 모니터링하는

  • 사용 sysinternal의 procmon. 거기에 FILE NOT FOUND 이벤트가 많은 파일 (objectbuilder2)의 이름이 나타납니다. 그것을 찾고있는 곳을보고, 거기 있어야합니다. 나는 DLL이 다른 위치에로드되는 생각
  • 의 DLL이 특정 버전이
  • 존재해야합니다
+1

을 내 업데이 트를 참조하십시오 참조하십시오 그래서 불행히도 RequestingAssembly 속성은 나에게 사용할 수 없습니다. 또한 원래 질문에 대한 내 업데이트를 참조하십시오. Unity를 사용하지 않고 Enterprise Library를 사용하고 있습니다. 나는 ObjectBuilder2를 가지고있다.dll 어셈블리는 참조되지만이 어셈블리를 해결할 때 어떤 차이점도 없습니다. – Jeff

+0

@Jeff, 버전 1.1부터 사용할 수 있으므로 확실히 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v=VS.71).aspx – Aliostad

+1

. 이벤트를 오버로드 할 수 있었지만 이벤트 args에는 RequestingAssmbly 속성이 없습니다. 원래 링크 된 MSDN 페이지에서 : ".NET Framework 버전 4부터 ResolveEventArgs .. ::. RequestingAssembly 속성은 어셈블리로드를 요청한 어셈블리를 확인할 수없는 어셈블리를 반환합니다." 디버거에서 객체를 검사하면 3.5에 RequestingAssembly가 없음을 확인합니다. 3.5에서 ResolveEventArgs에는 Name 속성 만 있습니다. – Jeff

관련 문제