Поделиться через


Создание экземпляров проекта с помощью фабрик проекта

Типы проектов в Visual Studio используют фабрику проектов для создания экземпляров объектов проекта. Фабрика проектов аналогична стандартной фабрике классов для совместно созданных COM-объектов. Однако объекты проекта не являются совместно созданными; Их можно создать только с помощью фабрики проектов.

Среда разработки Visual Studio вызывает фабрику проектов, реализованную в VSPackage, когда пользователь загружает существующий проект или создает новый проект в Visual Studio. Новый объект проекта предоставляет интегрированной среде разработки достаточно сведений, чтобы заполнить Обозреватель решений. Новый объект проекта также предоставляет необходимые интерфейсы для поддержки всех соответствующих действий пользовательского интерфейса, инициированных интегрированной интегрированной среды разработки.

Интерфейс можно реализовать IVsProjectFactory в классе в проекте. Как правило, он находится в собственном модуле.

Проекты, поддерживающие агрегированную владельцем, должны сохранять ключ владельца в файле проекта. CreateProject При вызове метода в проекте с ключом владельца собственный проект преобразует ключ владельца в GUID фабрики проектов, а затем вызывает CreateProject метод в этой фабрике проектов, чтобы выполнить фактическое создание.

Создание собственного проекта

Владелец создает собственный проект на двух этапах:

  1. Вызывая PreCreateForOwner метод. Это позволяет собственному проекту создать объединенный объект проекта на основе управления входными данными IUnknown. Принадлежащий проект передает внутренний IUnknown и агрегированный объект обратно в проект владельца. Это дает собственный проект возможность хранить внутренний IUnknown.

  2. Вызывая 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 активации соответствующей последовательности построения для выполнения.