语境
对于某些项目,我们一直在尝试直接从 Visual Studio 进行代码生成。基本思想是您可以创建一堆 ( .foo
) 文件,每个 ( .foo
) 文件对应一个生成的 ( .foo.cs
) 文件。
基本上,该过程的工作原理如下:
- 在构建期间,将收集所有 .foo 文件。
- 发生了一些转变。请注意,某些转换需要来自所有 .foo 文件的信息。
- 对于每个
.foo
文件,.foo.cs
都会发出一个带有部分类的文件。
通常我会为此创建一个文件生成器(自定义工具) - 但是,在这种情况下,我想知道文件名始终是.foo.cs
,并且似乎没有办法可以从单个文件生成器。此外,构建需要来自多个文件的信息这一事实使我选择了另一种方法。
因此,我创建了一个 MS Build Task,并在 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 在我单击“构建”之前不起作用 - 那很好。
情况
现在的问题是.foo.cs
文件的 Intellisense 已损坏,我正在寻找解决此问题的方法。
我试图通过.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 可以提取它们?