Шрифт:
Рефлексия сборок инфраструктуры
Метод
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
:
// Применение типа AssemblyName для определения отображаемого имени.
AssemblyName asmName;
asmName = new AssemblyName;
asmName.Name = "CarLibrary";
Version v = new Version("1.0.0.0");
asmName.Version = v;
Assembly a = Assembly.Load(asmName);
Чтобы загрузить сборку .NET Framework (не .NET Core), в параметре
Assembly.Load
должно быть указано значение PublicKeyToken
. В .NET Core это не требуется из-за того, что назначение строгих имен используется реже. Например, создайте новый проект консольного приложения по имени FrameworkAssemblyViewer
, имеющий ссылку на пакет Microsoft.EntityFrameworkCore
. Как вам уже известно, это можно сделать в интерфейсе командной строки .NET 5 (CLI):
dotnet new console -lang c# -n FrameworkAssemblyViewer
– o .\FrameworkAssemblyViewer -f net5.0
dotnet sln .\Chapter17_AllProjects.sln add .\FrameworkAssemblyViewer
dotnet add .\FrameworkAssemblyViewer
package Microsoft.EntityFrameworkCore -v 5.0.0
Вспомните, что в случае ссылки на другую сборку копия этой сборки помещается в выходной каталог ссылаемого проекта. Скомпилируйте проект с применением CLI:
dotnet build
После создания проекта, добавления ссылки на
EntityFrameworkCode
и компиляции проекта сборку теперь можно загрузить и инспектировать. Поскольку количество типов в данной сборке довольно велико, приложение будет выводить только имена открытых перечислений, используя простой запрос LINQ:
using System;
using System.Linq;
using System.Reflection;
Console.WriteLine("***** The Framework Assembly Reflector App *****\n");
// Загрузить Microsoft.EntityFrameworkCore.dll
var displayName =
"Microsoft.EntityFrameworkCore, Version=5.0.0.0,
Culture=\"\", PublicKeyToken=adb9793829d
dae60";
Assembly asm = Assembly.Load(displayName);
DisplayInfo(asm);
Console.WriteLine("Done!");
Console.ReadLine;
private static void DisplayInfo(Assembly a)
{
Console.WriteLine("***** Info about Assembly *****");
Console.WriteLine($"Asm Name: {a.GetName.Name}" ); // Имя сборки
Console.WriteLine($"Asm Version: {a.GetName.Version}"); // Версия сборки
Console.WriteLine($"Asm Culture:
{a.GetName.CultureInfo.DisplayName}"); // Культура сборки