Другим преимуществом многомодульных компоновочных блоков является то, что для них можно создавать модули на разных языках программирования .NET (что очень удобно в больших корпорациях, где разные подразделения могут отдавать предпочтение разным языкам .NET). После компиляции отдельных модулей эти модули можно логически "связать" в один компоновочный блок, используя, например, такой инструмент, как компоновщик (al.exe).
В любом случае следует понимать, что модули, которые образуют многомодульный компоновочный блок,
Рис. 11.4. Первичный модуль записывает информацию о вторичных модулях в манифест компоновочного блока
К этому моменту вы (я надеюсь) уже лучше понимаете внутреннюю структур двоичного файла .NET. Теперь "погрузимся" в обсуждение подробностей процесса построения и выбора конфигурации библиотек программного кода.
Создание и использование одномодульных компоновочных блоков
Чтобы инициировать процесс понимания компоновочных блоков .NET, мы с вами создадим одномодульный компоновочный блок *.dll (с именем CarLibrary), содержащий небольшой набор открытых типов. Чтобы построить библиотеку программного кода в Visual Studio 2005, выберите рабочую область Class Library (Библиотека классов) в окне Создания проектов (рис. 11.5).
Процесс разработки нашей библиотеки мы начнем с создания абстрактного базового класса Car (автомобиль), определяющего ряд защищенных членов-данных, доступных через пользовательские свойства.
Рис. 11.5. Создание библиотеки программного кода C#
Этот класс имеет один абстрактный метод TurboBoost(), в котором используется пользовательский перечень (EngineState), представляющий текущее состояние двигателя автомобиля.
using System;
namespace CarLibrary {
// Представляет состояние двигателя.
public enum EngineState { engineAlive, engineDead }
// Абстрактный базовый класс в данной иерархии.
public abstract class Car {
protected string petName;
protected short currSpeed;
protected short maxSpeed;
protected EngineState egnState = EngineState.engineAlive;
public abstract void TurboBoost();
public Car(){}
public Car(string name, short max, short curr) {
petName = name; maxSpeed = max; currSpeed = curr;
}
public string PetName {
get { return petName; }
set { petName = value; }
}
public short CurrSpeed {
get { return currSpeed; }
set { currSpeed = value; }
}
public short MaxSpeed { get { return maxSpeed; } }
public EngineState EngineState { get { return egnState; } }
}
}
Теперь предположим, что у вас есть два прямых "наследника" типа Car, имена которых MiniVan (минивэн) и SportsCar (спортивный автомобиль). Каждый из них подходящим образом переопределяет абстрактный метод TurboBoost().
using System;
using System.Windows.Forms;
namespace CarLibrary {
public class SportsCar: Car {
public SportsCar(){}
public SportsCar(string name, short max
public override void TurboBoost() {
MessageBox.Show("Скорость черепахи!", "Побыстрее бы…");
}
}
public class MiniVan: Car {
public MiniVan(){}
public MiniVan(string name, short max, short curr): base(name, max, curr){}
public override void TurboBoost() {
// Минивэн с турбонаддувом встретишь не часто!
egnState = EngineState.engineDead;
MessageBox.Show("Звoните в автосервис!", "Машина сломалась…");
}
}
}