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 предполагает использование
Создание расширяемого приложения Windows Forms
Заключительным шагом будет создание приложения Windows Forms, которое позволит пользователю выбрать подключаемый блок с помощью стандартного диалогового окна открытия файла Windows. Создав новое приложение Windows Forms (с именем MyExtendableApp), добавите ссылку на компоновочный блок CommonSnappableTypes.dll, но