使用项目工厂创建项目实例

Visual Studio 中的项目类型使用 项目工厂 创建项目对象的实例。 项目工厂类似于可共同创建 COM 对象的标准类工厂。 但是,项目对象不可共同创建;只能使用项目工厂创建它们。

当用户加载现有项目或在 Visual Studio 中创建新项目时,Visual Studio IDE 调用 VSPackage 中实现的项目工厂。 新项目对象为 IDE 提供了足够的信息来填充解决方案资源管理器。 新项目对象还提供支持 IDE 启动的所有相关 UI 操作所需的接口。

可以在项目中的类中实现 IVsProjectFactory 接口。 通常,它驻留在其自己的模块中。

支持由所有者聚合的项目必须在其项目文件中保留所有者密钥。 CreateProject在具有所有者密钥的项目上调用该方法时,拥有的项目会将其所有者密钥转换为项目工厂 GUID,然后调用CreateProject此项目工厂上的方法以执行实际创建。

创建拥有的项目

所有者在两个阶段中创建拥有的项目:

  1. 通过调用 PreCreateForOwner 方法。 这使拥有的项目有机会基于输入控制 IUnknown创建聚合项目对象。 拥有的项目将内部 IUnknown 对象和聚合对象传递回所有者项目。 这使拥有的项目有机会存储内部 IUnknown

  2. 通过调用 InitializeForOwner 方法。 当调用此方法而不是调用 IVsProjectFactory::CreateProject 时,拥有的项目将执行其所有实例化,而对于不属于拥有的项目,则其实例化方式也会如此。 输入 VSOWNEDPROJECTOBJECT 枚举通常是聚合拥有的项目。 拥有的项目可以使用此变量来确定其项目对象是否已创建(cookie 不等于 NULL),还是必须创建(cookie 等于 NULL)。

    项目类型由唯一的项目 GUID 标识,类似于可共同创建 COM 对象的 CLSID。 通常,一个项目工厂处理创建单个项目类型的实例,尽管可以让一个项目工厂处理多个项目类型 GUID。

    项目类型与特定文件扩展名相关联。 当用户尝试打开现有项目文件或尝试通过克隆模板创建新项目时,IDE 将使用该文件上的扩展来确定相应的项目 GUID。

    只要 IDE 确定它必须创建新项目还是打开特定类型的现有项目,IDE 就会使用 [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Projects] 下的系统注册表中的信息来查找哪个 VSPackage 实现了所需的项目工厂。 IDE 加载此 VSPackage。 在 SetSite 方法中,VSPackage 必须通过调用 RegisterProjectType 该方法向 IDE 注册其项目工厂。

    接口CreateProject的主要方法是IVsProjectFactory处理两种方案:打开现有项目并创建新项目。 大多数项目将其项目状态存储在项目文件中。 通常,通过创建传递给 CreateProject 方法的模板文件的副本,然后打开副本来创建新项目。 通过直接打开传递给 CreateProject 方法的项目文件来实例化现有项目。 该方法 CreateProject 可以根据需要向用户显示其他 UI 功能。

    项目还可以不使用任何文件,而是将其项目状态存储在文件系统以外的存储机制中,例如数据库或 Web 服务器。 在这种情况下,传递给 CreateProject 该方法的文件名参数实际上不是文件系统路径,而是用于标识项目数据的唯一字符串(URL)。 无需复制传递给 CreateProject 以触发要执行的相应构造序列的模板文件。