C# msbuild何时使用新的“隐式”csproj格式确定要生成的文件列表?

C# msbuild何时使用新的“隐式”csproj格式确定要生成的文件列表?,c#,msbuild,csproj,C#,Msbuild,Csproj,Visual Studio 2019,使用新的“隐式”C项目格式,在csproj中不包含文件 有一个生成两个.cs文件的预构建作业,但显然,当msbuild在预构建事件后调用csc时,它不会将这两个文件包含在要编译的文件列表中。我甚至尝试过引入30秒的延迟。因此,看起来msbuild在运行预生成事件之前修复了文件列表 显然,在第一次之后,这不是一个问题,但在构建服务器或新的开发环境中,这并不好 有清洁的解决方案吗?找到了解决方案: 将InitialTargets属性添加到项目元素: <Pr

Visual Studio 2019,使用新的“隐式”C项目格式,在csproj中不包含文件

有一个生成两个.cs文件的预构建作业,但显然,当msbuild在预构建事件后调用csc时,它不会将这两个文件包含在要编译的文件列表中。我甚至尝试过引入30秒的延迟。因此,看起来msbuild在运行预生成事件之前修复了文件列表

显然,在第一次之后,这不是一个问题,但在构建服务器或新的开发环境中,这并不好

有清洁的解决方案吗?

找到了解决方案:

将InitialTargets属性添加到项目元素:

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="Generation">
将预构建更改为此

<Target Name="Generation">
  <Exec Command="whatever" />
</Target>

请注意,如果您打开了Visual Studio,这几乎太好了,因为即使没有构建,文件也会自动重新出现

如果编译项中没有这些文件,则需要手动将其添加到编译项中:

<Target Name="GenerateStuff" BeforeTargets="BeforeBuild">
  <Exec Command="generate foo.cs" />
  <ItemGroup>
    <Compile Include="foo.cs" Exclude="@(Compile)" />
  </ItemGroup>
</Target>
此符号还支持通配符Include=gen*.cs