Использование мастеров с шаблонами проектов

Visual Studio предоставляет IWizard интерфейс, который при реализации позволяет запускать пользовательский код при создании проекта из шаблона.

Настройка шаблона проекта может использоваться для отображения пользовательского пользовательского интерфейса, который собирает входные данные пользователя для настройки шаблона, добавления дополнительных файлов в шаблон или любых других действий, разрешенных в проекте.

IWizard Методы интерфейса вызываются в разное время во время создания проекта, начиная с того момента, как пользователь нажимает кнопку "ОК" в диалоговом окне "Новый проект". Каждый метод интерфейса называется для описания точки, в которой он вызывается. Например, Visual Studio вызывается RunStarted немедленно при запуске создания проекта, что делает его хорошим расположением для написания пользовательского кода для сбора входных данных пользователей.

Создание проекта шаблона проекта с помощью проекта VSIX

Вы начинаете создавать пользовательский шаблон с проектом шаблона проекта, который является частью пакета SDK Для Visual Studio. В этой процедуре мы будем использовать проект шаблона проекта C#, но существует также проект шаблона проекта Visual Basic. Затем вы добавите проект VSIX в решение, содержащее проект шаблона проекта.

  1. Создайте проект шаблона проекта C# (в Visual Studio выберите файл>нового>проекта и найдите шаблон проекта). Назовите его MyProjectTemplate.

    Примечание.

    Возможно, вам будет предложено установить пакет SDK Visual Studio. Дополнительные сведения: Установка пакета SDK для Visual Studio.

  2. Добавьте новый проект VSIX в то же решение, что и проект шаблона проекта (в Обозреватель решений выберите узел решения, щелкните правой кнопкой мыши и выберите "Добавить>новый проект" и выполните поиск "vsix"). Назовите его MyProjectWizard.

  3. Задайте проект VSIX в качестве запускаемого проекта. В Обозреватель решений выберите узел проекта VSIX, щелкните правой кнопкой мыши и выберите "Задать в качестве запускаемого проекта".

  4. Добавьте проект шаблона в качестве ресурса проекта VSIX. В Обозреватель решений в узле проекта VSIX найдите файл source.extension.vsixmanifest. Дважды щелкните его, чтобы открыть его в редакторе манифеста.

  5. В редакторе манифеста выберите вкладку "Активы" в левой части окна.

  6. На вкладке "Активы" нажмите кнопку "Создать". В окне "Добавление нового ресурса" в поле "Тип" выберите Microsoft.VisualStudio.ProjectTemplate. В поле "Источник" выберите проект в текущем решении. В поле "Проект" выберите MyProjectTemplate. Затем нажмите кнопку ОК.

  7. Создайте решение и начните отладку. Откроется второй экземпляр Visual Studio. Это может занять несколько минут.

  8. Во втором экземпляре Visual Studio попробуйте создать проект с новым шаблоном (файл>нового>проекта, найдите myproject). Новый проект должен отображаться с классом с именем Class1. Теперь вы создали пользовательский шаблон проекта! Остановите отладку.

Создание мастера пользовательских шаблонов

В этой процедуре показано, как создать пользовательский мастер, который открывает форму Windows Form перед созданием проекта. Форма позволяет пользователям добавлять настраиваемое значение параметра, добавляемое в исходный код во время создания проекта.

  1. Настройте проект VSIX, чтобы разрешить ему создавать сборку.

  2. В Обозреватель решений выберите узел проекта VSIX. Ниже Обозреватель решений появится окно "Свойства". Если это не так, выберите окно "Просмотр>свойств" или нажмите клавишу F4. В окне "Свойства" выберите следующие поляtrue:

    • Включение сборки в контейнер VSIX

    • Включение символов отладки в локальное развертывание VSIX

    • Включение символов отладки в контейнер VSIX

  3. Добавьте сборку в качестве ресурса в проект VSIX. Откройте файл source.extension.vsixmanifest и перейдите на вкладку "Активы". В окне "Добавление нового ресурса" в поле "Тип" выберите Microsoft.VisualStudio.Assembly, для источника выберите проект в текущем решении и выберите"Проект MyProjectWizard".

  4. Добавьте следующие ссылки на проект VSIX. (в Обозреватель решений в узле проекта VSIX выберите "Ссылки", щелкните правой кнопкой мыши и выберите "Добавить ссылку".) В диалоговом окне "Добавить ссылку" на вкладке Framework найдите сборку System.Windows Forms и выберите ее. Также найдите и выберите сборки System и System.Drawing. Теперь выберите вкладку "Расширения ". Найдите сборку EnvDTE и выберите ее. Также найдите сборку Microsoft.VisualStudio.TemplateWizardInterface и выберите ее. Щелкните OK.

  5. Добавьте класс для реализации мастера в проект VSIX. (в Обозреватель решений щелкните правой кнопкой мыши узел проекта VSIX и выберите "Добавить", а затем "Создать элемент", а затем "Класс".) Назовите класс WizardImplementation.

  6. Замените код в файле WizardImplementationClass.cs следующим кодом:

    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;
            }
        }
    }
    

    Объект UserInputForm , на который ссылается в этом коде, будет реализован позже.

    Класс WizardImplementation содержит реализации методов для каждого члена IWizard. В этом примере только RunStarted метод выполняет задачу. Все остальные методы либо ничего не делают, либо возвращают.true

    Метод RunStarted принимает четыре параметра:

    • Параметр Object , который можно привести к корневому _DTE объекту, чтобы можно было настроить проект.

    • Параметр Dictionary<TKey,TValue> , содержащий коллекцию всех предварительно определенных параметров в шаблоне. Дополнительные сведения о параметрах шаблона см. в разделе "Параметры шаблона".

    • Параметр WizardRunKind , содержащий сведения о том, какой шаблон используется.

    • Массив Object , содержащий набор параметров, передаваемых мастеру Visual Studio.

      В этом примере в параметр добавляется значение параметра из пользовательской входной формы Dictionary<TKey,TValue> . Каждый экземпляр $custommessage$ параметра в проекте будет заменен текстом, введенным пользователем.

  7. Теперь создайте UserInputForm. В файле WizardImplementation.cs добавьте следующий код после окончания WizardImplementation класса.

    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();
            }
        }
    

    Форма ввода пользователя предоставляет простую форму для ввода пользовательского параметра. Форма содержит текстовое поле с именем textBox1 и кнопкой с именем button1. При нажатии кнопки текст из текстового поля хранится в параметре customMessage .

