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


Создание проекта: как это работает, часть 1

Область применения:yesVisual StudionoVisual Studio для Mac noVisual Studio Code

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

Visual Studio координирует несколько задач.

  • В нем отображается дерево всех доступных типов проектов.

  • Он отображает список шаблонов приложений для каждого типа проекта и позволяет выбрать один из них.

  • Он собирает сведения о проекте для приложения, такие как имя и путь проекта.

  • Эти сведения передаются в фабрику проектов.

  • Он создает элементы и папки проекта в текущем решении.

Диалоговое окно "Новый проект"

Все начинается с выбора типа проекта для нового проекта. Начнем с того, что в меню Файл щелкните Создать проект. Откроется диалоговое окно Новый проект , похожее на следующее:

Снимок экрана: диалоговое окно создания проекта.

Рассмотрим их подробнее. В дереве Типы проектов перечислены различные типы проектов, которые можно создать. При выборе типа проекта, например Visual C# Windows, вы увидите список шаблонов приложений для начала работы. Установленные шаблоны Visual Studio устанавливаются Visual Studio и доступны любому пользователю компьютера. Новые шаблоны, которые вы создаете или собираете, можно добавлять в раздел "Мои шаблоны" и доступны только вам.

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

В нижней части диалогового окна Новый проект вы увидите несколько элементов управления, которые собирают дополнительные сведения. Элементы управления, которые вы видите, зависят от типа проекта, но обычно они включают текстовое поле имя проекта, текстовое поле Расположение и связанную кнопку Обзор, а также текстовое поле Имя решения и связанное с ним поле Создать каталог для решения проверка.

Заполнение диалогового окна "Новый проект"

Откуда получается информация в диалоговом окне Новый проект ? Здесь работают два механизма, один из которых не рекомендуется. Диалоговое окно Новый проект объединяет и отображает сведения, полученные из обоих механизмов.

Старый (нерекомендуемый) метод использует системные записи реестра и vsdir-файлы. Этот механизм запускается при открытии Visual Studio. В новом методе используются vstemplate-файлы. Этот механизм запускается при инициализации Visual Studio, например путем запуска

devenv /setup

или

devenv /installvstemplates

Типы проектов

Положение и имена корневых узлов типов проектов , таких как Visual C# и другие языки, определяются записями системного реестра. Организация дочерних узлов, таких как база данных и интеллектуальное устройство, отражает иерархию папок, содержащих соответствующие VSTEMPLATE-файлы. Сначала рассмотрим корневые узлы.

Корневые узлы типа проекта

При инициализации Visual Studio проходит по подразделам системного раздела реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs для создания корневых узлов дерева типов проектов и присвоения им имен. Эти сведения кэшируются для последующего использования. Просмотрите ключ TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1. Каждая запись является ИДЕНТИФИКАТОРОМ GUID VSPackage. Имя подраздела (/1) игнорируется, но его наличие указывает на то, что это корневой узел типов Project . Корневой узел, в свою очередь, может иметь несколько подразделов, которые управляют его появлением в дереве типов проектов . Давайте рассмотрим некоторые из них.

(по умолчанию)

Это идентификатор ресурса локализованной строки, которая называет корневой узел. Строковый ресурс находится во вспомогательной библиотеке DLL, выбранной идентификатором GUID VSPackage.

В этом примере идентификаторОМ GUID VSPackage является

{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}

идентификатор ресурса (значение по умолчанию) корневого узла (/1) — 2345.

Если найти GUID в близлежащем ключе Packages и проверить подраздел SatelliteDll, можно найти путь к сборке, содержащей строковый ресурс:

<Путь> установки Visual Studio\VC#\VCSPackages\1033\csprojui.dll

Чтобы проверить это, откройте проводник и перетащите csprojui.dll в каталог Visual Studio. В строковой таблице показано, что ресурс 2345 содержит подпись Visual C#.

SortPriority

Это определяет положение корневого узла в дереве Типов проектов .

SortPriority REG_DWORD 0x00000014 (20)

Чем меньше число приоритета, тем выше позиция в дереве.

DeveloperActivity

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

DeveloperActivity REG_SZ VC#

указывает, что Visual C# будет корневым узлом, если Visual Studio настроена для разработки Visual C++. В противном случае он будет дочерним узлом других языков.

Папка

Если этот подраздел присутствует, корневой узел становится дочерним узлом указанной папки. Под ключом появится список возможных папок.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders

Например, запись Проекты базы данных содержит ключ папки, соответствующий записи Другие типы проектов в ПсевдоПапки. Таким образом, в дереве Типы проектовпроекты баз данных будут дочерним узлом других типов проектов.

Дочерние узлы типа проекта и VSTDIR-файлы

