Книга: C# для профессионалов. Том II
Загрузка сборки
Загрузка сборки
Завершая этот пример, покажем, как можно загрузить сборку во время выполнения, просмотреть сборку в поисках типов данных, которые являются произвольными из System.Windows.Forms.Control
, и добавить кнопки для каждого найденного типа данных.
Чтобы загрузить сборку нам понадобится URL. Добавим следующий код в Form1_Load
:
private void Form1_Load(object sender, System.EventArgs e) {
// при загрузке добавить тип кнопки ...
DataGrid grid = new DataGrid();
AddType(grid.GetType());
// найти имя нашей сборки
String filename = this.GetType().Module.Assembly.CodeBase;
Эта строка является обходной техникой для получения сборки, реализующей класс объекта, из которого вызывается код. В данном случае ее получают из URL сборки, содержащей Form1
.
Нам нужно при загрузке сборки использовать try…catch
, так как существуют процессы, которые могут пойти в этой процедуре неправильно. Мы используем общий метод на Assembly
:
// проверить и загрузить сборку ...
try {
// используем LoadFrom ...
Assembly controlAssembly = Assembly.LoadFrom(filename);
После получения сборки проверим в ней типы данных:
// теперь получим список типов данных ...
foreach(Type testType in controlAssembly.GetTypes()) {
Далее хитрость состоит том, чтобы создать экземпляр проверяемого типа данных, но преобразовать его в Control
. Так как все это погружено в другой блок try…catch
, то при переходе к следующей строке мы знаем, что имеется полностью квалифицированный элемент управления.
// попробуем создать экземпляр элемента управления
// и преобразовать его в элемент управления ...
try {
Control testControl = (Control)Activator.CreateInstance(testType);
Полезный совет. System.Windows.Forms.Form
является производным от Control
, так как он использует контейнеризацию свойств Control
для вывода элементов управления, нарисованных в форме. Если проверить свойство TopLevelControl
, оно всегда будет задано при выводе класса из формы.
// нам необходимо убедиться,
// что это не элемент управления "верхнего уровня" ...
if (testControl.TopLevelControl == null) {
// если мы здесь оказались, то это элемент управления ...
AddType(testType);
}
}
Мы можем завершить пример двумя обработчиками исключений:
catch {
// если мы здесь, мы не заботимся об объекте!
}
}
} catch(Exception ее) {
MessageBox.show("The assembly could not be loaded. " + ее.Message);
}
}
Прежде чем это проверить, необходимо поместить в проект другие элементы управления. Создадим первый класс, называемый DemoTextBox
, и добавим следующее предложение наследования:
public class DemoTextBox : System.Windows.Forms.TextBox
Теперь создадим другой класс, на этот раз с именем DemoMonthCalendar
, и добавим следующее предложение:
public class DemoMonthCalendar : System.Windows.Forms.MonthCalendar
Выполним проект. Должно получиться подобное изображение.
- Загрузка модулей Apache
- 3.2. Загрузка системы
- 3.2.1. Автозагрузка
- Загрузка файлов из Интернета
- Глава 3. Модель для сборки
- 5.5.2.3. Перезагрузка компьютера
- Механизм сборки мусора
- Сборки, существующие в нескольких версиях
- Автозагрузка с CD и настройка BIOS
- Загрузка сетевых драйверов
- Ситуация 2. Избыточная загрузка процессора
- Загрузка модулей