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
Решение и сделайте следующее:
- Нажмите на
.vsixmanifest
файл. - Нажмите на
Assets > New
, - Задавать
Type
вMicrosoft.VisualStudio.ItemTemplate
(Шаблон товара). - Установить
Source
вFile on filesystem
, - Установить
Path
к вашему шаблону товара.zip
файл. - Восстановите решение.
Примечание: я использовал Visual Studio 2013.