Expor objetos de projeto
Tipos de projeto personalizados podem fornecer objetos de automação para permitir o acesso ao projeto usando interfaces de automação. Espera-se que cada tipo de projeto forneça o objeto de automação padrão Project que é acessado a partir do , que contém uma coleção de Solutiontodos os projetos que estão abertos no IDE. Espera-se que cada item no projeto seja exposto por um ProjectItem objeto acessado com Project.ProjectItems
. Além desses objetos de automação padrão, os projetos podem optar por oferecer objetos de automação específicos do projeto.
Você pode criar objetos de automação de nível raiz personalizados que podem ser acessados tardiamente a partir do objeto DTE raiz usando DTE.<customObjectName>
ou DTE.GetObject("<customObjectName>")
. Por exemplo, o Visual C++ cria uma coleção de projeto específico do projeto C++ chamada VCProjects que você pode acessar usando DTE.VCProjects
ou DTE.GetObject("VCProjects")
. Você também pode criar um , que é exclusivo para o tipo de projeto, um , que pode ser consultado para seu objeto mais derivado e um , que expõe e um Project.Object
ProjectItem.FileCodeModel
Project.CodeModel
ProjectItem
.ProjectItem.Object
É uma convenção comum para projetos expor uma coleção de projeto personalizada e específica do projeto. Por exemplo, o Visual C++ cria uma coleção de projeto específica do C++ que você pode acessar usando DTE.VCProjects
ou DTE.GetObject("VCProjects")
. Você também pode criar um , que é exclusivo para o tipo de projeto, um , que pode ser consultado para seu objeto mais derivado, um , que expõe e um Project.Object
ProjectItem.FileCodeModel
Project.CodeModel
ProjectItem
.ProjectItem.Object
Para contribuir com um objeto específico do VSPackage para um projeto
Adicione as chaves apropriadas ao arquivo .pkgdef do seu VSPackage.
Por exemplo, aqui estão as configurações .pkgdef para o projeto de linguagem C++:
[$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\Automation] "VCProjects"="" [$RootKey$\Packages\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\AutomationEvents] "VCProjectEngineEventsObject"=""
Implemente o GetAutomationObject código no método, como no exemplo a seguir.
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; }
No código,
g_wszAutomationProjects
é o nome da sua coleção de projetos. OGetAutomationProjects
método cria um objeto que implementa a interface e retorna umIDispatch
ponteiro para o objeto de chamada, conforme mostrado no exemplo de código aProjects
seguir.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); }
Escolha um nome exclusivo para seu objeto de automação. Os conflitos de nome são imprevisíveis e as colisões fazem com que um nome de objeto conflitante seja arbitrariamente descartado se vários tipos de projeto usarem o mesmo nome. Você deve incluir seu nome corporativo ou algum aspecto exclusivo do nome do produto no nome do objeto de automação.
O objeto de coleção personalizado
Projects
é um ponto de entrada conveniente para a parte restante do modelo de automação do projeto. Seu objeto de projeto também é acessível a partir da coleção de Solution projeto. Depois de criar o código apropriado e as entradas do Registro que fornecem aos consumidoresProjects
objetos de coleção, sua implementação deve fornecer objetos padrão restantes para o modelo de projeto. Para obter mais informações, consulte Modelagem de projeto.