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


Создание базовой системы проекта, часть 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.

    Simple Project Folder

    Раздел <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. Разверните узел "Проекты и решения", а затем выберите "Сборка и запуск".

  3. Задайте для сборки проекта MSBuild значение "Обычный". Щелкните OK.

  4. Перестройте проект 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/Пакет SDK для Microsoft Visual Studio/Tools, а затем выберите "Сброс экспериментального экземпляра Microsoft Visual Studio".

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

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

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

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

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

    Simple Project New Instance

    My Project New Instance

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

Дочерний узел можно добавить в узел типа проекта в диалоговом окне "Новый проект ". Например, для типа проекта 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. Нажмите кнопку "Отмена " и остановите отладку.

    Simple Project Rollup

    Simple Project Console Node

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

  • Создание базовой системы проекта, часть 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 как сохранять значения свойств в файле проекта.

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

  • AssemblyName

  • OutputType

  • 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 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. Щелкните правой кнопкой мыши узел проекта в Обозреватель решений и выберите пункт "Свойства". Откроется диалоговое окно Страницы свойств.

    Simple Project Property Page

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

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

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

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

  3. Щелкните Применить, затем щелкните ОК.

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

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

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

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

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