资源(RESX)文件损坏

7
我有一个名为Localize.resx的资源文件,其中包含英文字符串。我将其复制并粘贴到同一文件夹(App_GlobalResources)中,VS创建了一个副本,我将副本重命名为Localize.sl.resx,原始文件重命名为Localize.en.resx。现在,在代码后台文件(Localize.en.designer.cs)中的所有内容都消失了。删除设计者文件并选择运行自定义工具会生成一个全新但完全空白的设计者文件。
我仍然拥有两个resx文件中的所有字符串,但设计者文件已经丢失(为空),因此应用程序无法构建。
这是在ASP.NET MVC解决方案中使用的VS 2010中的情况。
5个回答

9
我遇到了同样的问题 - 一些resx文件中没有Designer.cs文件。
解决方法是设置resx文件的属性:
Build Action - Embedded Resource
Custom Tool  - PublicResXFileCodeGenerator

9

这是 ASP.NET文档 关于资源文件的说法。

它没有具体谈论即时生成的代码后端设计师文件,但如果您仔细阅读加粗的文本,实际上它是在说您需要没有指定语言的基本文件,并且鉴于这一点,只有此文件将包括自动生成的代码。

"创建资源文件时,首先创建一个基本 .resx 文件。对于每个要支持的语言,请创建一个具有相同文件名的新文件。但在名称中,包含语言或语言和文化(区域名称)。有关区域名称的列表,请参见 CultureInfo 类。例如,您可能会创建以下文件:

•WebResources.resx

基本资源文件。这是默认(回退)资源文件。

•WebResources.es.resx

一个用于西班牙语的资源文件。

•WebResources.es-mx.resx

一个针对西班牙语(墨西哥)的资源文件。

•WebResources.de.resx

一个德语的资源文件。 实际上我以前从未注意过这一点,但当我去检查我的旧项目时,我发现它们都有基础文件和特定语言的文件。所以我纠正了它,按照惯例进行,并且现在它可以工作了。

是的,但只有所有文件中具有相同根文件名的一个文件会生成自动设计师代码,而这个文件没有语言说明符。这是有道理的,因为在代码中使用时,您只使用一个类名(假设我们正在谈论全局资源,并且这些资源位于Resources命名空间中,默认情况下)。 - mare
抱歉 @mare,我错了 :) resx 是包含字符串的“xml类型”结构。你是正确的,只有一个代码后台,它用于将 resx 链接到资源管理器。尽管如此... 它为每个 resx 生成一个 cs 文件(除了默认文件之外都为空)。 - Nealv

2
如果我是你,我会:
创建一个新的resx文件; 打开旧文件; 在旧文件中按下ctrl+a; 在新文件中按下ctrl+v; 保存新文件; 删除旧文件; 重命名新文件 :)
这样可以很快地解决问题。 您还可以通过单击“显示所有”按钮来检查cs文件是否未被排除在文件之外。

你知道吗,这个方法实际上是有效的,直到我重命名新文件之前,原来的Resource1.resx和它的设计文件中充满了代码,但在重命名为Localize.sl.resx后,设计文件中的所有代码都消失了。 - mare
嗯,奇怪,你的自定义工具设置为GlobalResourceProxyGenerator了吗? @edit 还要检查一下,如果你删除旧的,在你的Windows文件夹中(在VS之外检查),你的旧resx、cs和designer类是否被删除。我认为它们仍然存在,只是在VS项目中被排除了。 - Nealv
我发现显然是“点”符号给他造成了问题,因为如果我将其重命名为Resources54.resx,则可以正常工作。 我认为使用.lang标识符,VS正在尝试创建Localize.sl或Localize.en类,但他当然无法做到这一点。 是的,那是我的自定义工具集。 有什么想法? - mare
很奇怪,我刚刚做了完全相同的步骤,在我的App_Glob..中复制并粘贴了一个resx文件,然后将其重命名为Localized.sl.resx,没有任何问题。是否仍有来自Visual Studio的Web服务器在运行?如果是,请停止它们所有。(仍然相信可能有一些被排除的文件 :)) - Nealv
这真的很奇怪。如果我将其重命名为work Localize.sl2.resx,则设计文件会生成一个包含类sl2的文件,但如果我将其命名为Localize.sl.resx,则设计文件为空。C#中的“sl”可能是保留字吗? - mare
不,它没有被保留,我之前试过了。+ 我认为这不会影响系统。尝试创建一个简单的新项目,添加一个resx文件,并将其命名为somethin.sl.resx。如果这样可以工作,那么这意味着名称...nameyouhave.sl.resx已被系统锁定,当VS想要生成它时,它无法生成,因为它会“覆盖”“锁定”的文件->然后重新启动将有所帮助 :) - Nealv

0

我发现最好的方法是:

  • 将文件创建为默认文件:Resource1.resx
  • 让它创建:Resource1.Desinger.cs
  • 将其重命名为您想要的语言,例如:Localize.en.resx

对我来说,任何其他方法都无法创建X.Designer.cs文件。


0

很抱歉使用这个来写评论。我的声望实际上少于50 =( 但我认为这也可能很重要。

这是指Alvis的答案: 你的解决方案起了作用。但我还必须修改基本设计代码文件中属性的访问修饰符,从internal改为public。否则,在尝试在xaml中访问resx时,我会遇到XmlParseExceptions。

编辑: 所以这是指C#/WPF。在ASP.NET中可能会有所不同。


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