Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Создание CommonSnappableTypes.Dll

Первой нашей задачей является создание компоновочного блока, содержащего типы, которые должен использовать каждый подключаемый модуль, чтобы обеспечить возможность его подключения к нашему приложению Windows Forms. Проект библиотеки классов CommonSnappableTypes определяет следующие два типа.

namespace CommonSnappableTypes {

 public interface IAppFunctionality {

  void DoIt();

 }

 [AttributeUsage(AttribyteTargets.Class)]

 public sealed class CompanyInfoAttribute: System.Attribute

  private string companyName;

  private string companyUrl;

  public CompanyInfoAttribute(){}

  public string Name {

   get { return companyName; }

   set { companyName = value; }

  }

  public string Url {

   get { return companyUrl; }

   set { companyUrl = value; }

  }

 }

}

Интерфейс IAppFunctionality обеспечивает полиморфные возможности для всех подключаемых модулей, которые может принять наше расширяемое приложение Windows Forms. Наш пример является исключительно иллюстративным, поэтому здесь интерфейс предлагает единственный метод, DoIt(). В реальности это может быть интерфейс (или набор интерфейсов), позволяющий подключаемому объекту сгенерировать программный код сценария, поместить пиктограмму в окно инструментов или интегрироваться в главное меню приложения.

Тип CompanyInfoAttribute является пользовательским атрибутом, который будет применяться к любому типу класса, размещаемому в контейнере. Исходя из определения этого класса, можно утверждать, что [CompanyInfo] позволяет разработчику расширения сообщить информацию о происхождении подключаемого компонента.

Создание подключаемого компонента в c#

Теперь нужно создать тип, реализующий интерфейс IAppFunctionality. Снова, чтобы сосредоточиться на процессе создания расширяемого приложения, здесь предполагается создание самого простого типа. Мы построим библиотеку программного кода C# с именем CSharpSnapIn, которая определит тип класса с именем CSharpModule. Поскольку этот класс должен использовать типы, определенные в CommonSnappableTypes, нам придется установить ссылку на соответствующий двоичный файл (а также на System.Windows.Forms.dll, чтобы выводить необходимые сообщения). С учетом сказанного предлагается использовать следующий программный код.

using System;

using CommonSnappableTypes;

using System.Windows.Forms;

namespace CSharpSnapIn {

 [CompanyInfo(Name = "Intertech Training",

  Url = www.intertechtraining.com)]

 public class TheCSharpModule: IAppFunctionality {

  void IAppFunctionality.DoIt() {

   MessageBox.Show("Вы только что подключили блок C#!");

  }

 }

}

Обратите внимание на то, что здесь используется явная реализация интерфейса IAppFunctionality. Это не обязательно, но идея в том, что единственной частью системы, которой понадобится непосредственное взаимодействие с этим. типом интерфейса, является наше расширяемое приложение Windows.

Создание подключаемого компонента в Visual Basic .Net

Теперь, чтобы имитировать стороннего производителя, предпочитающего использовать не C#, a Visual Basic .NET, создадим в Visual Basic .NET новую библиотеку программного кода (VbNetSnapIn), которая будет ссылаться на те же внешние компоновочные блоки, что и CSharpSnapIn. Программный код (снова) будет пред-намерено очень простым.

Imports System.Windows.Forms

Imports CommonSnappableTypes

‹CompanyInfo(Name:="Chucky's Software", Url:="‹www.ChuckySoft.com")› _

Public Class VbNetSnapIn Implements IAppFunctionality

 Public Sub DoIt() Implements CommonSnappableTypes.IAppFunctionality.DoIt

  MessageBox.Show("Вы только что подключили блок VB .NET!")

 End Sub

End Class

Говорить здесь особенно не о чем. Однако обратите внимание на то, что синтаксис применения атрибутов в Visual Basic .NET предполагает использование угловых (‹›), а не квадратных ([]) скобок.