2017-11-28 14 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から呼び出すと、単体テストと同じフォルダをターゲットにすると、リフレクションエラーが発生し、上記のコードが含まれているアセンブリをロードできないというローダー情報が報告されます。これは、基本クラスを継承するクラスを含むアセンブリを反映しているときに、呼び出しのGetLoadableTypesルーチンでのみ発生します。

COMが関与している場合にのみ発生する再突入問題のように聞こえます。私は抽象基本クラスを別のアセンブリに入れることができると思うが、何か他のことが起こっているのか疑問に思った。

任意の説明やポインタは明らかに感謝

エラーメッセージ受信:「。 要求された種類の一つ以上を読み込むことができませんより多くの についてはLoaderExceptionsプロパティを取得」

ReflectionTypeLoadExceptionを

とLoaderExceptionsで:

「 ' カルチャニュートラル、PublicKeyToken = = null、IfxGenDocService、バージョン= 1.0.0.0' またはその依存関係の1つのファイルまたはアセンブリをロードできませんでした 。システムは、指定されたファイルを見つけることができません。「:」IfxGenDocService、 バージョン= 1.0.0.0、文化=中立、なPublicKeyToken = null」の

EDIT1を:私は、自身のお尻に基本クラスを抽出するために、少し周りのものを変更しましたまだ同じエラーが発生しています。おそらく関連しているのは、ベースクラスを継承する3つのクラスを含むアセンブリを持っているということです。上記報告されたように、私は、クラスごとに1を前提としています。3 LoaderExceptions(すべて同じを得る。

+0

完全なエラーメッセージを追加できますか? – thehennyy

+0

Thx .. just added –

答えて

1

プロセスによってロックされている場合にも発生する可能性があります。 Assembly.LoadFileメソッドとAssmebly.LoadFromメソッドはアセンブリをロックし、プロセス内でこのメソッドを複数呼び出すと、2回目の呼び出しでこの例外を取得することができます。

.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

問題はこのラインで

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

だったそれは実際にLoadFromので

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

されている必要がありますまた、ユニットテストを実行するときに、依存関係が既にロードされている必要があると仮定します。

関連する問題