2017-11-28 2 views
1

추상, 기본 클래스를 노출하는 .Net4 어셈블리가 있습니다. 같은 어셈블리에서 폴더의 모든 파일을 반영하여 기본 클래스를 상속하는 클래스 목록을 작성하는 코드가 있습니다. 여기에 두드러진 루틴ReflectionTypeLoadException 및 COM-Interop

private JsonTextWriter GetAvailableServices(JsonTextWriter writer, string path) 
{ 
    try 
    {    
     writer.WriteStartArray(); 
     writer = new DirectoryInfo(path).GetFiles(FileFilter) 
             .Where(f => IsAssembly(f.FullName)) 
             .Select(f => Assembly.LoadFile(Path.Combine(path, f.Name))) 
             .SelectMany(a => GetLoadableTypes(a)) 
             .Where(p => typeof(ServiceProxy).IsAssignableFrom(p) && !p.IsAbstract) 
             .Select(a0 => new { Instance = Activator.CreateInstance(a0), ClassName = a0.ToString() }) 
             .Aggregate(writer, (s, v) => 
             { 
              s.WriteStartObject(); 
              s.WritePropertyName(ClassnameLabel); 
              s.WriteValue(v.ClassName); 
              s.WritePropertyName(DescriptionLabel); 
              s.WriteValue(((ServiceProxy)v.Instance).Description); 
              s.WriteEndObject(); 
              return s; 
             });     
    } 
    catch { Exception ex; } 
    finally 
    { 
     writer.WriteEndArray();     
    } 

    return writer; 
} 

private IEnumerable<Type> GetLoadableTypes(Assembly assembly) 
{    
    try 
    { 
     return assembly.GetTypes(); 
    } 
    catch (ReflectionTypeLoadException e) 
    { 
     return e.Types.Where(t => t != null); 
    } 
} 

내가 특정 폴더를 대상으로이 코드를 실행하는 단위 테스트를, 그리고 모두가 JSON과 같은 기본 클래스를 상속 클래스의 목록을 반환 잘 작동합니다.

위 코드는 COM (VB6) 구성 요소에서 호출 할 어셈블리에 있습니다. 이제 내가 단위 테스트 대상과 동일한 폴더를 대상으로 COM에서이 동일한 코드를 호출하면 반사 오류가 발생하고 위 코드가 포함 된 어셈블리를로드 할 수 없다는 로더 정보가보고됩니다. 이 기본 클래스를 상속하는 클래스가 들어 어셈블리를 통해 반영 오전 GetTypes() 호출 GetLoadableTypes 루틴을 경우에만 발생합니다.

COM이 관련되었을 때만 발생하는 재진입 문제와 거의 같은 것처럼 들립니다. 나는 추상적 인 기본 클래스를 다른 어셈블리에 넣을 수는 있었지만, 계속 진행되고있는 다른 것이 있는지 궁금해했다.

어떤 설명이나 포인터가 분명히 감사

을받은

오류 메시지 :

ReflectionTypeLoadException ".. 하나 또는 요청 유형의 더로드 더 내용은 LoaderExceptions 속성을 검색 할 수 없습니다"

과은 LoaderExceptions에

: 또는 해당 종속성 중 하나

는 "파일 또는 어셈블리를로드 할 수 없습니다 ', PublicKeyToken = null이 IfxGenDocService, 버전 = 1.0.0.0, 문화 = 중립'을 . 지정한 파일을 찾을 수 없습니다. ":"IfxGenDocService, 버전 = 1.0.0.0, 문화 = 중립, PublicKeyToken = null이 "

EDIT1을 : 나는 자신의 엉덩이에 기본 클래스를 추출하기 위해 약간의 주위에 물건을 변경 엠블럼과 여전히 같은 오류가 발생하고 있습니다. 아마 관련이있다, 나는 기본 클래스를 상속하는 3 개의 클래스를 포함하는 atest 어셈블리를 가지고있다. 나는 위의보고 3은 LoaderExceptions이 (같은. 나는 각 클래스 1을 가정 모두 얻을.

+0

전체 오류 메시지를 추가 할 수 있습니까? – thehennyy

+0

Thx .. 방금 추가했습니다. –

답변

1

프로세스에 의해 어셈블리가 잠길 때도 발생할 수 있습니다 .B Assembly.LoadFile 및 Assmebly.LoadFrom 메서드는 어셈블리를 잠급니다.이 메서드를 프로세스에서 둘 이상 호출하면 두 번째 호출에서이 예외를 가져올 수 있습니다.

.Select(f => Assembly.Load(File.ReadAllBytes(Path.Combine(path, f.Name)))) 
모든 종속 어셈블리 당신이 통과 된 디렉토리에있는 경우가 작동

, 그렇지 않으면 당신은 를 확인하실 수 있습니다 잠금을 방지하기 위해

, 당신과 함께이 라인

.Select(f => Assembly.LoadFile(Path.Combine(path, f.Name))) 

을 변경해야 System.Reflection.Assembly.LoadFile Locks FileLoading Assembly to Leave Assembly File Unlocked

+0

우수. 많은 thx –

0

문제는 실제로 LoadFrom 때문에

.Select(f => Assembly.LoadFrom(Path.Combine(path, f.Name))) 

을 했어야

.Select(f => Assembly.LoadFile(Path.Combine(path, f.Name))) 

이 줄을이었다 종속성도로드합니다. 유닛 테스트를 실행할 때 종속성이 이미로드되어 있어야한다고 가정합니다.

관련 문제