3

语境

对于某些项目,我们一直在尝试直接从 Visual Studio 进行代码生成。基本思想是您可以创建一堆 ( .foo) 文件,每个 ( .foo) 文件对应一个生成的 ( .foo.cs) 文件。

基本上,该过程的工作原理如下:

  1. 在构建期间,将收集所有 .foo 文件。
  2. 发生了一些转变。请注意,某些转换需要来自所有 .foo 文件的信息。
  3. 对于每个.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 可以提取它们?

4

1 回答 1

1

我有类似的问题:我有基于模板生成一些 .cs 文件的任务。该项目针对 dotnet core 3.1

首先我写

<Target Name="GenerateEnvFiles" BeforeTargets="BeforeBuild;BeforeClean">

构建工作,但智能感知没有。

我正在检查不同的来源,并在 msdn上找到了一篇文章,他们说:

设计时 IntelliSense 要在生成生成输出程序集之前在 Visual Studio 中获得 IntelliSense 支持,必须满足以下条件:

必须有一个名为 Compile 的目标。

尽管设置BeforeTargets=...;Compile不起作用,但设置 CoreCompile 反而对我有用,现在构建和智能感知都可以正常工作。

我假设智能感知分析器有自己的工作流程,其中使用了 BeforeBuild 之外的其他目标。但我没有找到任何关于它使用的确切目标的详细信息。(例如,从上面的 msdn 文章中,我认为BeforeTargets="Compile"应该可以工作,但不能)

于 2020-06-22T14:13:59.710 回答