7

アセンブリからすべての型を取得したいのですが、参照がなく、参照も気にしません。インターフェイスの種類を見つけることは、参照とどのような関係がありますか? これを回避する方法はありますか?

Assembly assembly = Assembly.LoadFrom(myAssemblyPath);
Type[] typeArray = assembly.GetTypes();

スロー: FileNotFoundException ファイルまたはアセンブリ '参照されたアセンブリ' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

4

4 に答える 4

5

アセンブリからのコードはロード後に実行できるため、アセンブリをロードするには、その依存関係もすべてロードする必要があります (実際には何も実行せず、反映するだけであってもかまいません)。

明示的にリフレクションする目的でアセンブリをロードするにはたとえばReflectionOnlyLoadFrom. これには、参照されているアセンブリも読み込む必要はありませんが、コードを実行できず、リフレクションが慣れていない場合よりも少し扱いに​​くくなります。

于 2011-11-10T00:07:00.597 に答える
3

アセンブリのみで定義された Get Typesの複製のようです。解決策は次のとおりです。

public static Type[] GetTypesLoaded(Assembly assembly)
{
    Type[] types;
    try
    {
        types = assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        types = e.Types.Where(t => t != null).ToArray();
    }

    return types;    
}
于 2014-02-12T09:03:15.377 に答える
0

リフレクションのみのコンテキストを使用する代わりに、Jb Evain によるMono.Cecilを使用することもできます。これはNuGet からも入手できます。

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath);
Collection<TypeDefinition> types = module.Types;
于 2015-03-04T04:47:21.517 に答える
0

アセンブリを読み込むには、アセンブリの依存関係を読み込む必要があります。たとえば、アセンブリに を返す型が含まれているXmlNode場合は、ロードする必要がありますSystem.Xml.dll

于 2011-11-10T00:06:29.607 に答える