【问题标题】:Visual Studio creates invalid Resx filesVisual Studio 创建无效的 Resx 文件
【发布时间】:2011-05-07 03:40:43
【问题描述】:

我想要本地化一个非常简单的表单(实际上我在这个项目中有很多,它们都有相同的问题)。当我将表单属性 Localizable 设置为 true 时,Visual Studio 会生成一个带有表单名称的 .resx 文件(如您所料)。但问题是它在 .resx 文件中添加了其他任何东西都无法打开的东西(例如 WinRes、ResEx、Simple Resx 编辑器、RESX 编辑器等)。

我得到的错误是:

ResX 文件类型 System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 第 125 行的数据,位置 4 无法定位。 第 127 行,位置 5。无法解析。

第 124 到 127 行是:

<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="lblUsername.Location" type="System.Drawing.Point, System.Drawing">
  <value>26, 24</value>
</data>

现在我假设 Visual Studio 正在添加此功能,以便我可以根据语言移动按钮等(我不需要或不想要此功能)。但是,它会在除 Visual Studio 之外的每个编辑器其他中引发上述错误。

我安装的唯一扩展(根据扩展管理器)是:

  • 突出显示所有出现的选定单词
  • 用于 WPF 的 Microsoft 功能区(我没有在此项目中使用)

插件管理器没有显示插件。

编辑:

在挖掘并手动编辑.resx 文件后,问题实际上出在第124 行&lt;assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /&gt; 特别是Version=4.0.0.0

如果我将其设置为Version=2.0.0.0,那么在 Visual Studio 和所有外部程序中一切正常。但问题在于,如果我在 Visual Studio 中编辑任何内容,它会将其重置回 Version=4.0.0.0

暂时我将将目标框架设置为 .NET Framework 3.5 客户端配置文件,以便 Visual Studio 不会覆盖该版本。这是一种解决方法,意味着我无法使用 .NET 4.0 功能。

我猜是不是 .NET Framework 中存在错误,或者每个 .resx 编辑器(包括 Microsoft 的)都存在错误。

编辑 2: 事实证明,当我尝试使用 Microsoft 的 WinRes.exe 工具时,我实际上是在启动 .NET Framework 3.5 版本,因为没有安装 .NET Framework 4.0 版本。

我必须从http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/winsdk_web.exe 安装 .NET Framework 4.0 SDK,然后才能使用 WinRes.exe 4.0 编辑 .resx 文件

【问题讨论】:

  • 您是否执行了“PublicKeyToken=REMOVED”或者是确切的错误消息?那里的绘图也拼写错误。
  • 这是我输入的。我将对其进行编辑并将其重新添加。我猜公钥在那里没有害处。
  • @Blair McMillan:反正不是你的 :)
  • @Blair McMillan:我怀疑这两个数字之间的, 会导致某些文化出现问题。
  • @leppie:我不明白为什么 VS 会生成无效代码。我什至不想要那个选项,反正我只想要文本字符串。

标签: visual-studio winforms visual-studio-2010 localization resx


【解决方案1】:

Visual Studio 会创建正确的 *.resx 文件。问题是,您尝试使用的工具是为规范的先前版本创建的。这就是您的解决方法有效的原因。

请检查您正在使用的本地化工具是否没有更新版本或补丁。

【讨论】:

  • 是的。我找不到 WinRes.exe 的 4.0 版本(微软的工具是 VS 附带的)。
  • WinRes.exe 4.0 安装有.NET Framework SDK,可以从download.microsoft.com/download/A/6/A/…下载
  • @Paweł Dyda:嗯,它会创建正确的 *.resx 文件,但它会错误地读取它们。比如保存Ctrl+O,但是如果操作系统是德文的,只有值为“Strg+O”时才能读取key。我认为由此产生的事实是,正确的源代码只能在英文操作系统上编译,这是一种有点可疑的方法......
【解决方案2】:

在 .resx 中,找到 base64 编码字符串的第一行。结尾应该是“j00LjAuMC4w”(意思是 .net 4.0)。尝试将其更改为“j0yLjAuMC4w”(意思是 .net 2.0)。为我工作。感谢 Luis Mack http://connect.microsoft.com/VisualStudio/feedback/details/532584/error-when-compiling-resx-file-seems-related-to-beta2-bug-5252020#

【讨论】:

  • 这不是我所做的实际更改,但它让我意识到问题在于版本错误的库。
【解决方案3】:

有时在特定情况下,Windows 表单设计器在使用 *.resx 文件验证表单时崩溃。

附加数据源的控件会受到此行为的影响。就我而言,我有一些 DataSets 作为网格、组合的数据源......

所以我打开了设计器,但它没有告诉我它无法打开,因为名为:blabla 的控件存在问题

检查设计器文件后,我发现控件没有任何问题,只是 *.resx 文件指向错误的源,因为我重构了 DataSet。所以由于这次重构,*.resx 没有更新

我打开 *.resx 文件并简单地搜索控件的标识符并找到一个 Base64 编码的代码。 删除块内的值而不删除环绕标记将解决此控件的问题,因为 Windows 窗体设计器将自动刷新并将丢失的内容读取到 *.resx 文件中。

【讨论】:

    【解决方案4】:

    当编译器丢失某个对象的引用或您更改了该对象的重要属性时,会出现此错误,例如,如果您在表单上设置了 Grid(这意味着您正在使用 DataSet作为您的数据源来完成您的网格),并且您更改了 DataSet 的名称 VS 丢失了此链接,他会为您带来此消息。

    【讨论】:

      【解决方案5】:

      我刚刚删除了 .RESX 文件中的这些行

      <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken="" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-17
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        相关资源
        最近更新 更多