Положение дочерних узлов в дереве Типов проектов соответствует иерархии папок в папках ProjectTemplates. Для шаблонов компьютеров (установленные шаблоны Visual Studio) обычно используется \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\, а для шаблонов пользователей (Мои шаблоны) — \Мои документы\Visual Studio 14.0\Templates\ProjectTemplates\. Иерархии папок из этих двух расположений объединяются для создания дерева Типов проектов .

Для Visual Studio с параметрами разработчика C# дерево типов проектов выглядит следующим образом:

Снимок экрана: дерево папок

Соответствующая папка ProjectTemplates выглядит следующим образом:

Снимок экрана: дерево папок

Когда откроется диалоговое окно Новый проект , Visual Studio просматривает папку ProjectTemplates и воссоздает ее структуру в дереве Типов проектов с некоторыми изменениями:

  • Корневой узел в дереве Типов проектов определяется шаблоном приложения.

  • Имя узла может быть локализовано и содержать специальные символы.

  • Порядок сортировки можно изменить.

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

Когда Visual Studio просматривает папки ProjectTemplates, она открывает все .zip файлы и извлекает vstemplate-файлы. VSTEMPLATE-файл использует XML для описания шаблона приложения. Дополнительные сведения см. в разделе Создание нового проекта: под капотом, часть 2.

Тег <ProjectType> определяет тип проекта для приложения. Например, файл \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip содержит файл EmptyProject.vstemplate со следующим тегом:

<ProjectType>CSharp</ProjectType>

Тег <ProjectType> , а не вложенная папка в папке ProjectTemplates, определяет корневой узел приложения в дереве Типов проектов . В этом примере Windows CE приложения будут отображаться в корневом узле Visual C#, и даже если вы переместите папку WindowsCE в папку VisualBasic, Windows CE приложения по-прежнему будут отображаться в корневом узле Visual C#.

Локализация имени узла

Когда Visual Studio просматривает папки ProjectTemplates, она проверяет все VSTDIR-файлы, которые она находит. VSTDIR-файл — это XML-файл, который управляет внешним видом типа проекта в диалоговом окне Новый проект . В VSTDIR-файле используйте <тег LocalizedName> , чтобы присвоить узлу Типы проектов имя.

Например, файл \CSharp\Database\TemplateIndex.vstdir содержит следующий тег:

<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>

Это определяет вспомогательную библиотеку DLL и идентификатор ресурса локализованной строки, которая называет корневой узел, в данном случае — Database. Локализованное имя может содержать специальные символы, недоступные для имен папок, например .NET.

Если тег LocalizedName> отсутствует<, тип проекта называется самой папкой SmartPhone2003.

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

Чтобы определить порядок сортировки для типа проекта, vstdir-файлы используют <тег SortOrder> .

Например, файл \CSharp\Windows\Windows.vstdir содержит следующий тег:

<SortOrder>5</SortOrder>

Файл \CSharp\Database\TemplateIndex.vstdir имеет тег с большим значением:

<SortOrder>5000</SortOrder>

Чем меньше число в теге <SortOrder> , тем выше позиция в дереве, поэтому узел Windows отображается выше узла База данных в дереве Типы проектов .

Если для типа проекта не <указан тег SortOrder> , он отображается в алфавитном порядке после всех типов проектов, содержащих <спецификации SortOrder> .

Обратите внимание, что в папках Мои документы (Мои шаблоны) нет VSTDIR-файлов. Имена типов проектов приложения пользователя не локализованы и отображаются в алфавитном порядке.

Краткий обзор

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

  1. Добавьте вложенную папку MyProjectNode в папку \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp.

  2. Создайте файл MyProject.vstdir в папке MyProjectNode с помощью любого текстового редактора.

  3. Добавьте следующие строки в VSTDIR-файл:

    <TemplateDir Version="1.0.0">
        <SortOrder>6</SortOrder>
    </TemplateDir>
    
  4. Сохраните и закройте VSTDIR-файл.

  5. Создайте файл MyProject.vstemplate в папке MyProjectNode с помощью любого текстового редактора.

  6. Добавьте следующие строки в VSTEMPLATE-файл:

    <VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
        <TemplateData>
            <ProjectType>CSharp</ProjectType>
        </TemplateData>
    </VSTemplate>
    
  7. Сохраните vstemplate-файл и закройте редактор.

  8. Отправьте VSTEMPLATE-файл в новую сжатую папку MyProjectNode\MyProject.zip.

  9. В командном окне Visual Studio введите:

    devenv /installvstemplates
    

    Запустите Visual Studio.

  10. Откройте диалоговое окно Новый проект и разверните узел проекта Visual C# .

    Снимок экрана: дерево папок

    MyProjectNode отображается как дочерний узел Visual C# непосредственно под узлом Windows.

См. также раздел