Создание экземпляров проекта с помощью фабрик проекта
Типы проектов в Visual Studio используют фабрику проектов для создания экземпляров объектов проекта. Фабрика проектов аналогична стандартной фабрике классов для совместно созданных COM-объектов. Однако объекты проекта не являются совместно созданными; Их можно создать только с помощью фабрики проектов.
Среда разработки Visual Studio вызывает фабрику проектов, реализованную в VSPackage, когда пользователь загружает существующий проект или создает новый проект в Visual Studio. Новый объект проекта предоставляет интегрированной среде разработки достаточно сведений, чтобы заполнить Обозреватель решений. Новый объект проекта также предоставляет необходимые интерфейсы для поддержки всех соответствующих действий пользовательского интерфейса, инициированных интегрированной интегрированной среды разработки.
Интерфейс можно реализовать IVsProjectFactory в классе в проекте. Как правило, он находится в собственном модуле.
Проекты, поддерживающие агрегированную владельцем, должны сохранять ключ владельца в файле проекта. CreateProject При вызове метода в проекте с ключом владельца собственный проект преобразует ключ владельца в GUID фабрики проектов, а затем вызывает CreateProject
метод в этой фабрике проектов, чтобы выполнить фактическое создание.
Создание собственного проекта
Владелец создает собственный проект на двух этапах:
Вызывая PreCreateForOwner метод. Это позволяет собственному проекту создать объединенный объект проекта на основе управления входными данными
IUnknown
. Принадлежащий проект передает внутреннийIUnknown
и агрегированный объект обратно в проект владельца. Это дает собственный проект возможность хранить внутреннийIUnknown
.Вызывая InitializeForOwner метод. Принадлежащий проект выполняет все его экземпляры, если этот метод вызывается вместо вызова
IVsProjectFactory::CreateProject
, как и для проектов, которые не принадлежат. Перечисление входных данныхVSOWNEDPROJECTOBJECT
обычно является агрегированным проектом. Принадлежащий проект может использовать эту переменную для определения того, был ли его объект проекта уже создан (файл cookie не равен NULL) или должен быть создан (файл cookie равен NULL).Типы проектов идентифицируются уникальным ИДЕНТИФИКАТОРом GUID проекта, аналогичным CLSID объекта COM для совместного создания. Как правило, одна фабрика проектов обрабатывает создание экземпляров одного типа проекта, хотя у одной фабрики проектов может быть несколько GUID типа проекта.
Типы проектов связаны с определенным расширением имени файла. Когда пользователь пытается открыть существующий файл проекта или пытается создать новый проект путем клонирования шаблона, интегрированная среда разработки использует расширение в файле для определения соответствующего GUID проекта.
Как только интегрированная среда разработки определяет, должна ли она создать новый проект или открыть существующий проект определенного типа, интегрированная среда разработки использует сведения в системном реестре в разделе [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] , чтобы найти, какой VSPackage реализует требуемую фабрику проектов. Интегрированная среда разработки загружает этот VSPackage. В методе SetSite VSPackage должен зарегистрировать свою фабрику проектов в интегрированной среде разработки путем RegisterProjectType вызова метода.
Основным методом интерфейса является CreateProject, который должен обрабатывать два сценария: открытие существующего
IVsProjectFactory
проекта и создание нового проекта. Большинство проектов хранят состояние проекта в файле проекта. Как правило, новые проекты создаются путем создания копии файла шаблона, переданногоCreateProject
методу, а затем открытия копии. Существующие проекты создаются путем непосредственного открытия файла проекта, переданного методуCreateProject
. ПриCreateProject
необходимости метод может отображать дополнительные функции пользовательского интерфейса пользователю.Проект также не может использовать файлы и, вместо этого, хранить его состояние проекта в механизме хранения, отличном от файловой системы, например базы данных или веб-сервера. В этом случае параметр имени файла, переданный
CreateProject
методу, не является фактически путем файловой системы, а уникальной строкой — URL-адресом для идентификации данных проекта. Вам не нужно копировать файлы шаблона, передаваемые дляCreateProject
активации соответствующей последовательности построения для выполнения.