Получить путь к пользовательской My.dll при выполнении - C#
Формулировка задачи:
Имеется сборка и в ней пролинкована моя библиотека. Подскажите, как получить адрес этой библиотеки программно?
Нужно что-то вроде
Но, к сожалению:
1. Первый метод возвращает Так я копировал все сборки, используемые приложением, вызывая Чего-то более лаконичного и унифицированного (как для загруженных в домен, так и нет и без всяких конкатинаций) не нашёл.
Assembly.GetExecutingAssembly().GetReferencedAssemblies() //или AppDomain.CurrentDomain.GetAssemblies()
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));
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д