Добавление функций 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.