在 .csproj class 库中自动嵌套文件 (DependentUpon)

Automatically nest files in .csproj class libary (DependentUpon)

我正在生成许多 C# 文件。我希望它们自动嵌套在 Visual Studio 解决方案资源管理器中匹配的 C# 文件下。例如,Foo.Generated.cs 和 Bar.Generated.cs 将分别嵌套在 Foo.cs 和 Bar.cs 下。

如果可能,我希望能够在我的 Directory.Build.props 文件中进行管理,这样我解决方案中的所有 class 库都将具有相同的行为。

版本

尝试 A 失败:

<Compile Update="**\*Generated.cs">
  <DependentUpon>$([System.String]::Copy(%(Filename)).Replace('.Generated', '.cs'))</DependentUpon>
</Compile>

尝试 B 失败:

<Compile Update="**\*Generated.cs">
  <DependentUpon>%(Filename)</DependentUpon>
</Compile>

尝试失败 C:

<Compile Update="**\*Generated.cs">
  <DependentUpon>%(Filename).cs</DependentUpon>
</Compile>

上述方法也已尝试使用:

<ItemGroup>
  <ProjectCapability Include="DynamicDependentFile" />
  <ProjectCapability Include="DynamicFileNesting" />
</ItemGroup>

If possible I'd like to be able to manage this in my Directory.Build.props file, so all the class libraries in my solution will have the same behavior.

首先,我觉得你应该用Directory.Build.targets而不是Directory.Build.props。正如 this document 所示,Directory.Build.props 很早就在 Microsoft.Common.props 中导入,并且在 MSBuild Properties 之后识别 Itemgroup 元素,因此当您在 Directory.Build.props 中添加项目时,这些元素将不会被识别通过 MSBuild。

但是Directory.Build.targets 导入的很晚,MSBuild 那时已经开始识别它们,有了它,您可以添加任何可以识别的项目那个文件。

解决方案

1) 将文件更改为 Directory.Build.targets

2) 添加这些(你的):

<Compile Update="**\*Generated.cs">
  <DependentUpon>$([System.String]::Copy(%(Filename)).Replace('.Generated', '.cs'))</DependentUpon>
</Compile>

在我身边很管用,希望对你有帮助。