2011-11-10 9 views
3

私のアセンブリからすべての型を取得したいのですが、参照がなく、気にもなりません。インタフェースタイプを見つけることは参照と何が関係していますか?これを回避する手段がありますか?Assembly.GetTypes()に参照が必要なのはなぜですか?

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

例外: にFileNotFoundException は、ファイルまたはアセンブリ「いくつかの参照アセンブリ」またはその依存関係の1つをロードできませんでした。システムは、指定されたファイルを見つけることができません。

+0

myAssemblyはファイル名ですか? –

+0

@competent_techファイルパスです。 – Peter

答えて

4

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

アセンブリをロードするために明示的にアセンブリをロードするには、たとえばload it into the reflection-only contextが必要です。 ReflectionOnlyLoadFrom。これは、参照されているアセンブリを読み込む必要はありませんが、コードを実行することはできませんし、リフレクションは、あなたが以前に慣れていたものより少し厄介です。

+0

反射のみのコンテキストの場合+1。私はそれについて忘れてしまった。 – phoog

+3

いいですね。でも、これが得られます。プリペアされていないため、アセンブリ 'refAssmbly'への依存関係を解決できません。 ReflectionOnly APIを使用する場合、依存アセンブリは、ReflectionOnlyAssemblyResolveイベントを通じてオンデマンドでプリロードまたはロードする必要があります。私は基本的に見てみたいので、参照を解決する必要があるのはなぜですか? – Peter

0

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

1

解決策があるGet Types defined in an assembly onlyの複製、のようです:

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;  
} 
0

リフレクションのみのコンテキストを使用する代わりにもvia NuGet可能ですJbのEvainによってMono.Cecilかもしれません。

ModuleDefinition module = ModuleDefinition.ReadModule(myAssemblyPath); 
Collection<TypeDefinition> types = module.Types; 
関連する問題