web-dev-qa-db-ja.com

名前でC#.Netアセンブリを取得する方法は?

次のようなものがあります:

_AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
_

そのため、AppDomain.CurrentDomain.GetAssemblies()をループする代わりに、特定のアセンブリを直接取得できます。

77
Jronny

Assembly.Load(...) を見てみましたか?

93
cyberzed

LINQで解決しました

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(Assembly => Assembly.GetName().Name == name);
}
59
Fabio

何を達成しようとしているかによって異なります。

アセンブリを取得するだけの場合は、System.Reflection.Assembly.Load()を呼び出す必要があります(既に指摘したとおり)。これは、.NETがアセンブリが現在のAppDomainに既に読み込まれているかどうかを自動的にチェックし、既に読み込まれている場合は再度読み込まないためです。

check Assemblyがロードされたかどうか(何らかの診断上の理由で)をしようとしている場合、ロードされたすべてのアセンブリをループする必要があります。

ループしたいもう1つの理由は、アセンブリ情報の一部しか知らない場合(たとえば、バージョンがわからない場合)です。つまり、「見たときに認識」するには十分な知識がありますが、ロードするには十分ではありません。ただし、これはかなり曖昧でありそうもないシナリオです。

16
EMP

アセンブリのメタデータ(バージョンなど)にアクセスするだけの場合は、Assembly.ReflectionOnlyLoad(name)をチェックしてください。これにより、メタデータのみをロードでき、メモリとIOを節約できます。

7

System.Reflection.Assemblyクラス、特にLoadメソッドを見てください: [〜#〜] msdn [〜#〜]

2

必要なことを行う拡張メソッドを作成できます。

このメソッドはロードされたアセンブリのみを列挙します、おそらくロードする必要がある場合は、受け入れられた回答から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を返します。

0
Marcell Toth