Подтвердить что ты не робот

Как получить сборку С#.Net по имени?

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

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

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

4b9b3361

Ответ 2

Я решил с LINQ

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

Посмотрите на класс System.Reflection.Assembly, в частности метод Load: MSDN

Ответ 6

Вы можете написать метод расширения, который делает то, что вам нужно.

Этот метод будет перечислять только загруженные сборки, если вам, возможно, потребуется загрузить его, используйте 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.