Geração de novo projeto: Bastidores, parte um
Já pensou em como criar seu próprio tipo de projeto? Quer saber o que realmente acontece quando você cria um novo projeto? Vamos dar uma espiada debaixo do capô e ver o que realmente está acontecendo.
Há várias tarefas que o Visual Studio coordena para você:
Ele exibe uma árvore de todos os tipos de projeto disponíveis.
Ele exibe uma lista de modelos de aplicativo para cada tipo de projeto e permite que você escolha um.
Ele coleta informações do projeto para o aplicativo, como nome e caminho do projeto.
Ele passa essas informações para a fábrica do projeto.
Ele gera itens de projeto e pastas na solução atual.
A caixa de diálogo Novo Projeto
Tudo começa quando você seleciona um tipo de projeto para um novo projeto. Vamos começar clicando em Novo Projeto no menu Arquivo . A caixa de diálogo Novo Projeto é exibida, com a seguinte aparência:
Vamos analisar com mais detalhes. A árvore Tipos de projeto lista os vários tipos de projeto que você pode criar. Quando você seleciona um tipo de projeto como Visual C# Windows, você verá uma lista de modelos de aplicativo para você começar. Os modelos instalados do Visual Studio são instalados pelo Visual Studio e estão disponíveis para qualquer usuário do seu computador. Novos modelos que você cria ou coleta podem ser adicionados a Meus Modelos e estão disponíveis apenas para você.
Quando você seleciona um modelo como Aplicativo do Windows, uma descrição do tipo de aplicativo aparece na caixa de diálogo, neste caso, Um projeto para criar um aplicativo com uma interface de usuário do Windows.
Na parte inferior da caixa de diálogo Novo Projeto , você verá vários controles que reúnem mais informações. Os controles exibidos dependem do tipo de projeto, mas geralmente incluem uma caixa de texto Nome do projeto, uma caixa de texto Local e o botão Procurar relacionado, uma caixa de texto Nome da Solução e uma caixa de seleção Criar diretório para solução relacionada.
Preenchendo a caixa de diálogo Novo Projeto
De onde a caixa de diálogo Novo Projeto obtém suas informações? Há dois mecanismos em ação aqui, um deles preterido. A caixa de diálogo Novo Projeto combina e exibe as informações obtidas de ambos os mecanismos.
O método mais antigo (preterido) usa entradas do Registro do sistema e arquivos .vsdir. Esse mecanismo é executado quando o Visual Studio aberto. O método mais recente usa arquivos .vstemplate. Esse mecanismo é executado quando o Visual Studio é inicializado, por exemplo, executando
devenv /setup
or
devenv /installvstemplates
Tipos de projeto
A posição e os nomes dos nós raiz dos tipos de projeto, como Visual C# e Outras Linguagens, são determinados pelas entradas do Registro do sistema. A organização dos nós filho, como Banco de Dados e Dispositivo Inteligente, espelha a hierarquia das pastas que contêm os arquivos .vstemplate correspondentes. Vamos examinar os nós raiz primeiro.
Nós raiz do tipo de projeto
Quando o Visual Studio é inicializado, ele atravessa as subchaves da chave do Registro do sistema HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs para criar e nomear os nós raiz da árvore de tipos de projeto. Essas informações são armazenadas em cache para uso posterior. Observe a chave TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1. Cada entrada é um GUID VSPackage. O nome da subchave (/1) é ignorado, mas sua presença indica que este é um nó raiz de tipos de projeto. Um nó raiz pode, por sua vez, ter várias subchaves que controlam sua aparência na árvore de tipos de projeto. Vejamos algumas delas.
(Padrão)
Essa é a ID do recurso da cadeia de caracteres localizada que nomeia o nó raiz. O recurso de cadeia de caracteres está localizado na DLL satélite selecionada pelo GUID VSPackage.
No exemplo, o GUID VSPackage é
{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
e o ID do recurso (valor padrão) do nó raiz (/1) é #2345
Se você procurar o GUID na chave Packages próxima e examinar a subchave SatelliteDll, poderá encontrar o caminho do assembly que contém o recurso de cadeia de caracteres:
<Caminho> de instalação do Visual Studio\VC#\VCSPackages\1033\csprojui.dll
Para verificar isso, abra o Explorador de Arquivos e arraste csprojui.dll para o diretório do Visual Studio.. A tabela de cadeia de caracteres mostra que o recurso #2345 tem a legenda Visual C#.
SortPriority
Isso determina a posição do nó raiz na árvore de tipos de projeto.
REG_DWORD 0x00000014 SortPriority (20)
Quanto menor o número da prioridade, maior a posição na árvore.
Atividade do desenvolvedor
Se essa subchave estiver presente, a posição do nó raiz será controlada pela caixa de diálogo Configurações do desenvolvedor. Por exemplo,
DeveloperActivity REG_SZ VC#
indica que o Visual C# será um nó raiz se o Visual Studio estiver definido para o desenvolvimento do Visual C++. Caso contrário, será um nó filho de Outros Idiomas.
Pasta
Se essa subchave estiver presente, o nó raiz se tornará um nó filho da pasta especificada. Uma lista de possíveis pastas aparece sob a chave
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders
Por exemplo, a entrada Projetos de Banco de Dados tem uma chave Pasta que corresponde à entrada Outros Tipos de Projeto em PseudoPastas. Portanto, na árvore Tipos de projeto, Projetos de banco de dados será um nó filho de Outros tipos de projeto.
Tipo de projeto: nós filho e arquivos .vstdir
A posição dos nós filho na árvore Tipos de projeto segue a hierarquia das pastas nas pastas ProjectTemplates. Para modelos de máquina (modelos instalados do Visual Studio), o local típico é \Arquivos de Programas\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\ e para modelos de usuário (Meus modelos), o local típico é \Meus Documentos\Visual Studio 14.0\Templates\ProjectTemplates\. As hierarquias de pasta desses dois locais são mescladas para criar a árvore de tipos de projeto.
Para configurações de desenvolvedor do Visual Studio com C#, a árvore de tipos de projeto tem a seguinte aparência:
A pasta ProjectTemplates correspondente tem esta aparência:
Quando a caixa de diálogo Novo Projeto é aberta, o Visual Studio atravessa a pasta ProjectTemplates e recria sua estrutura na árvore de tipos de projeto com algumas alterações:
O nó raiz na árvore de tipos de projeto é determinado pelo modelo de aplicativo.
O nome do nó pode ser localizado e pode conter caracteres especiais.
A ordem de classificação pode ser alterada.
Localizando o nó raiz de um tipo de projeto
Quando o Visual Studio atravessa as pastas ProjectTemplates, ele abre todos os arquivos .zip e extrai todos os arquivos .vstemplate. Um arquivo .vstemplate usa XML para descrever um modelo de aplicativo. Para obter mais informações, consulte Nova geração de projeto: sob o capô, parte dois.
A <marca ProjectType> determina o tipo de projeto para o aplicativo. Por exemplo, o arquivo \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip contém um arquivo EmptyProject.vstemplate que tem esta marca:
<ProjectType>CSharp</ProjectType>
A <marca ProjectType> , e não a subpasta na pasta ProjectTemplates, determina o nó raiz de um aplicativo na árvore de tipos de projeto. No exemplo, os aplicativos do Windows CE apareceriam no nó raiz do Visual C# e, mesmo se você fosse mover a pasta WindowsCE para a pasta VisualBasic, os aplicativos do Windows CE ainda apareceriam no nó raiz do Visual C#.
Localizando o nome do nó
Quando o Visual Studio atravessa as pastas ProjectTemplates, ele examina todos os arquivos .vstdir que encontrar. Um arquivo .vstdir é um arquivo XML que controla a aparência do tipo de projeto na caixa de diálogo Novo projeto . No arquivo .vstdir, use a <marca LocalizedName> para nomear o nó Tipos de projeto.
Por exemplo, o arquivo \CSharp\Database\TemplateIndex.vstdir contém essa marca:
<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>
Isso determina a DLL satélite e a ID do recurso da cadeia de caracteres localizada que nomeia o nó raiz, neste caso, Banco de Dados. O nome localizado pode conter caracteres especiais que não estão disponíveis para nomes de pasta, como .NET.
Se nenhuma <marca LocalizedName> estiver presente, o tipo de projeto será nomeado pela própria pasta, SmartPhone2003.
Localizando a ordem de classificação para um tipo de projeto
Para determinar a ordem de classificação do tipo de projeto, os arquivos .vstdir usam a <marca SortOrder> .
Por exemplo, o arquivo \CSharp\Windows\Windows.vstdir contém essa marca:
<SortOrder>5</SortOrder>
O arquivo \CSharp\Database\TemplateIndex.vstdir tem uma marca com um valor maior:
<SortOrder>5000</SortOrder>
Quanto menor o número na marca SortOrder>, maior a posição na árvore, de modo que o nó do Windows aparece mais alto do que o nó Banco de dados na <árvore Tipos de projeto.
Se nenhuma <marca SortOrder> for especificada para um tipo de projeto, ela aparecerá em ordem alfabética após qualquer tipo de projeto que contenha <especificações SortOrder> .
Observe que não há arquivos .vstdir nas pastas Meus Documentos (Meus Modelos). Os nomes de tipo de projeto de aplicativo de usuário não são localizados e aparecem em ordem alfabética.
Uma Revisão Rápida
Vamos modificar a caixa de diálogo Novo Projeto e criar um novo modelo de projeto de usuário.
Adicione uma subpasta MyProjectNode à pasta \Arquivos de Programas\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp.
Crie um arquivo MyProject.vstdir na pasta MyProjectNode usando qualquer editor de texto.
Adicione estas linhas ao arquivo .vstdir:
<TemplateDir Version="1.0.0"> <SortOrder>6</SortOrder> </TemplateDir>
Salve e feche o arquivo .vstdir.
Crie um arquivo MyProject.vstemplate na pasta MyProjectNode usando qualquer editor de texto.
Adicione estas linhas ao arquivo .vstemplate:
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <ProjectType>CSharp</ProjectType> </TemplateData> </VSTemplate>
Salve o arquivo .vstemplate e feche o editor.
Envie o arquivo .vstemplate para uma nova pasta compactada MyProjectNode\MyProject.zip pasta.
Na janela de comando do Visual Studio, digite:
devenv /installvstemplates
Abra o Visual Studio.
Abra a caixa de diálogo Novo projeto e expanda o nó do projeto Visual C#.
MyProjectNode aparece como um nó filho do Visual C# logo abaixo do nó Windows.