Как мне получить пути всех сборок, на которые ссылается выполняющаяся в данный момент сборка? GetReferencedAssmblies()
дает мне AssemblyName[]
s. Как мне добраться туда, откуда они загружены?
Получить пути всех ссылочных ассемблий
Ответ 1
Вы не можете знать, пока сборка не будет загружена. Алгоритм разрешения сборки сложный, и вы не можете надежно угадать, что он будет делать. Вызов переопределения Assembly.Load(AssemblyName)
даст вам ссылку на сборку, а ее свойство Location сообщает вам, что вам нужно.
Однако вы действительно не хотите загружать сборки спереди, прежде чем компилятор JIT сделает это. Это неэффективно, и вероятность проблем не равна нулю. Вы можете, например, запустить событие AppDomain.AssemblyResolve
, прежде чем программа будет готова ответить на него. Избегайте задавать этот вопрос.
Ответ 2
После ответа Hans Passant, и поскольку свойство CodeBase
всегда содержало null
, я придумал это. Он может не найти все сборки, так как они могут не быть уже загружены. В моей ситуации мне пришлось найти всю ссылку на ранее загруженную сборку, поэтому она работала хорошо:
IEnumerable<string> GetAssemblyFiles(Assembly assembly)
{
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assemblyName in assembly.GetReferencedAssemblies())
yield return loadedAssemblies.SingleOrDefault(a => a.FullName == assemblyName.FullName)?.Location;
}
Использование:
var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly);
Ответ 3
Свойство CodeBase
должно содержать полное имя пути.
Ответ 4
Вы можете получить расположение URL-адреса сборки следующим образом:
Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase