Поделиться через


Создание базовой системы проекта, часть 2

Первое пошаговое руководство в этой серии, создание базовой системы проектов, часть 1, показывает, как создать базовую систему проектов. В этом пошаговом руководстве базовая система проектов расширяется, включая шаблон Visual Studio, страницу свойств и другие функции. Перед началом этого прохождения необходимо выполнить первое прохождение.

В этом пошаговом руководстве показано, как создать тип проекта с расширением myproj имени файла проекта. Чтобы завершить пошаговое руководство, вам не нужно создавать собственный язык, так как пошаговое руководство заимствовано из существующей системы проектов Visual C#.

В этом пошаговом руководстве показано, как выполнить следующие задачи:

  • Создайте шаблон Visual Studio.

  • Разверните шаблон Visual Studio.

  • Создайте дочерний узел типа проекта в диалоговом окне "Новый проект ".

  • Включите подстановку параметров в шаблоне Visual Studio.

  • Создайте страницу свойств проекта.

Замечание

Действия, описанные в этом пошаговом руководстве, основаны на проекте C#. Однако за исключением конкретных особенностей, таких как расширения имени файла и код, можно использовать те же действия для проекта Visual Basic.

Создание шаблона Visual Studio

  • Создание базовой системы проекта, часть 1 показывает, как создать базовый шаблон проекта и добавить его в систему проекта. В нем также показано, как зарегистрировать этот шаблон в Visual Studio с помощью атрибута ProvideProjectFactoryAttribute , который записывает полный путь к папке \Templates\Projects\SimpleProject\ в системном реестре.

Используя шаблон Visual Studio (vstemplate-файл ) вместо базового шаблона проекта, вы можете управлять тем, как шаблон отображается в диалоговом окне "Новый проект " и как заменяются параметры шаблона. VSTEMPLATE-файл — это XML-файл, который описывает, как должны быть включены исходные файлы при создании проекта с помощью шаблона системы проекта. Сама система проекта создается путем сбора файла .vstemplate и исходных файлов в файле .zip и развертывается путем копирования файла .zip в расположение, известное Visual Studio. Этот процесс более подробно описан далее в этом пошаговом руководстве.

  1. В Visual Studio откройте решение SimpleProject, созданное после создания базовой системы проектов, часть 1.

  2. В файле SimpleProjectPackage.cs найдите атрибут ProvideProjectFactory. Замените второй параметр (имя проекта) null и четвертый параметр (путь к папке шаблона проекта) на ".\\NullPath", как показано ниже.

    [ProvideProjectFactory(typeof(SimpleProjectFactory), null,
        "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj",
        ".\\NullPath",
    LanguageVsTemplate = "SimpleProject")]
    
  3. Добавьте XML-файл SimpleProject.vstemplate в папку \Templates\Projects\SimpleProject\ .

  4. Замените содержимое SimpleProject.vstemplate следующим кодом.

    <VSTemplate Version="2.0.0" Type="Project"
        xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
      <TemplateData>
        <Name>SimpleProject Application</Name>
        <Description>
          A project for creating a SimpleProject application
        </Description>
        <Icon>SimpleProject.ico</Icon>
        <ProjectType>SimpleProject</ProjectType>
      </TemplateData>
      <TemplateContent>
        <Project File="SimpleProject.myproj" ReplaceParameters="true">
          <ProjectItem ReplaceParameters="true" OpenInEditor="true">
            Program.cs
          </ProjectItem>
          <ProjectItem ReplaceParameters="true" OpenInEditor="false">
            AssemblyInfo.cs
          </ProjectItem>
        </Project>
      </TemplateContent>
    </VSTemplate>
    
  5. В окне "Свойства" выберите все пять файлов в папке \Templates\Projects\SimpleProject\ и установите действие сборки на ZipProject.

    Простая папка проекта

    Раздел <TemplateData> определяет расположение и внешний вид типа проекта SimpleProject в диалоговом окне "Новый проект ", как показано ниже.

  • Элемент <Name> называет шаблон проекта приложением SimpleProject.

  • Элемент <Description> содержит описание, которое отображается в диалоговом окне "Новый проект " при выборе шаблона проекта.

  • Элемент <Icon> указывает значок, который отображается вместе с типом проекта SimpleProject.

  • Элемент <ProjectType> называет тип Project в диалоговом окне "Новый проект ". Это имя заменяет параметр имени проекта атрибута ProvideProjectFactory.

    Замечание

    Элемент <ProjectType> должен соответствовать LanguageVsTemplate аргументу атрибута ProvideProjectFactory в файле SimpleProjectPackage.cs.

    В <разделе TemplateContent> описываются эти файлы, созданные при создании нового проекта:

  • SimpleProject.myproj

  • Program.cs

  • AssemblyInfo.cs

    Все три файла имеют ReplaceParameters значение true, что обеспечивает подстановку параметров. Файл Program.cs имеет OpenInEditor значение true, что приводит к открытию файла в редакторе кода при создании проекта.

    Дополнительные сведения об элементах схемы шаблона Visual Studio см. в справочнике по схеме шаблонов Visual Studio.

Замечание

Если проект имеет несколько шаблонов Visual Studio, каждый шаблон находится в отдельной папке. Каждый файл в этой папке должен иметь значение "Действие сборки " в ZipProject.

Добавление минимального VSCT-файла

Visual Studio необходимо запустить в режиме установки, чтобы распознать новый или измененный шаблон Visual Studio. Для режима установки требуется наличие VSCT-файла . Поэтому необходимо добавить в проект минимальный VSCT-файл .

  1. Добавьте XML-файл SimpleProject.vsct в проект SimpleProject .

  2. Замените содержимое файла SimpleProject.vsct следующим кодом.

    <?xml version="1.0" encoding="utf-8" ?>
    <CommandTable
      xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable">
    </CommandTable>
    
  3. Установите действие сборки для этого файла на VSCTCompile. Это можно сделать только в CSPROJ-файле , а не в окне свойств . Убедитесь, что для действия сборки этого файла задано значение None на данный момент.

    1. Щелкните правой кнопкой мыши узел SimpleProject и выберите Edit SimpleProject.csproj.

    2. В CSPROJ-файле найдите элемент SimpleProject.vsct .

      <None Include="SimpleProject.vsct" />
      
    3. Измените действие сборки на VSCTCompile.

      <VSCTCompile Include="SimpleProject.vsct" />
      
    4. файл проекта и закройте редактор.

    5. Сохраните узел SimpleProject, а затем в обозревателе решений выберите "Перезагрузить проект".

Изучение шагов сборки шаблона Visual Studio

Система сборки проекта VSPackage обычно запускает Visual Studio в режиме настройки, когда файл .vstemplate изменяется или проект, содержащий файл .vstemplate, перестраивается. Вы можете следовать процессу, установив уровень подробности MSBuild на "Нормальный" или выше.

  1. В панелиПараметры инструментов>" разверните раздел "Все параметры>Проекты и решения>Сборка и запуск".

  2. Задайте для параметра детализации выходных данных сборки проекта MSBuild значение Normal.

  1. В диалоговом окне"Параметры>" разверните раздел "Проекты и решения>сборка и запуск".

  2. Установите для параметра детализации выходных данных сборки проекта MSBuildзначение "Обычный" и нажмите кнопку "ОК".

  1. Перестройте проект SimpleProject.

Шаг сборки для создания файла проекта .zip должен выглядеть следующим образом.

ZipProjects:
1>  Zipping ProjectTemplates
1>  Zipping <path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip...
1>  Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "<%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates\\\\SimpleProject.zip".
1>  Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "bin\Debug\\ProjectTemplates\\\\SimpleProject.zip".
1>  SimpleProject -> <path>\SimpleProject\SimpleProject\bin\Debug\ProjectTemplates\SimpleProject.zip
1>ZipItems:
1>  Zipping ItemTemplates
1>  SimpleProject ->

