公开项目对象

适用范围:yesVisual Studio noVisual Studio for Mac noVisual Studio Code

自定义项目类型可以提供自动化对象,以允许使用自动化接口访问项目。 每个项目类型都应提供从 Solution访问的标准Project自动化对象,该对象包含 IDE 中打开的所有项目的集合。 项目中的每个项都应由 ProjectItem 使用 Project.ProjectItems访问的对象公开。 除了这些标准自动化对象之外,项目还可以选择提供特定于项目的自动化对象。

可以创建自定义根级自动化对象,这些对象可以使用 或 DTE.GetObject("<customObjectName>")从根 DTE 对象DTE.<customObjectName>访问后期绑定。 例如,Visual C++ 创建一个名为 VCProjects 的 C++ 项目特定项目集合,可以使用 或 DTE.GetObject("VCProjects")访问DTE.VCProjects该集合。 还可以创建一个 Project.Object,它对于项目类型是唯一的、一个 Project.CodeModel(可查询其派生最多的对象)和一个 ProjectItem公开 ProjectItem.Object 和 一个 ProjectItem.FileCodeModel

公开特定于项目的自定义项目集合是项目的常见约定。 例如,Visual C++ 创建一个特定于 C++ 的项目集合,然后可以使用 DTE.VCProjectsDTE.GetObject("VCProjects")进行访问。 还可以创建一个 Project.Object,它对于项目类型是唯一的,一个 ,一个 Project.CodeModel,可以查询其最派生的对象,一个 ProjectItem公开 ProjectItem.Object的 和 一个 ProjectItem.FileCodeModel

为项目贡献特定于 VSPackage 的对象

  1. 将适当的密钥添加到 VSPackage 的 .pkgdef 文件。

    例如,下面是 C++ 语言项目的 .pkgdef 设置:

    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation]
    "VCProjects"=""
    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents]
    "VCProjectEngineEventsObject"=""
    
  2. 在 方法中 GetAutomationObject 实现代码,如以下示例所示。

    STDMETHODIMP CVsPackage::GetAutomationObject(
    /* [in]  */ LPCOLESTR       pszPropName,
    /* [out] */ IDispatch **    ppIDispatch)
    {
    ExpectedPtrRet(pszPropName);
    ExpectedPtrRet(ppIDispatch);
    *ppIDispatch = NULL;
    
        if (m_fZombie)
            return E_UNEXPECTED;
    
        if (_wcsicmp(pszPropName, g_wszAutomationProjects) == 0)
        {
            return GetAutomationProjects(ppIDispatch);
        }
        else if (_wcsicmp(pszPropName, g_wszAutomationProjectsEvents) == 0)
        {
            return CAutomationEvents::GetAutomationEvents(ppIDispatch);
        }
        else if (_wcsicmp(pszPropName, g_wszAutomationProjectItemsEvents) == 0)
        {
            return CAutomationEvents::GetAutomationEvents(ppIDispatch);
        }
        return E_INVALIDARG;
    }
    

    在代码中, g_wszAutomationProjects 是项目集合的名称。 方法 GetAutomationProjects 创建实现 接口的 对象 Projects ,并返回指向 IDispatch 调用对象的指针,如以下代码示例所示。

    HRESULT CVsPackage::GetAutomationProjects(/* [out] */ IDispatch ** ppIDispatch)
    {
        ExpectedPtrRet(ppIDispatch);
        *ppIDispatch = NULL;
    
        if (!m_srpAutomationProjects)
        {
            HRESULT hr = CACProjects::CreateInstance(&m_srpAutomationProjects);
            IfFailRet(hr);
            ExpectedExprRet(m_srpAutomationProjects != NULL);
        }
        return m_srpAutomationProjects.CopyTo(ppIDispatch);
    }
    

    为自动化对象选择唯一名称。 名称冲突是不可预测的,如果多个项目类型使用相同的名称,冲突会导致任意抛出冲突的对象名称。 应在自动化对象的名称中包含公司名称或其产品名称的一些唯一方面。

    自定义 Projects 集合对象是项目自动化模型剩余部分的便捷入口点。 还可以从项目集合访问 Solution 项目对象。 创建为使用者 Projects 提供集合对象的相应代码和注册表项后,实现必须为项目模型提供剩余的标准对象。 有关详细信息,请参阅 项目建模

另请参阅