2009-08-27 2 views
17

사용자가 어셈블리를 열고 내부에서 정적 메서드를 선택할 수있는 간단한 클래스 브라우저 대화 상자에서 작업하고 있습니다. 그러나 어셈블리의 종속성이없는 경우가 있습니다.ReflectionOnlyLoad 동안 누락 된 종속성 무시합니다.

메서드 이름 만 필요하므로 전체 프로토 타입이 필요하지 않으므로 Assembly.ReflectionOnlyLoadFrom을 호출 할 때 발생하는 FileNotFoundException을 지나치는 방법이 있습니까? 나는 현재 AppDomain.ReflectionOnlyAssemblyResolve를 처리하고 있지만이 null을 반환하는 경우 다음 나는 다음과 같은 메시지가있는 FileLoadException 수 :

어셈블리에 대한 종속성을 확인할 수 없습니다 '...'가 사전로드되지 않았기 때문입니다. ReflectionOnly API를 사용할 때 종속 어셈블리는 ReflectionOnlyAssemblyResolve 이벤트를 통해 필요할 때 미리로드되거나로드되어야합니다.

.NET Reflector은 해결되지 않은 종속성을 건너 뛸 수 있기 때문에 어떻게 든 가능해야합니다. 그러나 아마도 Reflector가 어셈블리를 CLR에로드하고 표준 리플렉션을 사용하는 대신 수동으로 파싱한다고 생각하기 시작했습니다. 아마도 Mono 프로젝트의 Cecil과 같은 것을 사용했을 것입니다.

+0

내가 리플렉터는 세실를 사용 의심 - 그것을 선행 및 MS 내에서왔다. 나는 또한 그것이 CCI를 사용하는지 의심한다. Methinks Lutz는 그 모든 것들을 잠그고 다니는 하나님입니다. (심지어 그는 결국 피곤해졌습니다!) –

답변

3

어셈블리를 사용하는 것이 중요하지 않은 경우 Cecil을 사용해 보겠습니다. MS CCI도 있습니다. (나는 이들 중 하나가 실종 된 것 같은데 100 % 확신 할 수는 없지만이 공간에서 확실히 좋은 도구 일 뿐이다. 만약 그들이 실패한다면 나는 놀랄 것이다.)

정말로 금속에 도착해야한다면, 당신은이 Asmex tutorial and sample을 이길 수 없다.

+0

Asmex 튜토리얼은 매우 흥미로 웠습니다. 나는 그것을 시험해 봐야 할 것입니다. –

1

리플 렉터가 자체 어셈블리 파싱 /로드를 수행한다고 생각합니다. 리플 렉터 자체를 사용하여 소스를 잠시 살펴본 결과 많은 수의 어셈블리 관련 클래스가 파싱 된 것으로 보입니다. 거대한 나무 구조.

언제든지 Red Gate/Rutz Loeder에게 이메일을 보내고 확실한 확인을 요청할 수 있습니다. :)

3

이 누락 된 의존성을 무시합니다 :

 static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); 
      Assembly assembly = Assembly.ReflectionOnlyLoad("foo"); 
      foreach (Type t in assembly.GetTypes()) 
      { 
       Console.WriteLine(t.FullName); 
      } 
     } 

     static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) 
     { 
      return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name); 
     } 
+2

이것은 나를 위해 작동하지 않았다. 여전히 누락 된 종속성을 검색합니다. – Jonn