Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Игры со сборками из gac

Создаём новую сборку, в которой предполагается использовать наше детище. Затем добавляем ссылку на сборку. Не всё так просто. Сначала надо отыскать соответствующую .dll’ку. Наличие ключа в манифесте сборки приводит к тому, что сборка (в отличие от частных сборок) не будет копироваться в каталог запускающей сборки. Вместо этого исполняющая среда будет обращаться в GAC. Дальше – проще.

Объявленные в сборке классы оказываются доступны запускающей сборке. Набрали аж 3 сборки общего пользования. Дело не хитрое…

using System;

using SharedAssembly00;

using SharedAssembly01;

using SharedAssembly02;

namespace AssemblyStarter01

{

/// <summary>

/// Summary description for Class1.

/// </summary>

class startClass

{

/// <summary>

/// The main entry Point for the application.

/// </summary>

[STAThread]

static void Main(string[] args)

{

try

{

SharedAssembly00.Class1 c001 = new SharedAssembly00.Class1(); c001.f0();

SharedAssembly01.Class1 c011 = new SharedAssembly01.Class1(); c011.f0();

SharedAssembly02.Class1 c021 = new SharedAssembly02.Class1(); c021.f0();

}

catch(TypeLoadException e)

{

Console.WriteLine(“We are the problem: “ + e.Message);

}

}

}

}

Итак, подключили общедоступную сборку. Она не копируется, а остаётся в GAC. При создании клиента были выполнены определённые телодвижения, в результате которых клиент сохраняет информацию о свойствах располагаемых в GAC компонентах. Свойства этих компонент можно посмотреть после подсоединения данного элемента из GAC к References клиента. В частности, там есть свойство Copy local (по умолчанию установленное в false). Это означает, что соответствующая компонента из GAC клиентом не копируется. Общую сборку можно превратить в частную сборку, если это свойство установить в true.

Динамические сборки

Всё, о чём писалось до этого момента – суть СТАТИЧЕСКИЕ СБОРКИ. Статические сборки существуют в виде файлов на диске или других носителях. В случае необходимости загружаются в оперативную память и выполняются благодаря функциональным возможностям класса Assembly.

Динамические сборки создаются непосредственно в ходе выполнения приложения (статической сборки) и существуют в оперативной памяти. По завершении выполнения приложения обречены на бесследное исчезновение, если, конечно, не были предприняты особые усилия по их сохранению на диск.

Для работы с динамическими сборками используется пространство имён System.Reflection.Emit.

Emit – излучать, испускать, выпускать (деньги).

Это множество типов позволяет создавать и выполнять динамические сборки, а также ДОБАВЛЯТЬ НОВЫЕ типы и члены в загруженные в оперативную память сборки.

Пространство имен System.Reflection.Emit содержит классы, позволяющие компилятору или инструментальным средствам создавать метаданные и инструкции промежуточного языка MSIL и при необходимости формировать на диске PE-файл. Эти классы предназначены в первую очередь для обработчиков сценариев и компиляторов.

Список классов, структур и перечислений, входящих в пространство, прилагается.

Классы

Класс

Описание

AssemblyBuilder

Определяет и представляет динамическую сборку.

ConstructorBuilder

Определяет и представляет конструктор динамического класса.

CustomAttributeBuilder

Помогает в построении пользовательских атрибутов.

EnumBuilder

Описывает и предоставляет тип перечисления.

EventBuilder

Определяет события для класса.

FieldBuilder

Определяет и предоставляет поле. Этот класс не наследуется.

ILGenerator

Создает инструкции промежуточного языка MSIL.

LocalBuilder

Представляет локальную переменную внутри метода или конструктора.

MethodBuilder

Определяет и предоставляет метод (или конструктор) для динамического класса.

MethodRental

Позволяет быстро менять реализацию основного текста сообщения метода, задающего метод класса.

ModuleBuilder

Определяет и представляет модуль. Получает экземпляр класса ModuleBuilder с помощью вызова метода DefineDynamicModule.

OpCodes

Содержит поля, предоставляющие инструкции промежуточного языка MSIL для эмиссии членами класса ILGenerator (например, методом Emit).

ParameterBuilder

Создает или связывает информацию о параметрах.

PropertyBuilder

Определяет свойства для типа.

SignatureHelper

Обеспечивает методы построения подписей.

TypeBuilder

Определяет и создает новые экземпляры классов во время выполнения.

UnmanagedMarshal

Представляет класс, описывающий способ маршалирования поля из управляемого в неуправляемый код. Этот класс не наследуется.

Структуры

Структура

Описание

EventToken

Предоставляет Token, возвращаемый метаданными для представления события.

FieldToken

Структура FieldToken является объектным представлением лексемы, представляющей поле.

Label

Представляет метку в потоке инструкций. Label используется вместе с классом ILGenerator.

MethodToken

Структура MethodToken является объектным представлением лексемы, представляющей метод.

OpCode

Описывает инструкцию промежуточного языка MSIL.

ParameterToken

Структура ParameterToken является закрытым представлением возвращаемого метаданными лексемы, используемого для представления параметра.

PropertyToken

Структура PropertyToken является закрытым представлением возвращаемого метаданными маркера Token, используемого для представления свойства.

SignatureToken

Предоставляет Token, возвращенный метаданными для представления подписи.

StringToken

Предоставляет лексему, которая предоставляет строку.

TypeToken

Представляет маркер Token, который возвращается метаданными, чтобы представить тип.

Перечисления

Перечисление

Описание

AssemblyBuilderAccess

Определяет режимы доступа для динамической сборки.

FlowControl

Описывает, каким образом инструкция меняет поток команд управления.

OpCodeType

Описывает типы инструкций промежуточного языка MSIL.

OperandType

Описывает тип операнда инструкции промежуточного языка MSIL.

PackingSize

Задает один из двух факторов, определяющих выравнивание занимаемой полями памяти при маршаллинге типа.

PEFileKinds

Задает тип переносимого исполняемого PE-файла.

StackBehaviour

Описывает, как значения помещаются в стек или выводятся из стека.