Compartilhar via


Usar assistentes com modelos de projeto

Visual Studio fornece a interface que, quando implementado, permite que você execute código personalizado quando um usuário cria um projeto a IWizard partir de um modelo.

A personalização do modelo de projeto pode ser usada para exibir a interface do usuário personalizada que coleta a entrada do usuário para personalizar o modelo, adicionar arquivos adicionais ao modelo ou qualquer outra ação permitida em um projeto.

Os IWizard métodos de interface são chamados em vários momentos enquanto o projeto está sendo criado, começando assim que um usuário clica em OK na caixa de diálogo Novo projeto. Cada método da interface é nomeado para descrever o ponto em que é chamado. Por exemplo, o Visual Studio chama imediatamente quando começa a criar o projeto, tornando-o RunStarted um bom local para escrever código personalizado para coletar a entrada do usuário.

Criar um projeto de modelo de projeto com um projeto VSIX

Você começa a criar um modelo personalizado com o projeto de modelo de projeto, que faz parte do SDK do Visual Studio. Neste procedimento, usaremos um projeto de modelo de projeto C#, mas também há um projeto de modelo de projeto do Visual Basic. Em seguida, adicione um projeto VSIX à solução que contém o projeto de modelo de projeto.

  1. Crie um projeto de modelo de projeto C# (no Visual Studio, selecione Arquivo>Novo>Projeto e procure "modelo de projeto"). Nomeie-o MyProjectTemplate.

    Observação

    Você pode ser solicitado a instalar o SDK do Visual Studio. Para obter mais informações, consulte Instalando o SDK do Visual Studio.

  2. Adicione um novo projeto VSIX na mesma solução que o projeto de modelo de projeto (no Gerenciador de Soluções, selecione o nó da solução, clique com o botão direito do mouse e selecione Adicionar>Novo Projeto e procure "vsix"). Nomeie-o MyProjectWizard.

  3. Defina o projeto VSIX como o projeto de inicialização. No Gerenciador de Soluções, selecione o nó do projeto VSIX, clique com o botão direito do mouse e selecione Definir como Projeto de Inicialização.

  4. Adicione o projeto de modelo como um ativo do projeto VSIX. No Gerenciador de Soluções, no nó do projeto VSIX, localize o arquivo source.extension.vsixmanifest . Clique duas vezes nele para abri-lo no editor de manifesto.

  5. No editor de manifesto, selecione a guia Ativos no lado esquerdo da janela.

  6. Na guia Ativos, selecione Novo. Na janela Adicionar Novo Ativo, para o campo Tipo, selecione Microsoft.VisualStudio.ProjectTemplate. No campo Origem, selecione Um projeto na solução atual. No campo Projeto, selecione MyProjectTemplate. Em seguida, clique em OK.

  7. Compile a solução e inicie a depuração. Uma segunda instância do Visual Studio é exibida. (Isso pode levar alguns minutos).

  8. Na segunda instância do Visual Studio, tente criar um novo projeto com seu novo modelo (File>New>Project, procure por "myproject"). O novo projeto deve aparecer com uma classe chamada Class1. Agora você criou um modelo de projeto personalizado! Pare de depurar agora.

Criar um assistente de modelo personalizado

