Compartir a través de


Exponer objetos de proyecto

Los tipos de proyecto personalizados pueden proporcionar objetos de automatización para permitir el acceso al proyecto mediante interfaces de automatización. Se espera que todos los tipos de proyecto proporcionen el objeto de automatización estándar Project al que se tiene acceso desde Solution, que contiene una colección de todos los proyectos abiertos en el IDE. Se espera que un objeto al que se tenga acceso con un ProjectItem objeto que tenga acceso a cada elemento del proyecto sea expuesto por Project.ProjectItems. Además de estos objetos de automatización estándar, los proyectos pueden optar por ofrecer objetos de automatización específicos del proyecto.

Puede crear objetos de automatización de nivel raíz personalizados a los que puede tener acceso enlazado en tiempo de ejecución desde el objeto DTE raíz mediante DTE.<customObjectName> o DTE.GetObject("<customObjectName>"). Por ejemplo, Visual C++ crea una colección de proyectos específica del proyecto de C++ denominada VCProjects a las que puede acceder mediante DTE.VCProjects o DTE.GetObject("VCProjects"). También puede crear un Project.Object, que es único para el tipo de proyecto, un Project.CodeModel, que se puede consultar para su objeto más derivado, y un ProjectItem, que expone ProjectItem.Object y .ProjectItem.FileCodeModel

Es una convención común para que los proyectos expongan una colección de proyectos personalizada específica del proyecto. Por ejemplo, Visual C++ crea una colección de proyectos específica de C++ a la que puede acceder mediante DTE.VCProjects o DTE.GetObject("VCProjects"). También puede crear un Project.Object, que es único para el tipo de proyecto, un Project.CodeModel, que se puede consultar para su objeto más derivado, un ProjectItem, que expone ProjectItem.Objecty .ProjectItem.FileCodeModel

Para contribuir a un objeto específico de VSPackage para un proyecto

  1. Agregue las claves adecuadas al archivo .pkgdef de VSPackage.

    Por ejemplo, esta es la configuración .pkgdef para el proyecto de lenguaje C++:

    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation]
    "VCProjects"=""
    [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents]
    "VCProjectEngineEventsObject"=""
    
  2. Implemente el código en el GetAutomationObject método , como en el ejemplo siguiente.

    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;
    }
    

    En el código, g_wszAutomationProjects es el nombre de la colección de proyectos. El GetAutomationProjects método crea un objeto que implementa la Projects interfaz y devuelve un IDispatch puntero al objeto que realiza la llamada, como se muestra en el ejemplo de código siguiente.

    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);
    }
    

    Elija un nombre único para el objeto de automatización. Los conflictos de nombres son impredecibles y las colisiones provocan que un nombre de objeto en conflicto se produzca arbitrariamente si varios tipos de proyecto usan el mismo nombre. Debe incluir el nombre corporativo o algún aspecto único de su nombre de producto en el nombre del objeto de automatización.

    El objeto de colección personalizada Projects es un punto de entrada conveniente para la parte restante del modelo de automatización de proyectos. El objeto de proyecto también es accesible desde la colección de Solution proyectos. Después de crear las entradas de código y registro adecuadas que proporcionan a los consumidores Projects objetos de colección, la implementación debe proporcionar objetos estándar restantes para el modelo de proyecto. Para obtener más información, consulte Modelado de proyectos.