Как получить C # .Net Assembly по имени?

89

Есть что-то вроде:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

поэтому вместо того, чтобы зацикливаться AppDomain.CurrentDomain.GetAssemblies(), мы могли бы напрямую получить конкретную сборку.

Jronny
источник

Ответы:

105

Вы пробовали смотреть Assembly.Load (...) ?

киберзированный
источник
6
Для тех, кому интересно, это выкидывает, System.IO.FileNotFoundExceptionесли сборку не удалось загрузить.
Rudey
72

Я решил с LINQ

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Фабио
источник
7
Это будет работать, только если соответствующая сборка загружена. Может не помочь при регистрации типов в DAL из веб-API
Chazt3n 05
17

Это зависит от того, чего вы пытаетесь достичь.

Если вы просто хотите получить сборку, вам следует позвонить System.Reflection.Assembly.Load()(как уже указывалось). Это связано с тем, что .NET автоматически проверяет, загружена ли уже сборка в текущий домен приложения, и не загружает ее снова, если она была загружена.

Если вы просто пытаетесь проверить , загружена ли сборка или нет (возможно, по какой-то причине диагностики), тогда вам действительно нужно перебрать все загруженные сборки.

Еще одна причина, по которой вы можете захотеть выполнить цикл, - это если вы знаете только часть информации о сборке (например, вы не уверены в версии). То есть вы знаете достаточно, чтобы «распознать, когда увидите», но недостаточно, чтобы загрузить. Однако это довольно неясный и маловероятный сценарий.

EMP
источник
System.Reflection.Assembly.Load () так же совершенен, как и то, что мне нужно.
Jronny
9

Для тех, кому просто нужно получить доступ к метаданным сборки (версии и т. Д.), Обратите внимание на Assembly.ReflectionOnlyLoad (name), которая может загружать только метаданные, возможно, экономя память и ввод-вывод.

Матье Френетт
источник
2
@ erik-reppen: Согласно документам MS, он доступен в предыдущих версиях. Я использую его в приложении 3.5: msdn.microsoft.com/en-us/library/0et80c7k(v=vs.100).aspx
codenheim
6

Если это сборка, на которую вы ссылались, мне нравится писать такой класс:

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

а затем всякий раз, когда вам понадобится ссылка на эту сборку:

var assembly = MyLibraryAssembly.Value;
Дэйв Кузино
источник
Это очень чистое решение, которое я всегда искал! Я могу использовать это так:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Алиельсон Пиффер
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);
    }
}

Затем вы вызываете этот метод в домене приложения следующим образом:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

Если SomeAssembly загружен в текущий домен приложения, метод вернет его, в противном случае он вернется null.

Марселл Тот
источник
Я didnot найти GetAssemblyByName ()
Ziggler
2

Взгляните на класс System.Reflection.Assembly, в частности на метод Load: MSDN

Максимилиан Майерл
источник