Книга: 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

Выполним проект. Должно получиться подобное изображение.


Оглавление книги

Оглавление статьи/книги

Генерация: 6.517. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз