名前でC#.Netアセンブリを取得するにはどうすればよいですか?


89

次のようなものはありますか?

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

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

回答:



72

LINQで解決しました

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

7
これは、問題のアセンブリがロードされている場合にのみ機能します。Web APIからDALに型を登録するときに役に立たない場合があります
Chazt3n 2015年

17

それはあなたが達成しようとしていることに依存します。

アセンブリを取得したいだけの場合は、 System.Reflection.Assembly.Load()(すでに指摘したように)。これは、.NETがアセンブリが現在のAppDomainに既にロードされているかどうかを自動的にチェックし、ロードされている場合は再度ロードしないためです。

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

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


System.Reflection.Assembly.Load()は、私が必要としているものと同じくらい完璧です。
Jronny 2009

9

アセンブリのメタデータ(バージョンなど)にアクセスする必要がある場合は、Assembly.ReflectionOnlyLoad(name)を確認してください。これは、メタデータのみをロードできるため、メモリとIOを節約できる可能性があります。


2
@ erik-reppen:MSのドキュメントによると、以前のバージョンで利用可能です。3.5アプリで使用しています:msdn.microsoft.com/en-us/library/0et80c7k
v

6

これが参照したアセンブリである場合、次のようなクラスを作成するのが好きです。

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

そして、そのアセンブリへの参照が必要なときはいつでも:

var assembly = MyLibraryAssembly.Value;

これは私がいつも探していた非常にクリーンなソリューションです!私はそれを次のように使うことができます:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

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

このメソッドはロードされたアセンブリのみを列挙します。ロードする必要がある場合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ます。それ以外の場合は、を返します。


GetAssemblyByName()が見つかりませんでした
Ziggler

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.