gpt4 book ai didi

c# - 使用通过 Intellisense 生成代码的 MSBuild 任务的正确方法

转载 作者:行者123 更新时间:2023-12-04 17:43:55 24 4
gpt4 key购买 nike

语境

对于某些项目,我们一直在尝试直接从 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 可以获取它们?

    最佳答案

    我有类似的问题:我有一个基于模板生成一些 .cs 文件的任务。该项目的目标是 dotnet core 3.1
    首先我写

    <Target Name="GenerateEnvFiles" BeforeTargets="BeforeBuild;BeforeClean">
    构建有效,但智能感知没有。
    我正在检查不同的来源,发现 an article on msdn他们说:

    Design-time IntelliSenseTo get IntelliSense support in Visual Studio before a build has generated an output assembly, the following conditions must be met:


    There must be a target named Compile.


    虽然设置 BeforeTargets=...;Compile没有用,设置 CoreCompile 反而对我有用,现在构建和智能感知都可以正常工作。
    我假设智能感知分析器有自己的工作流程,其中使用了除 BeforeBuild 之外的其他目标。但我没有找到有关它使用的确切目标的任何详细信息。(例如,从上面的 msdn 文章中,我认为 BeforeTargets="Compile" 应该可以工作,但它没有)

    关于c# - 使用通过 Intellisense 生成代码的 MSBuild 任务的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53102951/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com