次のようなものがあります:
_AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
_
そのため、AppDomain.CurrentDomain.GetAssemblies()
をループする代わりに、特定のアセンブリを直接取得できます。
Assembly.Load(...) を見てみましたか?
LINQで解決しました
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(Assembly => Assembly.GetName().Name == name);
}
何を達成しようとしているかによって異なります。
アセンブリを取得するだけの場合は、System.Reflection.Assembly.Load()
を呼び出す必要があります(既に指摘したとおり)。これは、.NETがアセンブリが現在のAppDomainに既に読み込まれているかどうかを自動的にチェックし、既に読み込まれている場合は再度読み込まないためです。
check Assemblyがロードされたかどうか(何らかの診断上の理由で)をしようとしている場合、ロードされたすべてのアセンブリをループする必要があります。
ループしたいもう1つの理由は、アセンブリ情報の一部しか知らない場合(たとえば、バージョンがわからない場合)です。つまり、「見たときに認識」するには十分な知識がありますが、ロードするには十分ではありません。ただし、これはかなり曖昧でありそうもないシナリオです。
アセンブリのメタデータ(バージョンなど)にアクセスするだけの場合は、Assembly.ReflectionOnlyLoad(name)をチェックしてください。これにより、メタデータのみをロードでき、メモリとIOを節約できます。
System.Reflection.Assemblyクラス、特にLoadメソッドを見てください: [〜#〜] msdn [〜#〜]
必要なことを行う拡張メソッドを作成できます。
このメソッドはロードされたアセンブリのみを列挙します、おそらくロードする必要がある場合は、受け入れられた回答からAssembly.Load
を使用します。
public static class AppDomainExtensions
{
public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
{
return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
}
}
次に、次のようにAppDomainでこのメソッドを呼び出します。
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
SomeAssemblyが現在のAppDomainにロードされると、メソッドはそれを返します。それ以外の場合は、null
を返します。