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

Разбор полётов

В приведённом выше примере демонстрируется техника ПОЗДНЕГО СВЯЗЫВАНИЯ. Именно поэтому код, который выполняется после загрузки сборки не содержит в явном виде информации об используемых в приложении типах. Транслятор действует в строгом соответствии с синтаксисом языка C# и просто не поймёт пожелания “создать объект-представитель класса … который будет объявлен в сборке, которую предполагается загрузить в ходе выполнения приложения”.

Класс System.Activator

Класс Activator - главное средство, обеспечивающее позднее связывание.

Содержит методы, позволяющие создавать объекты на основе информации о типах, получаемой непосредственно в ходе выполнения приложения, а также получать ссылки на существующие объекты. Далее приводится список перегруженных статических методов класса:

  • CreateComInstanceFrom. Создаёт экземпляр COM объекта.

  • CreateInstance. Создаёт объект-представитель specified типа, используя при этом наиболее подходящий по списку параметров конструктор (best matches the specified parameters).

Пример

ObjectHandle hdlSample;

IMyExtenderInterface myExtenderInterface;

string argOne = “Value of argOne”;

int argTwo = 7;

object[] args = {argOne, argTwo};

// Uses the UrlAttribute to create a remote object.

object[] activationAttributes =

{new UrlAttribute(“http://localhost:9000/MySampleService”)};

// Activates an object for this client.

// You must supply a valid fully qualified assembly name here.

hdlSample = Activator.CreateInstance(

“Assembly text name, Version, Culture, PublicKeyToken”,

“samplenamespace.sampleclass”,

true,

BindingFlags.Instance|BindingFlags.Public,

null,

args,

null,

activationAttributes,

null);

myExtenderInterface = (IMyExtenderInterface)hdlSample.Unwrap();

Console.WriteLine(myExtenderInterface.SampleMethod(“Bill”));

  • CreateInstanceFrom. Создаёт объект-представитель типа, специфицированного по имени. Имя специфицируется на основе имени сборки. При этом используется подходящий по списку параметров конструктор (the constructor that best matches the specified parameters).

Пример

ObjectHandle hdlSample;

IMyExtenderInterface myExtenderInterface;

object[] activationAttributes = {new SynchronizationAttribute()};

// Assumes that SampleAssembly.dll exists in the same directory as this assembly.

hdlSample = Activator.CreateInstanceFrom(

“SampleAssembly.dll”,

“SampleNamespace.SampleClass”,

activationAttributes);

// Assumes that the SampleClass implements an interface provided by

// this application.

myExtenderInterface = (IMyExtenderInterface)hdlSample.Unwrap();

Console.WriteLine(myExtenderInterface.SampleMethod(“Bill”));

  • GetObject - Overloaded. Создает прокси (заместителя, представителя) для непосредственного запуска активизированного сервером объекта или XML сервиса.

Сборка может быть вызвана непосредственно по имени (строковый литерал с дружественным именем сборки).

Ничего особенного. Просто имя без всяких там расширений. Главная проблема заключается в том, частные сборки должны предварительно включаться в раздел References (Ссылки).

Кроме того, информация о загружаемой сборке может быть представлена в виде объекта - представителя класса AssemblyName, ссылка на который также может быть передана в качестве аргумента методу Assembly.Load().