Partilhar via


Seqüência de inicialização do projeto subtipos

O ambiente constrói um projeto, chamando a implementação de fábrica do projeto base de CreateProject. A construção de um subtipo de projeto é iniciado quando o ambiente determina se a lista GUID de tipo de projeto para a extensão do arquivo de um projeto não está vazia. A extensão de arquivo de projeto e o GUID de projeto especificam se o projeto é um Visual Basic ou Visual C# tipo de projeto. Por exemplo, a extensão. vbproj e {F184B08F-C81C-45F6-A57F-5ABD9991F28F} identificar um Visual Basic project.

Inicialização do ambiente dos subtipos de projeto

O procedimento a seguir detalha a seqüência de inicialização para um sistema de projetos agregada por vários subtipos de projeto.

  1. O ambiente chama o projeto base CreateProject, e enquanto o projeto analisa seu arquivo de projeto, ele descobre que o tipo de projeto agregado a lista de GUIDs não é null. O projeto deixou de criar diretamente de seu projeto.

  2. As chamadas de projeto QueryService na SVsCreateAggregateProject o serviço para criar um subtipo de projeto usando a implementação do ambiente da CreateAggregateProject método. Dentro desse método, o ambiente faz chamadas de função recursiva suas implementações de PreCreateForOuter, M:Microsoft.VisualStudio.Shell.Interop.IVsAggregatableProject.SetInnerProject(System.Object) e InitializeForOuter métodos enquanto ele está orientando a lista de projeto tipo GUIDs, começando com o subtipo de projeto mais externo.

    A seguir detalha as etapas de inicialização.

    1. A implementação do ambiente da CreateAggregateProject chamadas de método HrCreateInnerProjmétodo com a declaração de função a seguir:

      HRESULT HrCreateInnerProj
      (
          WCHAR *pwszGuids,
          IUnknown *pOuter,
          IVsAggregatableProject *pOwner,
          LPCOLESTR pszFilename,
          LPCOLESTR pszLocation,
          LPCOLESTR pszName,
          VSCREATEPROJFLAGS grfCreateFlags,
          IUnknown **ppInner,
          BOOL *pfCancelled
      )
      

      Quando essa função é chamada pela primeira vez, ou seja, para o subtipo de projeto mais externa, os parâmetros pOuter e pOwner são passado como null e a função define o subtipo de projeto mais externo IUnknown para pOuter.

    2. Em seguida o ambiente chama HrCreateInnerProj função com o segundo tipo de projeto GUID na lista. Esse GUID corresponde ao segundo subtipo projeto interno stepping em direção ao projeto base na seqüência de agregação.

    3. O pOuter agora está apontando para o IUnknown do subtipo mais externa do projeto, e HrCreateInnerProj chama a implementação do PreCreateForOuter seguido de uma chamada para a implementação do SetInnerProject. Na PreCreateForOuter método que você passa o controle de IUnknown do subtipo mais externa do projeto, pOuter. O projeto pertencente (subtipo de projeto interno) necessita para criar o seu objeto de projeto de agregação aqui. No SetInnerProject implementação do método que você passar um ponteiro para o IUnknown do projeto interno que está sendo agregado. Esses dois métodos criam o objeto de agregação e suas implementações devem seguir as regras de agregação COM para garantir que um subtipo de projeto não acabar segurando uma contagem de referência a mesma.

    4. HrCreateInnerProjchama a sua implementação de PreCreateForOuter. Nesse método, o subtipo de projeto faz o seu trabalho de inicialização. Você pode, por exemplo, registrar eventos de solução em InitializeForOuter.

    5. HrCreateInnerProjé chamada recursivamente até que o último GUID (projeto base) na lista seja alcançado. Para cada uma dessas chamadas, as etapas c a d, são repetidas. pOuteraponta para o subtipo de projeto mais externo IUnknown para cada nível de agregação.

O exemplo a seguir detalha o processo através de programação em uma representação aproximado a CreateAggregateProject o método como ele é implementado pelo ambiente. O código é apenas um exemplo; ele não se destina a ser compilado e verificação de todos os erros foi removido para fins de esclarecimento.

Exemplo

Código

HRESULT CreateAggregateProject
(
    LPCOLESTR lpstrGuids, 
    LPCOLESTR pszFilename, 
    LPCOLESTR pszLocation,
    LPCOLESTR pszName, 
    VSCREATEPROJFLAGS grfCreateFlags, 
    REFIID iidProject, 
    void **ppvProject)
{
    HRESULT hr = NOERROR;
    CComPtr<IUnknown> srpunkProj;
    CComPtr<IVsAggregatableProject> srpAggProject;
    CComBSTR bstrGuids = lpstrGuids;
    BOOL fCanceled = FALSE;
    *ppvProject = NULL;

    HrCreateInnerProj(
         bstrGuids, NULL, NULL, pszFilename, pszLocation, 
         pszName, grfCreateFlags, &srpunkProj, &fCanceled);
    srpunkProj->QueryInterface(
        IID_IVsAggregatableProject, (void **)&srpAggProject));
    srpAggProject->OnAggregationComplete();
    srpunkProj->QueryInterface(iidProject, ppvProject);
}

HRESULT HrCreateInnerProj
(
    WCHAR *pwszGuids, 
    IUnknown *pOuter, 
    IVsAggregatableProject *pOwner, 
    LPCOLESTR pszFilename, 
    LPCOLESTR pszLocation,
    LPCOLESTR pszName, 
    VSCREATEPROJFLAGS grfCreateFlags, 
    IUnknown **ppInner, 
    BOOL *pfCanceled
)
{
    HRESULT hr = NOERROR;
    CComPtr<IUnknown> srpInner;
    CComPtr<IVsAggregatableProject> srpAggInner;
    CComPtr<IVsProjectFactory> srpProjectFactory;
    CComPtr<IVsAggregatableProjectFactory> srpAggPF;
    GUID guid = GUID_NULL;
    WCHAR *pwszNextGuids = wcschr(pwszGuids, L';');
    WCHAR wszText[_MAX_PATH+150] = L"";

    if (pwszNextGuids)
    {
        *pwszNextGuids++ = 0;
    }

    CLSIDFromString(pwszGuids, &guid);
    GetProjectTypeMgr()->HrGetProjectFactoryOfGuid(
        guid, &srpProjectFactory);
    srpProjectFactory->QueryInterface(
        IID_IVsAggregatableProjectFactory, 
        (void **)&srpAggPF);
    srpAggPF->PreCreateForOuter(pOuter, &srpInner);
    srpInner->QueryInterface(
        IID_IVsAggregatableProject, (void **)&srpAggInner);

    if (pOwner)
    {
        IfFailGo(pOwner->SetInnerProject(srpInner));
    }

    if (pwszNextGuids)
    {
        CComPtr<IUnknown> srpNextInner;
        HrCreateInnerProj(
            pwszNextGuids, pOuter ? pOuter : srpInner, 
            srpAggInner, pszFilename, pszLocation, pszName, 
            grfCreateFlags, &srpNextInner, pfCanceled);
    }

    return srpAggInner->InitializeForOuter(
        pszFilename, pszLocation, pszName, grfCreateFlags, 
        IID_IUnknown, (void **)ppInner, pfCanceled);
}

Consulte também

Referência

Microsoft.VisualStudio.Shell.Flavor

Outros recursos

Subtipos de projeto