Развертывание шаблона Visual Studio

Шаблоны Visual Studio не содержат сведения о пути. Поэтому файл .zip шаблона должен быть развернут в расположении, известном коллективу Visual Studio. Расположение папки ProjectTemplates обычно <%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates.

Чтобы развернуть фабрику проектов, программа установки должна иметь права администратора. Он устанавливает шаблоны в категории установки Visual Studio: ...\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates.

Тестирование шаблона Visual Studio

Проверьте фабрику проектов, чтобы узнать, создает ли она иерархию проектов с помощью шаблона Visual Studio.

  1. Сбросьте экспериментальный экземпляр SDK для Visual Studio.

    В Windows 7. В меню "Пуск " найдите папку Microsoft Visual Studio и Microsoft Visual Studio SDK/Tools , а затем выберите "Сброс экспериментального экземпляра Microsoft Visual Studio".

    В последующих версиях Windows: на начальном экране введите "Сброс экспериментального экземпляра версии< Microsoft Visual Studio>".

  2. Откроется окно командной строки. Когда вы увидите слова нажмите любую клавишу, чтобы продолжить, выберите ВВОД. После закрытия окна откройте Visual Studio.

  3. Перестройте проект SimpleProject и запустите отладку. Экспериментальный экземпляр появляется.

  4. В экспериментальном экземпляре создайте проект SimpleProject. В диалоговом окне "Создать проект" выберите SimpleProject.

  5. Вы увидите новый экземпляр SimpleProject.

    Простой новый экземпляр проекта SimpProj2_NewProj

    Новый экземпляр My Project

Создание дочернего узла типа проекта

Дочерний узел можно добавить в узел типа проекта в диалоговом окне "Новый проект ". Например, для типа проекта SimpleProject можно использовать дочерние узлы для консольных приложений, оконных приложений, веб-приложений и т. д.

Дочерние узлы создаются путем изменения файла проекта и добавления <дочерних элементов OutputSubPath> в <элементы ZipProject> . При копировании шаблона во время сборки или развертывания каждый дочерний узел становится подпапкой в папке шаблонов проекта.

В этом разделе показано, как создать дочерний узел консоли для типа проекта SimpleProject.

  1. Переименуйте папку \Templates\Projects\SimpleProject\ в \Templates\Projects\ConsoleApp\.

  2. В окне "Свойства" выберите все пять файлов в папке \Templates\Projects\ConsoleApp\ и убедитесь, что действие сборки имеет значение ZipProject.

  3. В файле SimpleProject.vstemplate добавьте следующую строку в конце <раздела TemplateData> непосредственно перед закрывающим тегом.

    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
    

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

  4. Сохраните файл SimpleProject.vstemplate .

  5. В CSPROJ-файле добавьте <OutputSubPath> к каждому из элементов ZipProject. Выгрузите проект, как и раньше, и измените файл проекта.

  6. <Найдите элементы ZipProject>. Для каждого <элемента ZipProject> добавьте <элемент OutputSubPath> и присвойте ему значение Console. The ZipProject

    <ZipProject Include="Templates\Projects\ConsoleApp\AssemblyInfo.cs">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\Program.cs">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.myproj">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.vstemplate">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.ico">
      <OutputSubPath>Console</OutputSubPath>
    </ZipProject>
    
  7. Добавьте эту <группу свойств> в файл проекта:

    <PropertyGroup>
      <VsTemplateLanguage>SimpleProject</VsTemplateLanguage>
    </PropertyGroup>
    
  8. Сохраните файл проекта и перезагрузите проект.

