Генератор одного файла не работает для стандартных проектов.NET в Visual Studio 2017

Я реализовал Генератор одного файла на основе шаблона [1] (который компилируется в устанавливаемый вывод VSIX, включая автоматическую регистрацию компонентов) и:

  • Он работает для классических.NET проектов в VS 2015 и VS2017;
  • Он работает для проектов.NET Core в VS2017;
  • Но не работает для проектов.NET Standard в VS2017.

пример

Все HasCustomTool.xml файлы имеют одинаковую конфигурацию, для всех них указан атрибут "Custom Tool".

Когда я смотрю на .csproj файлы, я вижу, что они разные. (Рабочее) содержание DotNetCore.csproj файл:

  <ItemGroup>
    <Compile Update="HasCustomTool.cs">
      <DependentUpon>HasCustomTool.xml</DependentUpon>
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <None Update="HasCustomTool.xml">
      <LastGenOutput>HasCustomTool.cs</LastGenOutput>
      <Generator>PtResxErrorTool</Generator>
    </None>
  </ItemGroup>

Тогда как DotNetStandard.csproj файл имеет:

  <ItemGroup>
      <None Update="HasCustomTool.xml">
          <LastGenOutput>HasCustomTool.cs</LastGenOutput>
          <Generator>PtResxErrorTool</Generator>
      </None>
  </ItemGroup>

Когда вы копируете разметку из DotNetCore.csproj к DotNetStandard.csproj (вручную), вы получите желаемую структуру - но генератор никогда не активируется.

Кто-нибудь успешно написал генератор файлов VSIX для проектов.NET Standard? Любые указатели о том, как отладить эту проблему?

[1] https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Single_File_Generator

1 ответ

Решение

Вам нужно добавить новый CodeGeneratorRegistration в ваш класс.

"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"

в моем случае мой класс decl выглядел как

[ComVisible(true)]
[Guid(GuidList.GuidI18NReactivetring)]
[ProvideObject(typeof(I18NReactive))]
[CodeGeneratorRegistration(typeof(I18NReactive), "I18N.Reactive", vsContextGuids.vsContextGuidVCSProject, GeneratesDesignTimeSource = true)]
[CodeGeneratorRegistration(typeof(I18NReactive), "I18N.Reactive", "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}", GeneratesDesignTimeSource = true)]
public class I18NReactive : IVsSingleFileGenerator, IObjectWithSite
{
}

Информация об источнике пришла из этой темы

https://github.com/aspnet/Tooling/issues/394

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