다음을 통해 공유


프로젝트 개체 노출

사용자 지정 프로젝트 형식은 자동화 인터페이스를 사용하여 프로젝트에 대한 액세스를 허용하기 위해 자동화 개체를 제공할 수 있습니다. 모든 프로젝트 형식은 IDE에서 열려 있는 모든 프로젝트의 컬렉션을 포함하는 Solution에서 액세스되는 표준 Project 자동화 개체를 제공해야 합니다. 프로젝트의 각 항목은 Project.ProjectItems을 사용하여 액세스되는 ProjectItem 개체에 의해 노출되어야 합니다. 이러한 표준 자동화 개체 외에도 프로젝트는 프로젝트별 자동화 개체를 제공하도록 선택할 수 있습니다.

DTE.<customObjectName> 또는 DTE.GetObject("<customObjectName>")를 사용하여 루트 DTE 개체에서 런타임에 바인딩되고 액세스할 수 있는 사용자 지정 루트 수준 자동화 개체를 만들 수 있습니다. 예를 들어 Visual C++는 DTE.VCProjects 또는 DTE.GetObject("VCProjects")를 사용하여 액세스할 수 있는 VCProjects라는 C++ 프로젝트별 프로젝트 컬렉션을 만듭니다. 프로젝트 형식에 대해 고유한 Project.Object, 가장 많이 파생된 개체에 대해 쿼리할 수 있는 Project.CodeModel, ProjectItem.ObjectProjectItem.FileCodeModel을 노출하는 ProjectItem을 만들 수도 있습니다.

프로젝트가 사용자 지정 프로젝트별 프로젝트 컬렉션을 노출하는 것은 일반적인 규칙입니다. 예를 들어 Visual C++는 DTE.VCProjects 또는 DTE.GetObject("VCProjects")를 사용하여 액세스할 수 있는 C++ 관련 프로젝트 컬렉션을 만듭니다. 프로젝트 형식에 대해 고유한 Project.Object, 가장 많이 파생된 개체에 대해 쿼리할 수 있는 Project.CodeModel, ProjectItem.ObjectProjectItem.FileCodeModel을 노출하는 ProjectItem을 만들 수도 있습니다.

프로젝트에 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);
    }
    

    자동화 개체의 고유한 이름을 선택합니다. 이름 충돌은 예측할 수 없으며 여러 프로젝트 형식이 동일한 이름을 사용하는 경우 충돌로 인해 충돌하는 개체 이름이 임의로 throw됩니다. 회사 이름 또는 제품 이름의 일부 고유한 측면을 자동화 개체의 이름에 포함해야 합니다.

    사용자 지정 Projects 컬렉션 개체는 프로젝트 자동화 모델의 나머지 부분에 대한 편리한 진입점입니다. 프로젝트 개체는 Solution 프로젝트 컬렉션에서도 액세스할 수 있습니다. 소비자에게 Projects 컬렉션 개체를 제공하는 적절한 코드 및 레지스트리 항목을 만든 후 구현은 프로젝트 모델에 대한 나머지 표준 개체를 제공해야 합니다. 자세한 내용은 프로젝트 모델링을 참조하세요.