winforms 如何防止.resx文件中的嵌套C#类使用同名的.resources文件?

cnh2zyt3  于 2023-01-17  发布在  C#
关注(0)|答案(1)|浏览(179)

为具有.resx文件的C#类生成.resources文件时,Visual Studio 2022仅使用命名空间和外部类名称来生成.resources文件的名称。如果有多个类(具有.resx文件)嵌套在同一个外部类中,则.resources文件的名称将相同,从而导致错误MSB 3577。
有什么办法可以解决这个问题吗?例如,.csproj文件的条目中是否有一个参数来设置输出名称?或者,当涉及到.resx文件时,我是否可以避免使用嵌套类?

背景

为什么我有嵌套的Form类?
有一个类名为 SpecialTrackBar 的C#控件。该类接受 DataItem 对象的集合,因此有 DataItemDataItemCollection 类。用于编辑集合的对话框为 DataItemCollectionEditorDialog
我不想将这些类放在与 SpecialTrackBar 相同的命名空间中,因为它们可能会与其他控件类冲突,而且我不想创建像 SpecialTrackBarDataItemCollectionEditorDialog 这样的超长类名。
使用嵌套类和 SpecialTrackBar.DataItemCollectionEditorDialog 似乎是一个很好的折衷方案。我希望有一个替代的命名解决方案。

复制步骤:

1.在Visual Studio 2022中,使用.NET Framework 4.6.2创建一个名为“NestedResTest”的新Windows窗体控件库。
1.添加两个Windows窗体Dialog 1和Dialog 2。将自动创建文件Dialog1.cs、Dialog1.Designer.cs和Dialog1.resx以及Dialog 2的相应文件。Dialog 1和Dialog 2类都将位于命名空间NestedResTest中。
1.将MSBuild项目生成输出详细程度设置为“诊断”(工具-〉选项-〉项目和解决方案-〉生成并运行)。
1.生成NestedResTest。生成应该成功。在生成输出中搜索包含“OutputResources=”的行,您应该会看到两个.resources文件:嵌套的资源测试对话框1.resources嵌套的资源测试对话框2.resources
1.编辑Dialog1.cs和Dialog1.Designer.cs,并将Dialog 1类放入分部类InnerClass中。
1.生成NestedResTest。生成应该成功。在生成输出中搜索包含“OutputResources=”的行,您应该会看到两个.resources文件:嵌套资源测试.内部类.资源嵌套资源测试.对话框2.资源
1.编辑Dialog2.cs和Dialog2.Designer.cs,并将Dialog 2类放入分部类InnerClass中。
1.生成NestedResTest。生成应失败,并出现错误MSB 3577。在生成输出中搜索包含“OutputResources=”的行,您应看到两个.resources文件,这两个文件具有相同的名称:NestedResTest.InnerClass.resources

hgc7kmma

hgc7kmma1#

我假设您知道嵌套Form类的主要后果是失去了对设计窗体的设计器支持。
也就是说,如果要修复资源名称问题,可以使用以下选项之一控制how the resource manifest files named

  • 指定<ManifestResourceName>
  • 或指定<LogicalName>
  • 或者删除<DependentUpon>
    示例-控制清单资源名称的生成方式

1.右键单击一个项目并卸载该项目
1.找到您感兴趣的<EmbeddedResource>,然后执行下列操作之一:

  • 指定<ManifestResourceName> *
<EmbeddedResource Include="Dialog1.resx">
    <ManifestResourceName>RealProxyExample.Dialog1</ManifestResourceName>
    <DependentUpon>Dialog1.cs</DependentUpon>
</EmbeddedResource>
  • 或指定<LogicalName> *
<EmbeddedResource Include="Dialog1.resx">
    <LogicalName>RealProxyExample.Dialog1.resources</LogicalName>
    <DependentUpon>Dialog1.cs</DependentUpon>
</EmbeddedResource>
  • 或删除<DependentUpon> *
<EmbeddedResource Include="Dialog1.resx">
</EmbeddedResource>

1.右键单击项目并重新加载。
生成并运行项目。您将看到资源已应用并按预期工作。

相关问题