"Two output file names resolved to the same output path" 在 .NET 应用程序的表单中嵌套多个 .resx 文件时出错

"Two output file names resolved to the same output path" error when nesting more than one .resx file within form in .NET application

我在 Visual Studio 中有一个 Windows Forms .NET 应用程序。制作表单 "Localizable" 会在表单下方添加一个 Form1.resx 文件。我还想为每个表单添加一个单独的 .resx 文件 (Form1Resources.resx)。这用于自定义特定于表单的资源,例如使用后面的代码生成的消息。

这里设置如下:

将自定义 .resx 文件嵌套在表单下方会更整洁(有关嵌套的详细信息,请参见this question),如下所示:

但是,这会导致我在构建应用程序时出现以下错误:

Two output file names resolved to the same output path: "obj\Debug\WindowsFormsApp1.Form1.resources" WindowsFormsApp1

我猜测 MSBuild 使用某种逻辑来查找嵌套的 .resx 文件并根据其父文件生成 .resources 文件。有什么办法可以解决这个问题吗?

请注意,无法将自定义消息添加到 Form1.resx 文件 - 这仅适用于特定于设计的资源,当您在设计模式中保存更改时,您添加的任何资源都会被覆盖。

错误来自 GenerateResource 任务,因为传递的 2 个 resx 文件(msbuild 中的 EmbeddedResource 项目)都具有相同的 ManifestResourceName 元数据值。该值由 CreateManifestResourceNames 任务创建,假设当它看到一个具有 DependentUpon 元数据集的 EmbeddedResource(在您的情况下为 Form1.cs)时,它总是生成某种形式的 '$(RootNamespace).%(DependentUpon)' :您的两个 resx 文件都以 WindowsFormsApp1.Form1 作为 ManifestResourceName 结尾。这可以说是为什么将所有 resx 文件都放在 Form1 下不整洁的原因:这不是为了它,需要额外的摆弄,而且它可能会让其他人感到困惑,因为他们通常希望包含放置在下面的 resx 文件形式包含它总是做的事情。

无论如何:至少有两种方法可以解决这个问题:

  • 有一个名为 CreateCustomManifestResourceNames 的目标,用于创建自定义 ManifestResourceName。对你的情况来说可能有点太多工作,只是为了完整性而提到它
  • 自己手动声明一个不与其他清单冲突的ManifestResourceName;如果元数据已经存在,它不会被
  • 覆盖

通用代码示例:

<EmbeddedResource Include="Form1Resources.resx">
  <DependentUpon>Form1.cs</DependentUpon>
  <ManifestResourceName>$(RootNamespace).%(FileName)</ManifestResourceName>
  ...
</EmbeddedResource>