уже выбран и связанный с ним флажок отключен. Причина в том, что на него производится ссылка напрямую. Отметьте также флажки для проектов
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 (После компиляции) следующие две строки:
, но здесь вкладка в окне свойств называется 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о]
позволяет разработчику оснастки указывать общие сведения о месте происхождения компонента.
Console.WriteLine("You have just used the C# snap-in!");
}
}
}
Обратите внимание на явную реализацию интерфейса
IAppFunctionality
(см. главу 8). Поступать так необязательно; тем не менее, идея заключается в том, что единственной частью системы, которая нуждается в прямом взаимодействии с упомянутым интерфейсным типом, будет размещающее приложение. Благодаря явной реализации интерфейса