Получить путь к пользовательской My.dll при выполнении - C#

Узнай цену своей работы

Формулировка задачи:

Имеется сборка и в ней пролинкована моя библиотека. Подскажите, как получить адрес этой библиотеки программно? Нужно что-то вроде
Assembly.GetExecutingAssembly().GetReferencedAssemblies()
//или
AppDomain.CurrentDomain.GetAssemblies()
Но, к сожалению: 1. Первый метод возвращает

AssemblyName

's с пустыми

AssemblyName.FullName

(как, впрочем, и в других свойствах путей мне найти не удалось); 2. Второй метод прекрасно работает для .Net-библиотек, но не видит мою. (как я понимаю, т.к. метод из моей библиотеки запускается после текущего, то она возможно не успела пролинковаться). По поводу идеи (зачем это надо) : Загорелся я интересом, чисто для себя, создать программку, которая могла бы сама себя создавать (копировать все запускаемые файлы в указанную папку и запускаться оттуда, чтобы наглядно разобраться откуда что берётся при компиляции). В итоге, был крайне удивлён отсутствием имени/адреса сборки в

AssemblyName

. И откуда вообще моя сборка черпает инфу о том, где расположена My.dll? Проясните, пожалуйста.
В общем, из того, что нашёл. Если сборка загружена в домен (загружается во время исполнения при первом обращении к классу сборки), то можно получить так:
//Получаем все загруженные в домен сборки
AppDomain.CurrentDomain.GetAssemblies()
//Для каждой Assembly получаем файл (поток его чтения)
Assembly.GetFiles(true)
//и из потока можно получить уже полное имя
FileStream.Name
Так я копировал все сборки, используемые приложением, вызывая

FileStream.CopyTo(MyNewFileStream)

Иначе, если планируется узнать адреса только тех сборок, которые копируются в каталог приложения (нестандартные сборки в references, у которых в свойствах указано Copy local = true), исключая уже установленные, например

System

, на форумах предлагают так:
//получаем список всех references в виде IEnumerable<AssemblyName>
Assembly.GetExecutingAssembly().GetReferencedAssemblies()
//для каждой интересуемой получаем полное имя конкатинацией для экземпляра (myAssemblyNameInstance)
string asmFullName = string.Concat(Assembly.GetExecutingAssembly().CodeBase, "", <myAssemblyNameInstance>.Name, ".dll").
Чего-то более лаконичного и унифицированного (как для загруженных в домен, так и нет и без всяких конкатинаций) не нашёл.

Решение задачи: «Получить путь к пользовательской My.dll при выполнении»

textual
Листинг программы
Assembly.GetExecutingAssembly()
    .GetReferencedAssemblies()
    .ToList()
    .ForEach(asmName => Assembly.Load(asmName));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы