我在Visual Studio中有一个Windows Forms .NET应用程序。制作表格"可本地化"添加嵌套在窗体下面的Form1.resx文件。我还想为每个表单添加一个单独的.resx文件(Form1Resources.resx)。这用于自定义表单特定资源,例如使用后面的代码生成的消息。
设置如下:
将自定义.resx文件嵌套在表单下面会更整洁(有关nest如何执行此操作的详细信息,请参阅this question),如下所示:
但是,当我构建应用程序时,这会导致以下错误:
两个输出文件名解析为相同的输出路径: "物镜\调试\ WindowsFormsApp1.Form1.resources" WindowsFormsApp1
我猜测MSBuild使用一些逻辑来查找嵌套的.resx文件并根据其父级生成.resources文件。有什么方法可以解决这个问题吗?
请注意,无法向Form1.resx文件添加自定义消息 - 这仅适用于特定于设计的资源,并且在设计模式下保存更改时,您添加的所有资源都会被覆盖。
答案 0 :(得分:1)
错误来自GenerateResource任务,因为传递的两个resx文件(msbuild中的EmbeddedResource项目)具有相同的ManifestResourceName元数据值。这些值由CreateManifestResourceNames任务创建,并且当它看到具有DependentUpon元数据集的EmbeddedResource时(在您的情况下为Form1.cs),它总是生成一些形式的' $(RootNamespace)。%(DependentUpon) ':你的resx文件最终都以WindowsFormsApp1.Form1作为ManifestResourceName。这可以说是为什么在Form1下使用所有resx文件不够整洁的原因:它不适合它,需要额外的摆弄,而且它可能会让其他人感到困惑,因为他们通常希望包含resx fils放在一个表单下面,以包含它总是做的事情。
无论如何:至少有两种方法可以解决这个问题:
通用代码示例:
<EmbeddedResource Include="Form1Resources.resx">
<DependentUpon>Form1.cs</DependentUpon>
<ManifestResourceName>$(RootNamespace).%(FileName)</ManifestResourceName>
...
</EmbeddedResource>