Шрифт:
Динамическая загрузка сборок
Бывают случаи, когда вам нужно программно загрузить сборки на лету, даже если нет записи о данной сборке в манифесте. Формально говоря, акт загрузки внешних сборок по требованию называется динамической загрузкой.
System.Reflection
определяет класс под названием Assembly
. Используя этот класс, вы можете динамически загружать сборку, а также обнаружить свойства самой сборки. Используя тип Assembly
, вы можете динамически загружать сборки, а также загружать сборку, расположенную в произвольном месте. По сути, класс Assembly
предоставляет методы, позволяющие программно загружать сборки с диска. Чтобы проиллюстрировать динамическую загрузку, создайте новый проект консольного приложения с именем
ExternalAssemblyReflector
. Ваша задача - создать код, который запрашивает имя сборки (минус расширения) для динамической загрузки. Вы передадите ссылку на сборку в вспомогательный метод под названием DisplayTypes
, который просто выведет имена каждого класса, интерфейса, структуры, перечисления и делегата. делегата, который он содержит. Код освежающе прост.
using System;
using System.Reflection;
using System.IO; // Для определения FileNotFoundException.
Console.WriteLine("***** External Assembly Viewer *****");
string asmName = "";
Assembly asm = null;
do
{
Console.WriteLine("\nEnter an assembly to evaluate");
// Пригласить ввести имя сборки.
Console.Write("or enter Q to quit: "); // или Q для завершения
// Получить имя сборки.
asmName = Console.ReadLine;
// Пользователь желает завершить программу?
if (asmName.Equals("Q",StringComparison.OrdinalIgnoreCase))
{
break;
}
// Попробовать загрузить сборку.
try
{
asm = Assembly.LoadFrom(asmName);
DisplayTypesInAsm(asm);
}
catch
{
Console.WriteLine("Sorry, can't find assembly.");
// Сборка не найдена.
}
} while (true);
static void DisplayTypesInAsm(Assembly asm)
{
Console.WriteLine("\n***** Types in Assembly *****");
Console.WriteLine("->{0}", asm.FullName);
Type[] types = asm.GetTypes;
foreach (Type t in types)
{
Console.WriteLine("Type: {0}", t);
}
Console.WriteLine("");
}
Если вы хотите проводить рефлексию по
CarLibrary.dll
, тогда перед запуском приложения ExternalAssemblyReflector
понадобится скопировать двоичный файл CarLibrary.dll
(из предыдущей главы ) в каталог проекта (в случае применения Visual Studio Code) или в каталог \bin\Debug\net5.0
самого приложения (в случае использования Visual Studio). После выдачи запроса введите CarLibrary
(расширение необязательно); вывод будет выглядеть примерно так:
***** External Assembly Viewer *****
Enter an assembly to evaluate
or enter Q to quit: CarLibrary
***** Types in Assembly *****
– >CarLibrary, Version=1.0.0.1, Culture=neutral, PublicKeyToken=null
Type: CarLibrary.MyInternalClass
Type: CarLibrary.EngineStateEnum
Type: CarLibrary.MusicMedia
Type: CarLibrary.Car
Type: CarLibrary.MiniVan
Type: CarLibrary.SportsCar
Метод
LoadFrom
также может принимать абсолютный путь к файлу сборки, которую нужно просмотреть (скажем, С:\MyApp\MyAsm.dll
). Благодаря этому методу вы можете передавать полный путь в своем проекте консольного приложения. Таким образом, если файл CarLibrary.dll
находится в каталоге С:\MyCode
, тогда вы можете ввести С:\MyCode\CarLibrary
(обратите внимание, что расширение необязательно).