Тестирование дочернего узла типа проекта

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

  1. Запустите инструмент сброса экспериментального экземпляра Microsoft Visual Studio.

  2. Перестройте проект SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.

  3. В диалоговом окне "Создать проект" выберите узел SimpleProject . Шаблон консольного приложения должен отображаться в области шаблонов .

  4. Разверните узел SimpleProject. Должен появиться дочерний узел консоли . Шаблон приложения SimpleProject продолжает отображаться в области шаблонов .

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

    Простая сводка проекта

    Простой узел консоли проекта

Замена параметров шаблона проекта

  • Создание базовой системы проекта, часть 1 показано, как переопределить метод ProjectNode.AddFileFromTemplate для выполнения простой замены параметров шаблона. В этом разделе описано, как использовать более сложные параметры шаблона Visual Studio.

При создании проекта с помощью шаблона Visual Studio в диалоговом окне "Новый проект" параметры шаблона заменяются строками для настройки проекта. Параметр шаблона — это специальный маркер, который начинается и заканчивается знаком доллара, например $time$. Следующие два параметра особенно полезны для включения настройки в проектах, основанных на шаблоне:

  • $GUID[1–10]$ заменяется новым GUID. Можно указать до 10 уникальных графических идентификаторов, например $guid 1$.

  • $safeprojectname$ — это имя, предоставленное пользователем в диалоговом окне "Новый проект ", измененное для удаления всех небезопасных символов и пробелов.

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

