Есть что-то вроде:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
поэтому вместо того, чтобы зацикливаться AppDomain.CurrentDomain.GetAssemblies()
, мы могли бы напрямую получить конкретную сборку.
c#
assemblies
Jronny
источник
источник
System.IO.FileNotFoundException
если сборку не удалось загрузить.Я решил с 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
источник