Получить пути ко всем ссылочным сборкам - PullRequest
12 голосов
/ 16 ноября 2010

Как получить пути ко всем сборкам, на которые ссылается текущая исполняемая сборка? GetReferencedAssmblies() дает мне AssemblyName[] с. Как мне добраться туда, откуда они загружаются, оттуда?

Ответы [ 4 ]

13 голосов
/ 16 ноября 2010

Вы не можете знать, пока не будет загружена сборка. Алгоритм разрешения сборки сложен, и вы не можете с уверенностью догадаться, что он будет делать. Вызов переопределения Assembly.Load(AssemblyName) даст вам ссылку на сборку, а его свойство Location сообщит вам, что вам нужно.

Однако, вы действительно не хотите загружать сборки заранее, до компилятор JIT делает это. Это неэффективно, и вероятность возникновения проблем не равна нулю. Например, вы можете запустить событие AppDomain.AssemblyResolve до того, как программа будет готова ответить на него. Старайтесь не задавать этот вопрос.

3 голосов
/ 04 марта 2016

После ответа Ханса Пассанта, и поскольку свойство CodeBase всегда содержало null, я придумал это.Возможно, он не найдет все сборки, поскольку не все они уже загружены.В моей ситуации мне нужно было найти все ссылки на ранее загруженную сборку, чтобы она работала хорошо:

IEnumerable<string> GetAssemblyFiles(Assembly assembly)
{
    var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
    return assembly.GetReferencedAssemblies()
        .Select(name => loadedAssemblies.SingleOrDefault(a => a.FullName == name.FullName)?.Location)
        .Where(l => l != null);
}

Использование:

var assemblyFiles = GetAssemblyFiles(typeof(MyClass).Assembly);
0 голосов
/ 16 ноября 2010

URL-адрес сборки можно получить следующим образом:

Assembly.GetExecutingAssembly().GetReferencedAssemblies()[0].CodeBase
0 голосов
/ 16 ноября 2010

Свойство CodeBase должно содержать полное имя пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...