共用方式為


公開專案物件

自訂專案類型可以提供自動化物件,以允許使用自動化介面存取專案。 每個專案類型都預期會提供從 Solution 存取的標準 Project 自動化物件,其中包含在 IDE 中開啟之所有專案的集合。 專案中的每個項目都應該由使用 Project.ProjectItems 存取的 ProjectItem 物件公開。 除了這些標準自動化物件之外,專案還可以選擇提供專案特定的自動化物件。

您可以建立自訂根層級自動化物件,以使用 DTE.<customObjectName>DTE.GetObject("<customObjectName>") 從根 DTE 物件存取晚期繫。 例如,Visual C++ 會建立名為 VCProjects 的 C++ 專案特定專案集合,您可以使用 DTE.VCProjectsDTE.GetObject("VCProjects") 存取專案集合。 您還可以建立對於專案類型來說是唯一的 Project.Object、可以查詢其最高衍生物件的 Project.CodeModel 以及 ProjectItem (公開 ProjectItem.ObjectProjectItem.FileCodeModel)。

專案通常公開自訂的、特定於專案的專案集合。 例如,Visual C++ 會建立 C++ 特定的專案集合,然後您可以使用 或 DTE.VCProjectsDTE.GetObject("VCProjects") 來存取。 您還可以建立對於專案類型來說是唯一的 Project.Object、可以查詢其最高衍生物件的 Project.CodeModelProjectItem (公開 ProjectItem.ObjectProjectItem.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 集合物件的適當程式碼和登錄項目後,您的實作必須為專案模型提供其餘的標準物件。 如需詳細資訊,請參閱專案模型化