Подключение мастера в пользовательский шаблон

Чтобы пользовательский шаблон проекта использовал настраиваемый мастер, необходимо подписать сборку мастера и добавить в пользовательский шаблон проекта некоторые строки, чтобы сообщить ему, где найти реализацию мастера при создании нового проекта.

  1. Подписыв сборку. В Обозреватель решений выберите проект VSIX, щелкните правой кнопкой мыши и выберите свойства проекта.

  2. В окне "Свойства проекта" выберите вкладку "Подпись". На вкладке "Подписывание" проверка подписать сборку. В поле "Выбор файла ключа строгого имени" нажмите кнопку <"Создать>". В окне "Создание ключа строгого имени" в поле "Имя файла ключа" введите key.snk. Un проверка файл ключа protect my key с помощью поля пароля.

  3. В Обозреватель решений выберите проект VSIX и найдите окно "Свойства".

  4. Задайте для поля "Копировать выходные данные сборки" значение true. Это позволяет скопировать сборку в выходной каталог при перестроении решения. Он по-прежнему .vsix содержится в файле. Чтобы узнать ключ подписывания, необходимо увидеть сборку.

  5. Заново постройте решение.

  6. Теперь файл key.snk можно найти в каталоге проекта MyProjectWizard (<расположение> диска\MyProjectTemplate\MyProjectWizard\key.snk). Скопируйте файл key.snk.

  7. Перейдите в выходной каталог и найдите сборку (<расположение диска>\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll). Вставьте файл key.snk здесь. (Это не обязательно, но это сделает следующие шаги проще.)

  8. Откройте командное окно и перейдите в каталог, в котором была создана сборка.

  9. Найдите средство подписывания sn.exe. Например, в 64-разрядной операционной системе Windows 10 типичный путь будет следующим:

    C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

    Если не удается найти средство, попробуйте запустить файл /R. sn.exe в командном окне. Запишите путь.

  10. Извлеките открытый ключ из файла key.snk . В командном окне введите

    <расположение sn.exe\sn.exe> -p key.snk outfile.key.

    Не забудьте окружить путь sn.exe кавычками, если в именах каталогов есть пробелы!

  11. Получите маркер открытого ключа из outfile:

    <расположение sn.exe>\sn.exe -t outfile.key.

    Опять же, не забывайте кавычки. Вы увидите строку в выходных данных, как показано ниже.

    Маркер открытого ключа — <это маркер>

    Запишите это значение.

  12. Добавьте ссылку на пользовательский мастер в vstemplate-файл шаблона проекта. В Обозреватель решений найдите файл с именем MyProjectTemplate.vstemplate и откройте его. После окончания <раздела TemplateContent> добавьте следующий раздел:

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

    Где MyProjectWizard — это имя сборки, а маркер — это маркер , скопированный на предыдущем шаге.

  13. Сохраните все файлы в проекте и перестройте.

Добавление настраиваемого параметра в шаблон

В этом примере проект, используемый в качестве шаблона, отображает сообщение, указанное в пользовательской форме ввода мастера.

  1. В Обозреватель решений перейдите в проект MyProjectTemplate и откройте class1.cs.

  2. Main В методе приложения добавьте следующую строку кода.

    Console.WriteLine("$custommessage$");
    

    Параметр $custommessage$ заменяется текстом, введенным в форму ввода пользователя при создании проекта из шаблона.

Ниже приведен полный файл кода, прежде чем он был экспортирован в шаблон.

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$");
          }
    }
}

Использование настраиваемого мастера

Теперь вы можете создать проект из шаблона и использовать пользовательский мастер.

  1. Перестройте решение и запустите отладку. Откроется второй экземпляр Visual Studio.

  2. Создайте проект MyProjectTemplate. (Файл>нового>проекта).

  3. В диалоговом окне "Создать проект" найдите шаблон, введите имя и нажмите кнопку "ОК".

    Откроется форма ввода пользователя мастера.

  4. Введите значение для настраиваемого параметра и нажмите кнопку.

    Форма ввода пользователя мастера закрывается, и проект создается из шаблона.

  5. В Обозреватель решений щелкните правой кнопкой мыши файл исходного кода и нажмите кнопку "Просмотреть код".

    Обратите внимание, что $custommessage$ был заменен текстом, введенным в форме ввода пользователя мастера.