Загрузка сборки

Завершая этот пример, покажем, как можно загрузить сборку во время выполнения, просмотреть сборку в поисках типов данных, которые являются произвольными из 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

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

Заключение

Из этой статьи мы узнали, как динамически создавать элементы управления и добавлять их в форму. Мы ввели новый класс, производный от System.Window.Forms.Button, который позволяет добавлять дополнительною функциональность и свойства кнопке. Мы увидели также, как соединить с новыми элементами управления методы, вызываемые при инициировании событий. Наконец, мы проверили возможность просмотра сборки в поисках классов и использовали изученную технику для создания простой утилиты, которая загружается и выводит эти классы по команде пользователя.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату