Далее добавьте в проект
CSharpSnapIn
ссылку на проект
CommonSnappableTypes
. В среде Visual Studio щелкните правой кнопкой мыши на имени проекта
CSharpSnapIn
и выберите в контекстном меню пункт
Add►
Project Reference (Добавить►Ссылка на проект). В открывшемся диалоговом окне
Reference Manager (Диспетчер ссылок) выберите элемент
Projects►
Solution (Проекты►Решение) в левой части (если он еще не выбран) и отметьте флажок рядом с
CommonSnappableTypes
.
Повторите процесс для нового проекта библиотеки классов Visual Basic (VBSnapIn), которая ссылается на проект
CommonSnappableTypes
.
Наконец, добавьте к решению новый проект консольного приложения .NET Core по имени
MyExtendableApp
. Добавьте в него ссылку на проект
CommonSnappableTypes
и установите проект консольного приложения в качестве стартового для решения. Для этого щелкните правой кнопкой мыши на имени проекта
MyExtendableApp
в окне
Solution Explorer и выберите в контекстном меню пункт
Set as Startup Project (Установить как стартовый проект).
На заметку! Если вы щелкнете правой кнопкой мыши на имени решения
ExtendableApp
, а не на имени одного из проектов, то в контекстном меню отобразится пункт
Set Startup Projects (Установить стартовые проекты). Помимо запуска по щелчку на кнопке
Run (Запустить) только одного проекта можно настроить запуск множества проектов, что будет демонстрироваться позже в книге.
Установка зависимостей проектов при компиляции
Когда среде Visual Studio поступает команда запустить решение, стартовый проект и все проекты, на которые имеются ссылки, компилируются в случае обнаружения любых изменений; однако проекты, ссылки на которые отсутствуют, не компилируются. Положение дел можно изменить, устанавливая зависимости проектов. Для этого щелкните правой кнопкой мыши на имени решения в окне Solution Explorer, выберите в контекстном меню пункт Project Build Order (Порядок компиляции проектов), в открывшемся диалоговом окне перейдите на вкладку Dependencies (Зависимости) и в раскрывающемся списке Projects (Проекты) выберите
MyExtendableApp
.
Обратите внимание, что проект
CommonSnappableTypes
уже выбран и связанный с ним флажок отключен. Причина в том, что на него производится ссылка напрямую. Отметьте также флажки для проектов
CSharpSnapIn
и
VBSnapIn
(рис. 17.4).
Теперь при каждой компиляции проекта
MyExtendableApp
будут также компилироваться проекты
CSharpSnapIn
и
VBSnapIn
.
Добавление событий PostBuild
Откройте окно свойств проекта для
CSharpSnapIn
(щелкнув правой кнопкой мыши на имени проекта в окне
Solution Explorer и выбрав в контекстном меню пункт
Properties (Свойства)) и перейдите в нем на вкладку
Build Events (События при компиляции). Щелкните на кнопке
Edit Post-build (Редактировать события после компиляции) и затем щелкните на
Macros>> (Макросы). Здесь вы можете видеть доступные для использования макросы, которые ссылаются на пути и/или имена файлов. Преимущество применения этих макросов в событиях, связанных с компиляцией, заключается в том, что они не зависят от машины и работают с относительными путями. Скажем, кто-то работает в каталоге по имени
c-sharp-wf\code\chapterl7
. Вы можете работать в другом каталоге (вероятнее всего так и есть). За счет применения макросов инструмент MSBuild всегда будет использовать корректный путь относительно файлов
*.csproj
.
Введите в области PostBuild (После компиляции) следующие две строки:
copy $(TargetPath) $(SolutionDir)MyExtendableApp\$(OutDir)$(TargetFileName) /Y
copy $(TargetPath) $(SolutionDir)MyExtendableApp\$(TargetFileName) /Y
Сделайте то же самое для проекта
VBSnapin
, но здесь вкладка в окне свойств называется
Compile (Компиляция) и на ней понадобится щелкнуть на кнопке
Build Events (События при компиляции).
Когда показанные выше команды событий после компиляции добавлены, все сборки при каждой компиляции будут копироваться в каталог проекта и выходной каталог приложения
MyExtendableApp
.
Построение сборки CommonSnappableTypes.dll
Удалите стандартный файл класса
Class1.cs
из проекта
CommonSnappableTypes
, добавьте новый файл интерфейса по имени
AppFunctionality.cs
и поместите в него следующий код:
namespace CommonSnappableTypes
{
public interface IAppFunctionality
{
void DoIt();
}
}
Добавьте файл класса по имени
CompanyInfoAttribute.cs
и приведите его содержимое к такому виду:
using System;
namespace CommonSnappableTypes
{
[AttributeUsage(AttributeTargets.Class)]
public sealed class CompanyInfoAttribute : System.Attribute
{
public string CompanyName { get; set; }
public string CompanyUrl { get; set; }
}
}
Тип
IAppFunctionality
обеспечивает полиморфный интерфейс для всех оснасток, которые могут потребляться расширяемым приложением. Учитывая, что рассматриваемый пример является полностью иллюстративным, в интерфейсе определен единственный метод под названием
DoIt()
.
Тип
CompanyInfoAttribute
— это специальный атрибут, который может применяться к любому классу, желающему подключиться к контейнеру. Как несложно заметить по определению класса,
[CompanyInfо]
позволяет разработчику оснастки указывать общие сведения о месте происхождения компонента.
Построение оснастки на C#
Удалите стандартный файл
Class1.cs
из проекта
CSharpSnapIn
и добавьте новый файл по имени
CSharpModule.cs
. Поместите в него следующий код: