我需要resx Designer.cs文件吗?

18

我们公司使用一些数据库表、网页前端和一个“导出”应用程序来处理我们网站中的字符串资源。

在使用VS2008时,“导出”应用程序运行良好,但自从切换到VS2010以后,解决方案资源管理器中的资源现在下面多了一个 designer.cs 文件。

问题在于,“导出”应用程序仅生成 .resx 文件,而不是底层的 designer.cs 文件。

那么,有没有方法可以不要这些 designer.cs 文件,或者另外一种方法是自动重新生成它们(甚至是一些命令导出应用程序可以调用来重新生成它们)?

5个回答

16

我曾经遇到一个问题,即VS 2010无法重新生成Designer.cs文件,并且在其他地方也找不到解决方案。

然而,我成功地重新生成了Designer.cs文件,而没有去使用命令行。

为了解决Visual Studio 2010的这个问题,我以下列步骤进行操作:

  1. 删除Designer.cs文件
  2. 右键单击主resx文件
  3. 选择Run Custom Tool

这将重新生成Designer.cs文件。

希望我的经验可以在未来帮助其他人解决同样的问题。


1
当然,resx文件的Custom Tool属性应该包含类似于PublicResXFileCodeGenerator的内容(一旦您编辑了该字段,设计师文件就会自动生成)。 - ekkis
我们使用自定义工具从语言服务器同步resx文件。这个技巧非常适用于让VS重新构建相关的代码后台文件! - Will Johnson

12

根据MSDN的说明:

将资源编译为程序集

当您构建应用程序时,Visual Studio会调用resgen.exe 工具将应用程序资源转换为名为 Resources 的内部类。该类包含在“解决方案资源管理器”下的Resources.resx文件中嵌套的 Resources.Designer.cs 文件中。 Resources 类封装了所有项目资源成为静态只读获取属性,以提供强类型的运行时资源。当您通过Visual C# IDE建立时,所有封装好的资源数据,包括被嵌入到 .resx 文件中和链接的文件,都会直接编译成应用程序集(即 .exe 或 .dll 文件)。换句话说,Visual C# IDE 总是使用 /resource 编译器选项。如果您从命令行中构建,则可以指定 /linkresource 编译器选项,这将使您能够将资源部署在与主应用程序集分开的文件中。这是一个高级场景,只在某些特殊情况下才需要。


1
谢谢,有时候只是知道该搜索什么 :)我会在周一早上查看。 - Antony Scott
2
太棒了,我刚刚修改了我的导出应用程序,如果在与.resx文件相同的文件夹中还有.designer.cs文件(> 0字节),则运行resgen工具。 (我等不及星期一了,好奇心占了上风) - Antony Scott
1
嗯,这似乎没有完全正确地工作。它编译得很好,但当我运行它时应用程序崩溃了。因此,我尝试了另一种方法,几乎可以工作。我已经开始了一个新的问题,因为它是一个稍微不同的问题。https://dev59.com/qE_Sa4cB1Zd3GeqP8gMW - Antony Scott

5
如果您希望在构建项目时自动生成*.designer.cs文件,以下方法适用于我们,也可能适用于您:
1. 关闭您的解决方案。 2. 以XML文件的形式打开要自动生成设计文件的项目文件。请注意,您需要将其作为XML文件加载。您无法通过项目属性页面编辑这些设置。 3. 按以下方式向项目添加目标:
``` ```
4. 找到名为“BeforeBuild”的目标。该目标可能被注释掉(默认情况下)。 5. 修改“BeforeBuild”目标如下:
``` ```
需要注意的是,此解决方案基于所有资源文件在项目文件的ItemGroup中列为“EmbeddedResource”,例如:
<ItemGroup>
  <EmbeddedResource Include="Resources\Creditor\Display_Creditor.resx">
    <Generator>PublicResXFileCodeGenerator</Generator>
    <LastGenOutput>Display_Creditor.Designer.cs</LastGenOutput>
    <CustomToolNamespace>Acme.Web.Resources.Creditor</CustomToolNamespace>
  </EmbeddedResource>
  <EmbeddedResource Include="Resources\InboundEmail\Tooltip_InboundEmailDetails.resx">
    <Generator>PublicResXFileCodeGenerator</Generator>
    <LastGenOutput>Tooltip_InboundEmailDetails.Designer.cs</LastGenOutput>
    <CustomToolNamespace>Acme.Web.Resources.InboundEmail</CustomToolNamespace>
  </EmbeddedResource>
  <EmbeddedResource Include="Resources\Creditor\Tooltip_CreditorDetails.resx">
    <Generator>PublicResXFileCodeGenerator</Generator>
    <LastGenOutput>Tooltip_CreditorDetails.Designer.cs</LastGenOutput>
    <CustomToolNamespace>Acme.Web.Resources.Creditor</CustomToolNamespace>
  </EmbeddedResource>
</ItemGroup>

免责声明:此代码已在Visual Studio 2013和C#项目中进行了测试。它可能适用于其他项目和/或其他版本的Visual Studio,也可能不适用。


它可以与VS2015一起使用。不过有一个小问题:我必须提供“CustomToolNamespace”,否则它会生成一个与“.resx”文件同名的“.cs”文件。 - Caramiriel

1

尝试以下操作:

  • 右键单击 resx 文件
  • 点击属性
  • 设置属性:
  • 复制到输出目录:始终复制
  • 自定义工具:PublicResXFileCodeGenerator

保存并重新构建。 问题解决。


在我删除了 designer.cs 文件之后,你提到的步骤才有效。 - Hedego

0

按照以下步骤对我有用:

  • 删除您的 designer.cs 文件。
  • 单击属性
  • 输出目录 - 始终复制。
  • 自定义工具:PublicResXFileCodeGenerator
  • 保存并构建。
  • 右键单击 resx 并
  • 单击运行自定义工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接