Есть что-то вроде:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
поэтому вместо того, чтобы зацикливаться AppDomain.CurrentDomain.GetAssemblies()
, мы могли бы напрямую получить конкретную сборку.
Ответы:
Я решил с LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Это зависит от того, чего вы пытаетесь достичь.
Если вы просто хотите получить сборку, вам следует позвонить System.Reflection.Assembly.Load()
(как уже указывалось). Это связано с тем, что .NET автоматически проверяет, загружена ли уже сборка в текущий домен приложения, и не загружает ее снова, если она была загружена.
Если вы просто пытаетесь проверить , загружена ли сборка или нет (возможно, по какой-то причине диагностики), тогда вам действительно нужно перебрать все загруженные сборки.
Еще одна причина, по которой вы можете захотеть выполнить цикл, - это если вы знаете только часть информации о сборке (например, вы не уверены в версии). То есть вы знаете достаточно, чтобы «распознать, когда увидите», но недостаточно, чтобы загрузить. Однако это довольно неясный и маловероятный сценарий.
Для тех, кому просто нужно получить доступ к метаданным сборки (версии и т. Д.), Обратите внимание на Assembly.ReflectionOnlyLoad (name), которая может загружать только метаданные, возможно, экономя память и ввод-вывод.
Если это сборка, на которую вы ссылались, мне нравится писать такой класс:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
а затем всякий раз, когда вам понадобится ссылка на эту сборку:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
Вы можете написать метод расширения, который сделает то, что вам нужно.
Этот метод будет только перечислять загруженные сборки , если вам, возможно, потребуется загрузить его, используйте 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
.
Взгляните на класс System.Reflection.Assembly, в частности на метод Load: MSDN
System.IO.FileNotFoundException
если сборку не удалось загрузить.