Язык программирования C#9 и платформа .NET5
Часть 324 из 642 Информация о книге
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(из предыдущей главы ) в каталог проекта (в случае применения Visual Studio Code) или в каталогCarLibrary.dllсамого приложения (в случае использования Visual Studio). После выдачи запроса введите\bin\Debug\net5.0(расширение необязательно); вывод будет выглядеть примерно так:CarLibrary***** External Assembly Viewer *****Enter an assembly to evaluateor enter Q to quit: CarLibrary***** Types in Assembly *****->CarLibrary, Version=1.0.0.1, Culture=neutral, PublicKeyToken=nullType: CarLibrary.MyInternalClassType: CarLibrary.EngineStateEnumType: CarLibrary.MusicMediaType: CarLibrary.CarType: CarLibrary.MiniVanType: CarLibrary.SportsCarМетод
также может принимать абсолютный путь к файлу сборки, которую нужно просмотреть (скажем,LoadFrom()). Благодаря этому методу вы можете передавать полный путь в своем проекте консольного приложения. Таким образом, если файлС:\MyApp\MyAsm.dllнаходится в каталогеCarLibrary.dll, тогда вы можете ввестиС:\MyCode(обратите внимание, что расширение необязательно).С:\MyCode\CarLibraryРефлексия сборок инфраструктуры
Метод
имеет несколько перегруженных версий. Одна из них разрешает указывать значение культуры (для локализованных сборок), а также номер версии и значение маркера открытого ключа (для сборок инфраструктуры). Коллективно многочисленные элементы, идентифицирующие сборку, называются отображаемым именем. Форматом отображаемого имени является строка пар "имя-значение", разделенных запятыми, которая начинается с дружественного имени сборки, а за ним следуют необязательные квалификаторы (в любом порядке). Вот как выглядит шаблон (необязательные элементы указаны в круглых скобках):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()