Получить пути всех ссылочных ассемблий

Как мне получить пути всех сборок, на которые ссылается выполняющаяся в данный момент сборка? 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