Контекст
В некоторых проектах мы пытались выполнить генерацию кода непосредственно из Visual Studio. Основная идея заключается в том, что вы можете создать группу (.foo
) файлов, и каждый (.foo
) файл соответствует одному сгенерированному (.foo.cs
) файлу.
В основном процесс работает следующим образом:
- Во время сборки собираются все файлы .foo.
- Некоторые преобразования происходят. Обратите внимание, что для некоторых преобразований требуется информация из всех файлов .foo.
- Для каждого файла
.foo
создается файл .foo.cs
с частичным классом.
Обычно я бы создал для этого один генератор файлов (пользовательский инструмент) - однако в этом случае я хотел бы знать, что имя файла всегда .foo.cs
, и, похоже, нет способа может управляться из одного генератора файлов. Кроме того, тот факт, что для сборки требуется информация из нескольких файлов, заставил меня выбрать альтернативный подход.
Поэтому я создал задачу сборки MS и зарегистрировал ее в csproj:
<UsingTask AssemblyFile="C:\Projects\FooTool\bin\Debug\FooBuildTool.dll"
TaskName="FooBuildTool.FooTool" />
<Target Name="Foo" BeforeTargets="BeforeBuild"
Condition="'$(MSBuildProjectExtension)' == '.csproj'">
<FooTool Language="C#" ProjectFolder="$(ProjectDir)"
ProjectName="$(ProjectName)" Sources="@(Foo)">
<Output ItemName="FooCompile" TaskParameter="ComputedSources" />
</FooTool>
<ItemGroup>
<Compile Include="@(FooCompile->'%(Outputs)')" />
</ItemGroup>
</Target>
Это прекрасно работает в том смысле, что работает генерация кода и генерирует все необходимые .cs
файлы.
Обратите внимание, что если Intellisense не работает, пока я не нажму 'build' - это нормально.
Положение
Проблема в том, что Intellisense не работает для файлов .foo.cs
, и я ищу способ исправить это.
Я попытался исправить это, изменив файл .csproj
еще больше:
<Compile Include="Test.foo.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Test.foo</DependentUpon>
</Compile>
...
<Foo Include="Test.foo" Generator="Foo" LastGenOutput="Test.foo.cs" />
Кажется, это работает, в том смысле, что файлы теперь отображаются в обозревателе решений Visual Studio.
Однако я не знаю, как создать это автоматически, и не смог найти ни документации, ни примера об этом. Я предполагаю, что это связано с созданием правильного VSTemplate?
Вопрос
Как правильно решить эту проблему? Например. Как я могу убедиться, что сгенерированные файлы отображаются в Visual Studio, чтобы Intellisense мог их забрать?