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.
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.
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.
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.
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.
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.
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.
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