Поиск

Просмотр типов сборки

Для последовательного просмотра всех типов данной сборки вам нужно лишь создать экземпляр объекта Assembly и запросить массив Types для этой сборки, например:

using System;
using System.Diagnostics;
using System.Reflection;
class DemoAttr : System.Attribute
< >
enum DemoEnum
{
}
class DemoBaseClass
{
}
class DemoDerivedClass : DemoBaseClass {
}
class DemoStruct
{
}
class GetTypesApp {
protected static string GetAssemblyName(string[] args)
{
string assemblyName;
if (0 == args.Length) {
Process p = Process.GetCurrentProcessQ;
assemblyName = p.ProcessName + ".exe"; } else
assemblyName = args[0]; return assemblyName; }
public static void Main(string[] args) <
string assemblyName = GetAssemblyName(args);
Console.WriteLine("Loading info for " + assemblyName);
Assembly a = Assembly.LoadFrom(assemblyName);
Type[] types = a.GetTypes(); foreach(Type t in types) {
Console.WM.teLine("\nType information for: " +
t.FullName); Console.WriteLine("\tBase class = " +
t.BaseType.FullName); } } }
ПРИМЕЧАНИЕ Для запуска кода, которому требуется проверка защиты (например, кода, использующего API отражения) в интрасети, вам придется изменить политику, например, с помощью утилиты Code Access Security Policy (caspol.exe). Вот как это сделать:
caspol -addgroup 1.2 -url "file://somecomputer/someshare/*"
SkipVerification

В этом примере на основе URL запускаемого кода предоставляются дополнительные права доступа, в данном случае SkipVerification. Вы также можете изменить политику для всего кода в данной зоне или только для конкретной сборки в зависимости от его электронной подписи или даже хэша. Для просмотра аргументов утилиты caspol.exe наберите в командной строке caspol - ? или обратитесь к онлайновой документации MSDN.

Первая часть метода Main не очень-то интересна: этот код определяет, передали ли вы приложению имя сборки. Если нет, то для определения имени исполняемого в текущий момент приложения используется статический метод GetProcessName класса Process.
После этого вы начнете понимать, как легко решать большинство задач с помощью отражения. Легче всего создать экземпляр объекта Assembly, вызвав Assembly. LoadFrom. Этот метод принимает единственный аргумент — строку, представляющую имя физического файла, который вы хотите загрузить. Вызванный после этого метод Assembly.GetTypes возвращает массив объектов Туре. Теперь у нас есть объект, описывающий каждый отдельный тип в целой сборке! В результате приложение выводит имя своего базового класса.

Вот выходная информация, полученная при запуске этого приложения с указанием в качестве параметра файла gettypes.exe или без аргументов вообще:

Loading info for GetTypes.exe
Type information for: DemoAttr Base class = System.Attribute
Type information for: DemoEnum Base class = System.Enum
Type information for: DemoBaseClass Base class = System.Object
Type information for: DemoDerivedClass
Base class = DemoBaseClass
Type information for: DemoStruct Base class = System.Object
Type information for: AssemblyGetTypesApp Base class = System.Object