Добавление функций VSIX в библиотеку классов C#
У меня есть существующий генератор с одним файлом (размещенный в библиотеке классов C#). Как добавить функции уровня проекта VSIX в этот проект? Конечная цель-скомпилировать проект библиотеки классов и получить VSIX.
(на самом деле я отвечаю на свой собственный вопрос. Это относится к изменения генератора одного файла в Visual Studio 2017 - но этот вопрос не спрашивал, что я отвечаю здесь.)
2 ответов
во-первых,
ваш класс генератора одного файла должен иметь соответствующие атрибуты уровня класса:
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell;
using VSLangProj80;
[ComVisible(true)]
[Guid("your-unique-identifier")]
[CodeGeneratorRegistration(
typeof(MyCustomTool),
"MyCustomTool",
vsContextGuids.vsContextGuidVCSProject,
GeneratesDesignTimeSource = true,
GeneratorRegKeyName = "MyCustomTool"
)]
[ProvideObject(
typeof(MyCustomTool),
RegisterUsing = RegistrationMethod.CodeBase
)]
public sealed class MyCustomTool : IVsSingleFileGenerator {
все эти атрибуты гарантируют, что a .файл pkgdef правильно генерируется в вашем VSIX. Этот.файл pkgdef содержит записи реестра, используемые для регистрации генератора одиночных файлов в Visual Studio.
во-вторых,
добавить текстовый файл "источник.расширение.vsixmanifest " к вашему проекту. Его " Построить Действие" должно быть "нет."Дайте ему текст по умолчанию:
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Id="MyCustomTool.MyCompany.another-random-guid" Version="1.0" Language="en-US" Publisher="MyCompany" />
<DisplayName>MyCustomTool</DisplayName>
<Description>Helpful information</Description>
</Metadata>
<Installation>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0]" />
</Installation>
<Dependencies>
<Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="[4.5,)" />
</Dependencies>
<Prerequisites>
<Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0,16.0)" DisplayName="Visual Studio core editor" />
</Prerequisites>
</PackageManifest>
большинство этих вещей довольно эзотерические. На следующем шаге мы сделаем так, чтобы вы могли редактировать этот файл с помощью дизайнера.
третий
(и чтобы ответить на первоначальный вопрос), вам нужно справиться .файл csproj (ваш файл библиотеки классов C#). В частности, вам нужно добавить следующее:
<PropertyGroup>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
<ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<ItemGroup>
<None Include="source.extension.vsixmanifest">
<SubType>Designer</SubType>
</None>
</ItemGroup>
<PropertyGroup>
<UseCodebase>true</UseCodebase>
</PropertyGroup>
<Import Project="$(VSToolsPath)\VSSDK\Microsoft.VsSDK.targets" Condition="'$(VSToolsPath)' != ''" />
Итак, что мы имеем здесь? Давайте разберемся.
во-первых, мы настраиваем путь в расположение группы инструментов Visual Studio. В конце концов, теперь это проект "расширения."Таким образом, он должен знать, где находится VS-SDK.
затем мы изменили "ProjectTypeGuids" (который, вероятно, не был в вашем файле проекта для начала). Первоначально он просто включал guid для C# (который является "FAE04EC0-..." идентификатор GUID.) Теперь он также включает guid для VSIX (который является "82b43b9b-..." идентификатор GUID.)
мы также убедились, что "источник.расширение.файл vsixmanifest" использует его новый, причудливый дизайнер (вместо редактирования файла вручную).
элемент "UseCodeBase" является важным. Этот элемент предотвращает принудительную регистрацию генератора в реестре COM системы. Вместо этого Visual Studio просто загрузит генератор из места установки.
внизу мы импортируем материал MsBuild для VS-SDK.
В-четвертых,
загрузите проект обратно. Перейдите на экран свойств проекта и вы увидите новый раздел "VSIX" внизу. Откройте этот раздел и установите флажок "создать контейнер VSIX во время сборки".
на этом этапе вы также можете дважды проверить " источник.расширение.файл vsixmanifest". В зависимости от фантазии вашего генератора, вы можете изменить все, что вам нужно. (Содержимое файла, который я вставил выше, в значительной степени именно то, что я использовал для своего проекта.)
и наконец-то,
вы можете скомпилировать ваш проект. В в папке bin вы найдете MyCustomTool.dll и MyCustomTool.VSIX-файл. Этот.файл vsix-это просто zip-файл. Внутри .vsix, вы найдете MyCustomTool.pkgdef для редактирования.
если мы все сделали правильно, то .файл pkgdef должен выглядеть примерно так:
[$RootKey$\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\MyCustomTool]
@="MyCustomTool"
"CLSID"="{your-unique-identifier}"
"GeneratesDesignTimeSource"=dword:00000001
[$RootKey$\CLSID\{your-unique-identifier}]
@="MyCustomTool"
"InprocServer32"="$WinDir$\SYSTEM32\MSCOREE.DLL"
"Class"="MyCustomTool"
"CodeBase"="$PackageFolder$\MyCustomTool.dll"
"ThreadingModel"="Both"
и, я думаю, это самый длинный ответ, который я написал. И, наверное, только 5 человек когда-нибудь прочтут это:)
если вместо реализации IVsSingleFileGenerator
в вашем классе ваш класс наследуется от абстрактного класса BaseCodeGeneratorWithSite
который наследуется от абстрактного класса BaseCodeGenerator
что реализует IVsSingleFileGenerator
вам нужно добавить следующий атрибут в свой класс, чтобы избежать сообщения об ошибке "не удается найти пользовательский инструмент"..."по этой системе":
[ClassInterface(ClassInterfaceType.None)]
причина в том, что абстрактный класс BaseCodeGeneratorWithSite
не отображается COM.