22

アセンブリGetTypes()は舞台裏で何をしますか?アセンブリがロードされていると仮定すると、AppDomainそれでも物理DLLから読み取る必要がありますか?そして、アセンブリマニフェストは何をしますか?

次のようにアセンブリを繰り返します。

AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()) 

次のエラーが発生することがあります。

 Could not load file or assembly 

これは、アセンブリがにロードされているため、AppDomain必ずしもメモリに完全にロードされているとは限らないことを示しています。それでもファイルに戻る必要がある場合があります。

私の質問:

  1. なぜそれをしているのですか?
  2. これらのセミロードされたアセンブリを検出するにはどうすればよいですか?
4

2 に答える 2

47

アセンブリからタイプを取得するには、追加のアセンブリをロードする必要がある場合があります。これがエラーの原因である可能性があります。依存アセンブリのロードの失敗。ただし、.NETアセンブリは、異なるファイル内の複数のモジュールから構築される場合があるため、マルチファイルアセンブリがあり、1つ以上のファイルが欠落しているか破損している場合にも、この問題に直面する可能性があります。

エラーに関連して、ロードできなかった特定のアセンブリに関する詳細情報を取得する必要があります。

アセンブリにロード可能なタイプのリストをロードするだけの場合は、次のような拡張メソッドを使用できます。

public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
{
    if (assembly == null) throw new ArgumentNullException(nameof(assembly));
    try
    {
        return assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        return e.Types.Where(t => t != null);
    }
}

(出典:アセンブリ内のすべてのタイプを取得

于 2012-08-11T14:14:40.693 に答える
2

舞台裏では、GetTypeメソッドは、指定されたオブジェクトのタイプオブジェクトポインタメンバーに格納されているアドレスを返します(オブジェクトがヒープに格納されている場合、この情報はSync Block Indexなどの他のいくつかの情報とともに格納されます)。これは、GetTypeメソッドが任意のオブジェクトのTrueTypeを返す方法です。アセンブリは、ロードする必要のある他のアセンブリに依存している場合があります。また、アプリケーションで必要とされない限り、JITによってロードされることはありません。したがって、はい、アセンブリは常に物理的に利用可能である必要があります。

于 2012-08-11T14:52:37.470 に答える