Шрифт:
Интервал:
Закладка:
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) или в каталог binDebugnet5.0 самого приложения (в случае использования Visual Studio). После выдачи запроса введите CarLibrary (расширение необязательно); вывод будет выглядеть примерно так:
***** External Assembly Viewer *****
Enter an assembly to evaluate
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})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() также может принимать абсолютный путь к файлу сборки, которую нужно просмотреть (скажем, С:MyAppMyAsm.dll). Благодаря этому методу вы можете передавать полный путь в своем проекте консольного приложения. Таким образом, если файл CarLibrary.dll находится в каталоге С:MyCode, тогда вы можете ввести С:MyCodeCarLibrary (обратите внимание, что расширение необязательно).
Рефлексия сборок инфраструктуры
Метод Assembly.Load() имеет несколько перегруженных версий. Одна из них разрешает указывать значение культуры (для локализованных сборок), а также номер версии и значение маркера открытого ключа (для сборок инфраструктуры). Коллективно многочисленные элементы, идентифицирующие сборку, называются отображаемым именем. Форматом отображаемого имени является строка пар "имя-значение", разделенных запятыми, которая начинается с дружественного имени сборки, а за ним следуют необязательные квалификаторы (в любом порядке). Вот как выглядит шаблон (необязательные элементы указаны в круглых скобках):
Имя (,Version = <старший номер>.<младший номер>.<номер сборки>.сномер редакции>)
(,Culture = <маркер культуры>) (,PublicKeyToken = <маркер открытого ключа>)
При создании отображаемого имени соглашение PublicKeyToken=null отражает тот факт, что требуется связывание и сопоставление со сборкой, не имеющей строгого имени. Вдобавок Culture="" указывает, что сопоставление должно осуществляться со стандартной культурой целевой машины. Вот пример:
// Загрузить версию 1.0.0.0 сборки CarLibrary, используя стандартную культуру
Assembly а = Assembly.Load(
"CarLibrary, Version=l.0.0.0, PublicKeyToken=null, Culture=""" );
// В C# кавычки должны быть отменены с помощью символа обратной косой черты
Кроме того, следует иметь в виду, что пространство имен System.Reflection предлагает тип AssemblyName, который позволяет представлять показанную выше строковую информацию в удобной объектной переменной. Обычно класс AssemblyName применяется вместе с классом System.Version, который представляет собой объектно-ориентированную оболочку для номера версии сборки. После создания отображаемого имени его затем можно передавать перегруженной версии метода Assembly.Load():
- Понимание SQL - Мартин Грубер - Базы данных