Создание базовой системы проекта, часть 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. Этот процесс более подробно описан далее в этом пошаговом руководстве.
В Visual Studio откройте решение SimpleProject, созданное после создания базовой системы проектов, часть 1.
В файле SimpleProjectPackage.cs найдите атрибут ProvideProjectFactory. Замените второй параметр (имя проекта) null и четвертый параметр (путь к папке шаблона проекта) на ".\\NullPath", как показано ниже.
[ProvideProjectFactory(typeof(SimpleProjectFactory), null, "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj", ".\\NullPath", LanguageVsTemplate = "SimpleProject")]
Добавьте XML-файл SimpleProject.vstemplate в папку \Templates\Projects\SimpleProject\.
Замените содержимое 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>
В окне "Свойства" выберите все пять файлов в папке \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-файл .
Добавьте XML-файл SimpleProject.vsct в проект SimpleProject.
Замените содержимое файла SimpleProject.vsct следующим кодом.
<?xml version="1.0" encoding="utf-8" ?> <CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"> </CommandTable>
Задайте для действия сборки этого файла значение VSCTCompile. Это можно сделать только в CSPROJ-файле , а не в окне свойств . Убедитесь, что для действия сборки этого файла задано значение None на данный момент.
Щелкните правой кнопкой мыши узел SimpleProject и выберите команду Edit SimpleProject.csproj.
В CSPROJ-файле найдите элемент SimpleProject.vsct.
<None Include="SimpleProject.vsct" />
Измените действие сборки на VSCTCompile.
<VSCTCompile Include="SimpleProject.vsct" />
файл проекта и закройте редактор.
Сохраните узел SimpleProject, а затем в Обозреватель решений щелкните "Перезагрузить проект".
Изучение шагов сборки шаблона Visual Studio
Система сборки проекта VSPackage обычно запускает Visual Studio в режиме установки при изменении vstemplate-файла или проекта, содержащего vstemplate-файл , перестроен. Вы можете следовать за этим, задав уровень детализации MSBuild на "Обычный" или выше.
В меню Сервис выберите пункт Параметры.
Разверните узел "Проекты и решения", а затем выберите "Сборка и запуск".
Задайте для сборки проекта MSBuild значение "Обычный". Щелкните OK.
Перестройте проект 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.
Сброс экспериментального экземпляра пакета SDK Для Visual Studio.
В Windows 7. В меню "Пуск" найдите папку Microsoft Visual Studio/Пакет SDK для Microsoft Visual Studio/Tools, а затем выберите "Сброс экспериментального экземпляра Microsoft Visual Studio".
В последующих версиях Windows: на начальном экране введите "Сброс экспериментального экземпляра версии> Microsoft Visual Studio<".
Откроется окно командной строки. Когда вы увидите слова , нажмите клавишу, чтобы продолжить, нажмите клавишу ВВОД. После закрытия окна откройте Visual Studio.
Перестройте проект SimpleProject и запустите отладку. Откроется экспериментальный экземпляр.
В экспериментальном экземпляре создайте проект SimpleProject. В диалоговом окне "Создать проект" выберите SimpleProject.
Вы увидите новый экземпляр SimpleProject.
Создание дочернего узла типа проекта
Дочерний узел можно добавить в узел типа проекта в диалоговом окне "Новый проект ". Например, для типа проекта SimpleProject можно использовать дочерние узлы для консольных приложений, оконных приложений, веб-приложений и т. д.
Дочерние узлы создаются путем изменения файла проекта и добавления <дочерних элементов OutputSubPath> в <элементы ZipProject> . При копировании шаблона во время сборки или развертывания каждый дочерний узел становится вложенной папкой шаблонов проектов.
В этом разделе показано, как создать дочерний узел консоли для типа проекта SimpleProject.
Переименуйте папку \Templates\Projects\SimpleProject\ в \Templates\Projects\ConsoleApp\.
В окне "Свойства" выберите все пять файлов в папке \Templates\Projects\ConsoleApp\ и убедитесь, что действие сборки имеет значение ZipProject.
В файле SimpleProject.vstemplate добавьте следующую строку в конце <раздела TemplateData> непосредственно перед закрывающим тегом.
<NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
Это приводит к отображению шаблона консольного приложения как в дочернем узле консоли, так и в родительском узле SimpleProject, который находится на одном уровне над дочерним узлом.
Сохраните файл SimpleProject.vstemplate .
В CSPROJ-файле добавьте <OutputSubPath> к каждому из элементов ZipProject. Выгрузите проект, как и раньше, и измените файл проекта.
<Найдите элементы 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>
Добавьте эту <группу свойств> в файл проекта:
<PropertyGroup> <VsTemplateLanguage>SimpleProject</VsTemplateLanguage> </PropertyGroup>
Сохраните файл проекта и перезагрузите проект.
Тестирование дочернего узла типа проекта
Проверьте измененный файл проекта, чтобы узнать, отображается ли дочерний узел консоли в диалоговом окне "Новый проект ".
Запустите средство сброса экспериментального экземпляра Microsoft Visual Studio.
Перестройте проект SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.
В диалоговом окне "Создать проект" щелкните узел SimpleProject. Шаблон консольного приложения должен отображаться в области шаблонов .
Разверните узел SimpleProject. Должен появиться дочерний узел консоли . Шаблон приложения SimpleProject продолжает отображаться в области шаблонов .
Нажмите кнопку "Отмена " и остановите отладку.
Замена параметров шаблона проекта
- Создание базовой системы проекта, часть 1 показала, как перезаписать
ProjectNode.AddFileFromTemplate
метод для выполнения простого подстановки параметров шаблона. В этом разделе описано, как использовать более сложные параметры шаблона Visual Studio.
При создании проекта с помощью шаблона Visual Studio в диалоговом окне "Новый проект" параметры шаблона заменяются строками для настройки проекта. Параметр шаблона — это специальный маркер, который начинается и заканчивается знаком доллара, например $time$. Следующие два параметра особенно полезны для включения настройки в проектах, основанных на шаблоне:
$GUID[1–10]$ заменяется новым guid. Можно указать до 10 уникальных графических идентификаторов, например $guid 1$.
$safeprojectname$ — это имя, предоставленное пользователем в диалоговом окне "Новый проект ", измененное для удаления всех небезопасных символов и пробелов.
Полный список параметров шаблона см. в разделе Параметры шаблона.
Замена параметров шаблона проекта
В файле SimpleProjectNode.cs удалите
AddFileFromTemplate
метод.В файле \Templates\Projects\ConsoleApp\SimpleProject.myproj найдите <свойство RootNamespace> и измените его значение на $safeprojectname$.
<RootNamespace>$safeprojectname$</RootNamespace>
В файле \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(); } } }
Перестройте проект SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.
Создайте новое консольное приложение SimpleProject. (В Область типов проектов выберите SimpleProject. В разделе установленных шаблонов Visual Studio выберите консольное приложение.)
В созданном проекте откройте 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.
В файле SimpleProjectPackage.cs добавьте этот
ProvideObject
атрибут вSimpleProjectPackage
класс:[ProvideObject(typeof(GeneralPropertyPage))] public sealed class SimpleProjectPackage : ProjectPackage
Это регистрирует класс
GeneralPropertyPage
страницы свойств с помощью COM.В файле 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 является единственным элементом в массиве, поэтому диалоговое окно "Страницы свойств" будет отображать только одну страницу.
Добавьте файл класса с именем GeneralPropertyPage.cs в проект SimpleProject.
Замените содержимое этого файла следующим кодом:
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, чтобы указать, что свойства должны быть сохранены. Сохраняемость возникает при сохранении проекта или решения.Перестройте решение SimpleProject и запустите отладку. Должен появиться экспериментальный экземпляр.
В экспериментальном экземпляре создайте новое приложение SimpleProject.
Visual Studio вызывает фабрику проектов для создания проекта с помощью шаблона Visual Studio. Новый файл Program.cs открывается в редакторе кода.
Щелкните правой кнопкой мыши узел проекта в Обозреватель решений и выберите пункт "Свойства". Откроется диалоговое окно Страницы свойств.
Проверка страницы свойств проекта
Теперь можно проверить, можно ли изменять и изменять значения свойств.
В диалоговом окне "Страницы свойств MyConsoleApplication" измените пространство DefaultNamespace на MyApplication.
Выберите свойство OutputType и выберите библиотеку классов.
Щелкните Применить, затем щелкните ОК.
Откройте диалоговое окно "Страницы свойств" и убедитесь, что изменения сохранены.
Закройте экспериментальный экземпляр Visual Studio.
Повторно откройте экспериментальный экземпляр.
Откройте диалоговое окно "Страницы свойств" и убедитесь, что изменения сохранены.
Закройте экспериментальный экземпляр Visual Studio.