次のようなものはありますか?
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
したがって、ループする代わりにAppDomain.CurrentDomain.GetAssemblies()
、特定のアセンブリを直接取得することができます。
回答:
LINQで解決しました
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
それはあなたが達成しようとしていることに依存します。
アセンブリを取得したいだけの場合は、 System.Reflection.Assembly.Load()
(すでに指摘したように)。これは、.NETがアセンブリが現在のAppDomainに既にロードされているかどうかを自動的にチェックし、ロードされている場合は再度ロードしないためです。
アセンブリがロードされているかどうかを確認しようとしているだけの場合(おそらく何らかの診断上の理由で)、ロードされているすべてのアセンブリをループする必要があります。
ループしたいもう1つの理由は、アセンブリ情報の一部しか知らない場合です(たとえば、バージョンがわからない場合)。つまり、「見たときにそれを認識する」ことは十分に知っていますが、ロードするには十分ではありません。ただし、これはかなりあいまいでありそうもないシナリオです。
アセンブリのメタデータ(バージョンなど)にアクセスする必要がある場合は、Assembly.ReflectionOnlyLoad(name)を確認してください。これは、メタデータのみをロードできるため、メモリとIOを節約できる可能性があります。
これが参照したアセンブリである場合、次のようなクラスを作成するのが好きです。
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
そして、そのアセンブリへの参照が必要なときはいつでも:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
必要なことを実行する拡張メソッドを作成できます。
このメソッドは、ロードされたアセンブリのみを列挙します。ロードする必要がある場合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
ます。それ以外の場合は、を返します。
System.Reflection.Assemblyクラス、特にLoadメソッドを見てください:MSDN
System.IO.FileNotFoundException
はアセンブリをロードできなかった場合にスローされます。