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


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
Это будет работать, только если соответствующая сборка загружена. Может не помочь при регистрации типов в DAL из веб-API
Chazt3n 05

17

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

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

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.