Este procedimento mostra como criar um assistente personalizado que abre um Windows Form antes que o projeto seja criado. O formulário permite que os usuários adicionem um valor de parâmetro personalizado que é adicionado ao código-fonte durante a criação do projeto.

  1. Configure o projeto VSIX para permitir que ele crie um assembly.

  2. No Gerenciador de Soluções, selecione o nó do projeto VSIX. Abaixo do Gerenciador de Soluções, você deve ver a janela Propriedades. Caso contrário, selecione Exibir>janela de propriedades ou pressione F4. Na janela Propriedades, selecione os seguintes campos paratrue:

    • Incluir montagem no contêiner VSIX

    • Incluir símbolos de depuração na implantação local do VSIX

    • Incluir símbolos de depuração no contêiner VSIX

  3. Adicione o assembly como um ativo ao projeto VSIX. Abra o arquivo source.extension.vsixmanifest e selecione a guia Ativos. Na janela Adicionar Novo Ativo, em Tipo, selecione Microsoft.VisualStudio.Assembly, em Código-Fonte, selecione Um projeto na solução atual e, em Projeto, selecione MyProjectWizard.

  4. Adicione as seguintes referências ao projeto VSIX. (Em Gerenciador de Soluções, no nó do projeto VSIX, selecione Referências, clique com o botão direito do mouse e selecione Adicionar Referência.) Na caixa de diálogo Adicionar Referência, na guia Estrutura, localize o assembly System.Windows Forms e selecione-o. Localize e selecione também os assemblies System e System.Drawing. Agora selecione a guia Extensões. Localize o assembly EnvDTE e selecione-o. Localize também o assembly Microsoft.VisualStudio.TemplateWizardInterface e selecione-o. Clique em OK.

  5. Adicione uma classe para a implementação do assistente ao projeto VSIX. (Em Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto VSIX e selecione Adicionar, Novo Item e Classe.) Nomeie a classe WizardImplementation.

  6. Substitua o código no arquivo WizardImplementationClass.cs com o seguinte código:

    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TemplateWizard;
    using System.Windows.Forms;
    using EnvDTE;
    
    namespace MyProjectWizard
    {
        public class WizardImplementation:IWizard
        {
            private UserInputForm inputForm;
            private string customMessage;
    
            // This method is called before opening any item that
            // has the OpenInEditor attribute.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectFinishedGenerating(Project project)
            {
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public void ProjectItemFinishedGenerating(ProjectItem
                projectItem)
            {
            }
    
            // This method is called after the project is created.
            public void RunFinished()
            {
            }
    
            public void RunStarted(object automationObject,
                Dictionary<string, string> replacementsDictionary,
                WizardRunKind runKind, object[] customParams)
            {
                try
                {
                    // Display a form to the user. The form collects
                    // input for the custom message.
                    inputForm = new UserInputForm();
                    inputForm.ShowDialog();
    
                    customMessage = UserInputForm.CustomMessage;
    
                    // Add custom parameters.
                    replacementsDictionary.Add("$custommessage$",
                        customMessage);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public bool ShouldAddProjectItem(string filePath)
            {
                return true;
            }
        }
    }
    

    O UserInputForm referenciado neste código será implementado posteriormente.

    A WizardImplementation classe contém implementações de método para cada membro do IWizard. Neste exemplo, somente o RunStarted método executa uma tarefa. Todos os outros métodos ou não fazem nada ou retornam true.

    O RunStarted método aceita quatro parâmetros:

    • Um Object parâmetro que pode ser convertido no objeto raiz _DTE , para permitir que você personalize o projeto.

    • Um Dictionary<TKey,TValue> parâmetro que contém uma coleção de todos os parâmetros predefinidos no modelo. Para obter mais informações sobre parâmetros de modelo, consulte Parâmetros de modelo.

    • Um WizardRunKind parâmetro que contém informações sobre que tipo de modelo está sendo usado.

    • Uma Object matriz que contém um conjunto de parâmetros passados para o assistente pelo Visual Studio.

      Este exemplo adiciona um valor de parâmetro do formulário de entrada do usuário ao Dictionary<TKey,TValue> parâmetro. Cada instância do $custommessage$ parâmetro no projeto será substituída pelo texto inserido pelo usuário.

  7. Agora crie o UserInputForm. No arquivo WizardImplementation.cs , adicione o seguinte código após o WizardImplementation final da classe.

    public partial class UserInputForm : Form
        {
            private static string customMessage;
            private TextBox textBox1;
            private Button button1;
    
            public UserInputForm()
            {
                this.Size = new System.Drawing.Size(155, 265);
    
                button1 = new Button();
                button1.Location = new System.Drawing.Point(90, 25);
                button1.Size = new System.Drawing.Size(50, 25);
                button1.Click += button1_Click;
                this.Controls.Add(button1);
    
                textBox1 = new TextBox();
                textBox1.Location = new System.Drawing.Point(10, 25);
                textBox1.Size = new System.Drawing.Size(70, 20);
                this.Controls.Add(textBox1);
            }
            public static string CustomMessage
            {
                get
                {
                    return customMessage;
                }
                set
                {
                    customMessage = value;
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                customMessage = textBox1.Text;
                this.Close();
            }
        }
    

    O formulário de entrada do usuário fornece um formulário simples para inserir um parâmetro personalizado. O formulário contém uma caixa de texto chamada textBox1 e um botão chamado button1. Quando o botão é clicado, o texto da caixa de texto é armazenado no customMessage parâmetro.

Conectar o assistente ao modelo personalizado

Para que seu modelo de projeto personalizado use seu assistente personalizado, você precisa assinar o assembly do assistente e adicionar algumas linhas ao seu modelo de projeto personalizado para que ele saiba onde encontrar a implementação do assistente quando um novo projeto for criado.

  1. Assine a assembleia. No Gerenciador de Soluções, selecione o projeto VSIX, clique com o botão direito do mouse e selecione Propriedades do Projeto.

  2. Na janela Propriedades do projeto, selecione a guia Assinatura. na guia Assinatura, marque Assinar o assembly. No campo Escolher um arquivo de chave de nome forte, selecione <Novo>. Na janela Criar Chave de Nome Forte, no campo Nome do arquivo de chave, digite key.snk. Desmarque a opção Proteger meu arquivo de chave com uma senha .

  3. No Gerenciador de Soluções, selecione o projeto VSIX e localize a janela Propriedades .

  4. Defina o campo Copiar saída de compilação para Diretório de saída como true. Isso permite que o assembly seja copiado para o diretório de saída quando a solução for recriada. Ele ainda está contido no .vsix arquivo. Você precisa ver o assembly para descobrir sua chave de assinatura.

  5. Recrie a solução.

  6. Agora você pode encontrar o arquivo key.snk no diretório do projeto MyProjectWizard (<seu local> de disco\MyProjectTemplate\MyProjectWizard\key.snk). Copie o arquivo key.snk .

  7. Vá para o diretório de saída e localize o assembly (<seu local> de disco\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll). Cole o arquivo key.snk aqui. (Isso não é absolutamente necessário, mas facilitará as etapas a seguir.)

  8. Abra uma janela de comando e altere para o diretório no qual o assembly foi criado.

  9. Encontre a ferramenta de assinatura sn.exe . Por exemplo, em um sistema operacional Windows 10 de 64 bits, um caminho típico seria o seguinte:

    C:\Arquivos de Programas (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Ferramentas

    Se você não conseguir encontrar a ferramenta, tente executar onde /R . sn.exe na janela de comando. Anote o caminho.

  10. Extraia a chave pública do arquivo key.snk . Na janela de comando, digite

    <Localização de sn.exe\sn.exe> -p key.snk outfile.key.

    Não se esqueça de cercar o caminho do sn.exe com aspas se houver espaços nos nomes dos diretórios!

  11. Obtenha o token de chave pública do arquivo de saída:

    <Localização de sn.exe\sn.exe> -t outfile.key.

    Mais uma vez, não se esqueça das aspas. Você deve ver uma linha na saída como esta

    Token de chave pública é <token>

    Anote esse valor.

  12. Adicione a referência ao assistente personalizado ao arquivo .vstemplate do modelo de projeto. No Gerenciador de Soluções, localize o arquivo chamado MyProjectTemplate.vstemplate e abra-o. Após o <final da seção TemplateContent> , adicione a seguinte seção:

    <WizardExtension>
        <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=token</Assembly>
        <FullClassName>MyProjectWizard.WizardImplementation</FullClassName>
    </WizardExtension>
    

    Onde MyProjectWizard é o nome do assembly e token é o token que você copiou na etapa anterior.

  13. Salve todos os arquivos no projeto e reconstrua.

Adicionar o parâmetro personalizado ao modelo

Neste exemplo, o projeto usado como modelo exibe a mensagem especificada no formulário de entrada do usuário do assistente personalizado.

  1. No Gerenciador de Soluções, vá para o projeto MyProjectTemplate e abra Class1.cs.

  2. Main No método do aplicativo, adicione a seguinte linha de código.

    Console.WriteLine("$custommessage$");
    

    O parâmetro $custommessage$ é substituído pelo texto inserido no formulário de entrada do usuário quando um projeto é criado a partir do modelo.

Aqui está o arquivo de código completo antes de ser exportado para um modelo.

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;

namespace $safeprojectname$
{
    public class Class1
    {
          static void Main(string[] args)
          {
               Console.WriteLine("$custommessage$");
          }
    }
}

Usar o assistente personalizado

Agora você pode criar um projeto a partir do seu modelo e usar o assistente personalizado.

  1. Recrie a solução e inicie a depuração. Uma segunda instância do Visual Studio deve ser exibida.

  2. Crie um novo projeto MyProjectTemplate. (Arquivo>Novo>Projeto).

  3. Na caixa de diálogo Novo Projeto, procure "meuprojeto" para localizar seu modelo, digite um nome e clique em OK.

    O formulário de entrada do usuário do assistente é aberto.

  4. Digite um valor para o parâmetro personalizado e clique no botão.

    O formulário de entrada do usuário do assistente é fechado e um projeto é criado a partir do modelo.

  5. No Gerenciador de Soluções, clique com o botão direito do mouse no arquivo de código-fonte e clique em Exibir Código.

    Observe que $custommessage$ foi substituído pelo texto inserido no formulário de entrada do usuário do assistente.