2010-03-04 7 views
2

System.Reflection으로 dll 내의 모든 단일 참조를 결정하려고합니다. 그러나 GetReferencedAssemblies은 "참조"(솔루션 탐색기에 표시됨)에 나열된 것만 나열합니다.System.Reflection을 사용하여 모든 참조를 결정하십시오.

코드 내에서 imports 문과 같은 참조를 결정하고 싶습니다. if/then 진술, try/catch, 절대로 등의 모든 것도입니다.

System.Reflection을 사용하면 가능합니까? 그렇다면 어떻게?

필자는 p/invoke없이이 작업을 수행하는 것을 선호합니다.

도움 주셔서 감사합니다.

이것은 VB에서입니다.

+0

무엇을 의미합니까? 'GetReferencedAssemblies'는 DLL이 사용하는 모든 어셈블리를 반환해야합니다. – SLaks

+0

코드에서 System.IO의 내용을 사용하는 경우 참조로 추가하지 않고 System.IO에서 FROM을 사용했음을 알 수 있기를 원합니다. System.IO는 코드 자체가 그것을 사용하더라도 참조로 추가되지 않으면'GetReferencedAssemblies'와 함께 나타나지 않습니다. – Cyclone

+0

참조 된 어셈블리의 트리를 통해 되풀이하고 원래 어셈블리에서 도달 할 수있는 어셈블리로 필터링하고 싶습니까? 뭔가가'Type.GetType()'을 호출하면 어떻게 될까요? – SLaks

답변

2

편집

(당신은 큰 작업의 응용 프로그램을 분석하는 도구를 작성하는 경우)

, 당신은 당신의 코드를 직접 사용하는 어셈블리를 원한다.

입니다.


귀하의 의견에 설명 된대로 중단 문제를 해결하려고합니다.

원래 어셈블리를 실제로 실행하지 않고 프로파일 링 API를 사용하여 어떤 유형의 어셈블리가 사용되는지 확인하지 않고는이 작업을 수행 할 수 없습니다.


당신은 반복적으로 각 기준에 GetReferencedAssemblies 전화 및 간접 종속의 전체 트리를 얻을 수 있습니다.

편집 : 예를 들어

그러나

static IEnumerable<Assembly> (Assembly a) { 
    return a.GetReferencedAssemblies() 
      .Concat(a.GetReferencedAssemblies() 
        .SelectMany<Assembly, Assembly>(GetAllReferences) 
      ); 

, 참조 중 하나가 원래 조립에 의해 도달 할 수없는 코드 경로에 어셈블리를 사용하는 경우 당신은 잘못된 반응을 얻을 수 있습니다 . 인터페이스와 다형성으로 인해 오탐 (false positive)을 제거하는 것은 매우 어려울 수 있습니다. 도달 가능한 코드 경로의 코드 중 하나라도 리플렉션을 사용하면 정의에 따라 불가능합니다.

+0

번거 로움 같이 소리가 난다. 당신은 그들이'GetAllAssemblies' 메쏘드 같은 것을 포함 시켰을 것이라고 생각할 것입니다. 재귀 아이디어를 사용하면 문제는 참조 된 어셈블리에 대한 참조 만 가져옵니다. 나는 단지 dll 자체 내에서 직접 참조되는 어셈블리를 다루기를 원한다. 이 모든 개념은 오히려 혼란 스럽습니다 ... – Cyclone

+0

무엇을 의미합니까? – SLaks

+0

제 말은 참조 된 어셈블리 내에서 참조되는 어셈블리는 신경 쓰지 않습니다. 난 단지 DLL 자체에서 어셈블리를 파생하고자합니다. – Cyclone

3

NDepend과 같은 소리가납니다. 당신 후에 의견에 의해 설명 된 바와 같이

+0

그런 무료 제품이 있습니까? – Cyclone

+0

이유는 int가 무료가 아닙니다! 나는 무엇이든을 인식하고 있지 않다 ... –

1

어셈블리 이름과 이름 공간 이름을 혼동하고 있습니다. System.IO는 네임 스페이스입니다. 실제로는 하나 이상의 어셈블리에 나타납니다. System.IO.File 클래스는 system.core.dll의 system.dll, System.IO.Pipes.PipeStream의 mscorlib.dll, System.IO.FileSystemWatcher에 있습니다.

GetReferencedAssemblies가 정확합니다.

이 코드를 작성하기 전에 Red Gate's Reflector 번으로 재생하십시오.

+0

+1 그가 무슨 말을하는지 알아내는 데 +1. – SLaks

관련 문제