Вот еще один пример. Вы предложили первую версию (1.0.0.0) компоновочного блока, свободного от всяких дефектов, но после месяца-двух его эксплуатации вы добавили в компоновочный блок новые функциональные возможности, позволяющие перейти к версии 2.0.0.0, Очевидно, существующие приложения клиента, которые были скомпилированы в условиях существования только версии 1.0.0.0, не имеют никакого "представления" о новых типах, так что их базовый программный код на эти новые типы не ссылается.

Предполагается, что новые приложения-клиенты будут использовать новые функциональные возможности версии 2.0.0.0. В рамках платформы .NET вы имеете возможность отправить версию 2.0.0.0 на целевые машины, чтобы эта новая версия работала вместе с более "старой" версией 1.0.0.0. Если необходимо, существующие клиенты могут динамически перенаправляться на загрузку версии 2.0.0.0 (чтобы получить доступ к ее новым, более совершенным возможностям) с помощью) файла конфигурации приложения, тоже без повторной компиляции и переустановки приложения-клиента.

<p>Фиксация версии общедоступного компоновочного блока</p>

Чтобы показать, как осуществляется динамическая привязка к конкретной версии общедоступного компоновочного блока, откроите программу Проводник Windows в скопируйте текущую версию CarLibrary (1.0.0.0) в другой подкаталог (здесь для него выбрано название "Версия 1") корневой папки проекта, чтобы зафиксировать эту версию (рис. 11.24).

Рис. 11.24. Фиксация текущей версии CarLibrary dll

<p>Создание общедоступного компоновочного блока версии 2.0.0.0</p>

Теперь обновите свой проект CarLibrary, добавив в него определение нового перечня MusicMedia, определяющего четыре возможных музыкальных устройства.

// Содержит информацию об источнике музыки.

public enum MusicMedia {

 musicCd,

 musicTape,

 musicRadio,

 musicMp3

}

Также добавьте для типа Car новый открытый метод, который позволит вызывающей стороне включить один из имеющихся проигрывателей.

public abstract class Car {

 …

 public void TurnOnRadio(bool musicOn, MusicMedia mm) {

  if (musicOn) MessageBox.Show(string.Format("Шум {0}", mm));

  else MessageBox.Show("И тишина…");

 }

 …

}

Измените конструкторы класса Car, чтобы отображалось окно MessageBox, в котором подтверждается использование CarLibrary именно версии 2.0.0.0.

public abstract class Car {

 …

 public Car {

  MessageBox.Show("Car 2.0.0.0");

 }

 public Car(string name, short max, short curr) {

  MessageBox.Show("Car 2.0.0.0");

  petName = name; maxSpeed = max; currSpeed = curr;

 }

 …

}

Наконец, до начала новой компиляции не забудьте изменить значение версии этого компоновочного блока на 2.0.0.0 с помощью изменения значения, передаваемого атрибуту [AssemblyVersion].

// CarLibrary версии 2.0.0.0 (теперь с музыкой!).

[assembly: Assembly-Version("2.0.0.0"]

Если вы теперь заглянете в папку \Bin\Debug проекта, то увидите, что там присутствует новая версия компоновочного блока (2.0.0.0), в то время как версия 1.0.0.0 в полной безопасности хранится в подкаталоге Версия 1. Установите этот новый компоновочный блок в папку GAC в соответствии с инструкциями, предложенными в этой главе выше. Обратите внимание на то, что теперь вы будете иметь две версии одного и того же компоновочного блока (рис. 11.25).

Рис. 11.25. Параллельное выполнение

Если теперь в программе Проводник Windows выполнить имеющуюся программу SharedCarLibClient.exe с помощью двойного щелчка на ее пиктограмме, вы не увидите окно с сообщением "Саr 2.0.0.0", поскольку соответствующий манифест специально запрашивает версию 1.0.0.0. Так как же тогда дать указание среде CLR о том, чтобы среда выполнила привязку к версии 2.0.0.0? Я рад, что вы об этом спрашиваете.

<p>Динамическая привязка к конкретной версии компоновочного блока</p>
Перейти на страницу:

Похожие книги