Замена параметров шаблона проекта

  1. В файле SimpleProjectNode.cs удалите AddFileFromTemplate метод.

  2. В файле \Templates\Projects\ConsoleApp\SimpleProject.myproj найдите <свойство RootNamespace> и измените его значение на $safeprojectname$.

    <RootNamespace>$safeprojectname$</RootNamespace>
    
  3. В файле \Templates\Projects\SimpleProject\Program.cs замените содержимое файла следующим кодом:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;    // Guid
    
    namespace $safeprojectname$
    {
        [Guid("$guid1$")]
        public class $safeprojectname$
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    
  4. Перестройте проект SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.

  5. Создайте новое консольное приложение SimpleProject. (В области "Типы проектов " выберите SimpleProject. В разделе установленных шаблонов Visual Studio выберите консольное приложение.)

  6. В созданном проекте откройте Program.cs. Он должен выглядеть примерно следующим образом (значения GUID в файле отличаются.):

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;    // Guid
    
    namespace Console_Application1
    {
        [Guid("00000000-0000-0000-00000000-00000000)"]
        public class Console_Application1
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    

Создание страницы свойств проекта

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

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

Страница свойств, созданная в этом разделе, позволяет изменять и сохранять следующие свойства проекта:

  • Имя сборки

  • ТипВыхода

  • RootNamespace.

  1. В файле SimpleProjectPackage.cs добавьте этот ProvideObject атрибут в SimpleProjectPackage класс:

    [ProvideObject(typeof(GeneralPropertyPage))]
    public sealed class SimpleProjectPackage : ProjectPackage
    

    Это регистрирует класс GeneralPropertyPage страницы свойств с помощью COM.

  2. В файл SimpleProjectNode.cs добавьте два переопределённых метода в класс SimpleProjectNode.

    protected override Guid[] GetConfigurationIndependentPropertyPages()
    {
        Guid[] result = new Guid[1];
        result[0] = typeof(GeneralPropertyPage).GUID;
        return result;
    }
    protected override Guid[] GetPriorityProjectDesignerPages()
    {
        Guid[] result = new Guid[1];
        result[0] = typeof(GeneralPropertyPage).GUID;
        return result;
    }
    

    Оба этих метода возвращают массив GUID страниц свойств. GUID GeneralPropertyPage является единственным элементом в массиве, поэтому в диалоговом окне "Страницы свойств " отображается только одна страница.

  3. Добавьте файл класса с именем GeneralPropertyPage.cs в проект SimpleProject.

  4. Замените содержимое этого файла следующим кодом:

    using System;
    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Project;
    using System.ComponentModel;
    
    namespace SimpleProject
    {
        [ComVisible(true)]
        [Guid("6BC7046B-B110-40d8-9F23-34263D8D2936")]
        public class GeneralPropertyPage : SettingsPage
        {
            private string assemblyName;
            private OutputType outputType;
            private string defaultNamespace;
    
            public GeneralPropertyPage()
            {
                this.Name = "General";
            }
    
            [Category("AssemblyName")]
            [DisplayName("AssemblyName")]
            [Description("The output file holding assembly metadata.")]
            public string AssemblyName
            {
                get { return this.assemblyName; }
            }
            [Category("Application")]
            [DisplayName("OutputType")]
            [Description("The type of application to build.")]
            public OutputType OutputType
            {
                get { return this.outputType; }
                set { this.outputType = value; this.IsDirty = true; }
            }
            [Category("Application")]
            [DisplayName("DefaultNamespace")]
            [Description("Specifies the default namespace for added items.")]
            public string DefaultNamespace
            {
                get { return this.defaultNamespace; }
                set { this.defaultNamespace = value; this.IsDirty = true; }
            }
    
            protected override void BindProperties()
            {
                this.assemblyName = this.ProjectMgr.GetProjectProperty("AssemblyName", true);
                this.defaultNamespace = this.ProjectMgr.GetProjectProperty("RootNamespace", false);
    
                string outputType = this.ProjectMgr.GetProjectProperty("OutputType", false);
                this.outputType = (OutputType)Enum.Parse(typeof(OutputType), outputType);
            }
    
            protected override int ApplyChanges()
            {
                this.ProjectMgr.SetProjectProperty("AssemblyName", this.assemblyName);
                this.ProjectMgr.SetProjectProperty("OutputType", this.outputType.ToString());
                this.ProjectMgr.SetProjectProperty("RootNamespace", this.defaultNamespace);
                this.IsDirty = false;
    
                return VSConstants.S_OK;
            }
        }
    }
    

    Класс GeneralPropertyPage предоставляет три общедоступных свойства AssemblyName, OutputType и RootNamespace. Так как AssemblyName не имеет метода set, он отображается как свойство только для чтения. OutputType — это перечисляемая константа, поэтому она отображается в раскрывающемся списке.

    Базовый SettingsPage класс предоставляет ProjectMgr для сохранения свойств. Метод BindProperties используется ProjectMgr для получения сохраненных значений свойств и задания соответствующих свойств. Метод ApplyChanges используется ProjectMgr для получения значений свойств и сохранения их в файле проекта. Метод установки свойства задает значение IsDirty равным true, чтобы указать, что свойства должны быть сохранены. Сохраняемость возникает при сохранении проекта или решения.

  5. Перестройте решение SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.

  6. В экспериментальном экземпляре создайте новое приложение SimpleProject.

  7. Visual Studio вызывает генератор проектов для создания проекта с использованием шаблона Visual Studio. Новый файл Program.cs открывается в редакторе кода.

  8. Щелкните правой кнопкой мыши узел проекта в обозревателе решений и выберите пункт "Свойства". Откроется диалоговое окно "Страницы свойств ".

    Страница простых свойств проекта

Проверка страницы свойств проекта

Теперь вы можете проверить, сможете ли вы модифицировать и изменять значения свойств.

  1. В диалоговом окне "Страницы свойств MyConsoleApplication" измените пространство DefaultNamespace на MyApplication.

  2. Выберите свойство OutputType и выберите библиотеку классов.

  3. Нажмите кнопку "Применить" и нажмите кнопку "ОК".

  4. Откройте диалоговое окно "Страницы свойств" и убедитесь, что изменения сохранены.

  5. Закройте экспериментальный экземпляр Visual Studio.

  6. Повторно откройте экспериментальный экземпляр.

  7. Откройте диалоговое окно "Страницы свойств" и убедитесь, что изменения сохранены.

  8. Закройте экспериментальный экземпляр Visual Studio. Закройте экспериментальный экземпляр