"两个输出文件名解析为相同的输出路径"在.NET应用程序

时间:2017-11-03 22:01:32

标签: forms msbuild resx

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

设置如下:

Standard project files

将自定义.resx文件嵌套在表单下面会更整洁(有关nest如何执行此操作的详细信息,请参阅this question),如下所示:

Project files with nested resx file

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

  

两个输出文件名解析为相同的输出路径:   "物镜\调试\ WindowsFormsApp1.Form1.resources" WindowsFormsApp1

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

请注意,无法向Form1.resx文件添加自定义消息 - 这仅适用于特定于设计的资源,并且在设计模式下保存更改时,您添加的所有资源都会被覆盖。

1 个答案:

答案 0 :(得分:1)

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

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

  • 有一个名为CreateCustomManifestResourceNames的Target,用于创建自定义ManifestResourceName。对你的案子来说可能有点太多了,只要提一下它的完整性
  • 自己手动声明一个ManifestResourceName,它不会与其他人发生冲突;如果元数据已经存在,则不会被
  • 覆盖

通用代码示例:

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