VS2010 MPF: заполнение списка "Добавить-> Новый элемент..." для пользовательского проекта

Я создал собственный языковой пакет, который расширяет ProjectPackage. Я могу правильно создать новый проект. Я хотел бы иметь возможность добавлять новые исходные файлы в проект с помощью пункта меню Add->New Item... (Ctrl+Shift+A). Однако, когда я нажимаю эту кнопку, список доступных шаблонов становится пустым. Я хотел бы добавить свой собственный шаблон в меню доступных шаблонов для этого типа проекта. Есть ли документация для этого? Единственные упоминания, которые я видел, были взломами реестра, но должен быть способ сделать это программно, я думаю.

Есть ли конкретный метод, который я могу переопределить, чтобы заполнить список? Мне действительно нужно сделать шаблон или я могу просто показать "имя шаблона", "значок" и указать правильное расширение файла (файлы должны быть пустыми при создании, поэтому я думаю, что шаблон в значительной степени тратится на то, что я хочу сделать).

Вот путь, по которому я до сих пор путешествовал. Я решил, что могу установить тип своего проекта и GUID в моем пользовательском файле.vproj (.vproj - это расширение файла, под которым зарегистрирован мой пользовательский проект). Я думал, что смогу быстро создать шаблон элемента с тем же ProjectType, что и мой файл.vproj.

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">
  <TemplateData>
    <Icon>VerilogSource.ico</Icon>
    <DefaultName>module.v</DefaultName>
    <Name>Basic Verilog Module</Name>
    <Description>
      A basic Verilog module for quickly adding new files to the project.
    </Description>
    <ProjectType>VerilogProject</ProjectType>
  </TemplateData>
  <TemplateContent>
    <ProjectItem TargetFileName="$fileinputname$.v"
        ReplaceParameters="true">module.v</ProjectItem>
  </TemplateContent>
</VSTemplate>

Увы, этот шаблон вообще не отображается, хотя я включил его в VSIX и скопировал в выходной каталог. Если я помещу этот шаблон в ту же папку, что и мой.vproj, он появится в качестве шаблона для создания нового проекта (неправильно!) И все равно не появится в моем списке новых элементов. Все это может быть связано с тем, что я не использую VSTemplate для создания своего проекта. Вместо этого я использую [ProvideProjectFactoryAttribute], чтобы сообщить VS2010, где находится мой файл vproj, и он будет использовать файл vproj (который, я полагаю, можно назвать шаблоном, но это не VSTemplate, это проект) для создания нового проект от.

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

Giawa

2 ответа

Решение

После долгого чтения и работы вот мой ответ:

Используйте файлы vstemplate для своего проекта и элементов и скомпилируйте их как vstemplate (не копируйте в вывод, не включайте в VSIX, в отличие от того, что предлагает Microsoft Walkthrough). Компилятор упакует каждый элемент и шаблон проекта в свой собственный zip-файл. Теперь вам нужно сообщить vsixmanifest, где находятся эти файлы. Каталогами по умолчанию для проектов и элементов являются ProjectTemplates и ItemTemplates соответственно. Добавьте их в свой vsixmanifest примерно так:

  <Content>
    <VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
    <ProjectTemplate>ProjectTemplates</ProjectTemplate>
    <ItemTemplate>ItemTemplates</ItemTemplate>
  </Content>

Теперь вы также должны добавить некоторые свойства в ваш файл.csproj, в который встроен ваш пакет vsix. Эти свойства, вероятно, можно добавить с помощью какого-то сложного метода, но проще всего просто поместить их непосредственно в файл.csproj.

  <PropertyGroup>
    <GetVsixSourceItemsDependsOn>$(GetVsixSourceItemsDependsOn);GetVsixTemplateItems</GetVsixSourceItemsDependsOn>
  </PropertyGroup>
  <Target Name="GetVsixTemplateItems" DependsOnTargets="ZipProjects;ZipItems">
    <ItemGroup>
      <VSIXSourceItem Include="@(IntermediateZipItem)">
        <VSIXSubPath>ItemTemplates\%(IntermediateZipItem.Language)\%(IntermediateZipItem.OutputSubPath)\%(IntermediateZipItem.Culture)</VSIXSubPath>
      </VSIXSourceItem>
      <VSIXSourceItem Include="@(IntermediateZipProject)">
        <VSIXSubPath>ProjectTemplates\%(IntermediateZipProject.Language)\%(IntermediateZipProject.OutputSubPath)\%(IntermediateZipProject.Culture)</VSIXSubPath>
      </VSIXSourceItem>
    </ItemGroup>
  </Target>

Теперь это будет включать ваши zip-файлы в ваш проект, и, если повезет, у вас теперь будут проекты и элементы, которые правильно связаны друг с другом.

К счастью, существует довольно много документации для шаблонов элементов / проектов. Мне потребовалось некоторое время, чтобы понять, что это правильный путь. Удачи,

Giawa

Все эти шаги могут быть выполнены автоматически в Visual Studio:

Сначала создайте шаблон элемента в отдельном проекте (вы можете сделать это с помощью File > Export template). Вы можете настроить этот шаблон, отредактировав .vstemplate файл.

После того, как вы получили .zip файл, перетащите его на свой главный VSPackage Решение и сделайте следующее:

  1. Нажмите на .vsixmanifest файл.
  2. Нажмите на Assets > New,
  3. Задавать Type в Microsoft.VisualStudio.ItemTemplate (Шаблон товара).
  4. Установить Source в File on filesystem,
  5. Установить Path к вашему шаблону товара .zip файл.
  6. Восстановите решение.

Примечание: я использовал Visual Studio 2013.

Другие вопросы по тегам