【问题标题】:MissingManifestResourceException with Silverlight application referencing resx files in other projectMissingManifestResourceException 与 Silverlight 应用程序引用其他项目中的 resx 文件
【发布时间】:2014-10-08 17:37:40
【问题描述】:

我无法让 Silverlight 应用程序正常工作。这个项目很大,最近交给了我。它包括(除其他外):

  • 一个包含资源的类库(我们称之为MyResources)。这包含许多 .resx 文件,其中包含应用中各种标签/文本的翻译字符串。
  • 链接到常规类库中所有资源文件的 Silverlight 类库。 (我们称这个项目为MyResourcesSilverlight
  • 引用 MyResourcesSilverlight 的 Silverlight 应用程序

据我了解,由于安全问题,您无法使用 Silverlight 直接引用常规 .Net 程序集。这是有道理的,并解释了两个几乎相同的项目——Silverlight 类库和常规类库。 (还有很多其他项目使用常规类库)。

我遇到的问题是,当我尝试运行 Silverlight 应用程序时,它无法加载任何本地化字符串,并且我收到以下错误消息:

未捕获的错误:Silverlight 应用程序中未处理的错误 代码:4004
类别:ManagedRuntimeError
消息:System.Resources.MissingManifestResourceException:找不到适合指定区域性或中性区域性的任何资源。确保“MyResources.resources”在编译时已正确嵌入或链接到程序集“MyResourcesSilverlight”中,或者所有所需的附属程序集都是可加载且完全签名的。

从错误消息来看,它似乎很难提取资源文件 - 这从按钮、标签等缺失的文本中也很明显。

为了解决这个问题,我尝试了以下操作:

  • 清理/重建解决方案。这没有效果。
  • 右键单击资源文件并选择“运行自定义工具”。所有资源文件的自定义工具设置为PublicResXFileCodeGenerator。除了重新生成代码之外,这也没有任何效果,这会导致类构造函数是内部的(尽管被设置为公共。另一天的另一个问题 - 或者从我所看到的 - 微软拒绝的一个已知问题修复)。
  • 将所有资源文件设置为Embedded Resource。这没有效果。

我一直在四处寻找遇到类似问题的其他人,并且尝试了几乎所有我能得到的东西,但似乎没有任何效果。要么我收到上面的错误消息,要么我收到类似The name 'MyResources' does not exist in the current context. 的错误消息。

如果有帮助的话,该项目最初是 Visual Studio 2010 项目,但我已将其转换为 Visual Studio 2012 项目。据我所知,没有任何东西改变命名空间,这是这个问题的常见原因。

谁能解释一下这里可能发生的事情?我很困惑。

编辑:

也许还值得注意:我在 Visual Studio 设计器中的任何表单上都没有看到任何类型的文本。当我将鼠标悬停在据称丢失的 StaticResource 上时,它显示“资源___ 无法解析。”。我怀疑这可能表明资源文件通常存在更大的问题。有人有什么想法吗?

【问题讨论】:

    标签: c# .net silverlight visual-studio-2012 resx


    【解决方案1】:

    我最终解决了这个问题,但我仍然不能 100% 确定我做了什么来解决它。不过,这就是我所做的:

    由于这两个库项目的布局很奇怪,每当我触摸 MyResources 项目时,它都会自动更新 MyResourcesSilverlight 项目。这意味着如果我在 MyResources 上执行“运行自定义工具”,它将重新生成具有 MyResources 命名空间的资源设计器文件。如果我随后进入 MyResourcesSilverlight 项目并对那里的资源执行“运行自定义工具”,它将使用 MyResourcesSilverlight 命名空间重建文件。

    当我开始研究有问题的 XAML 文件时,我注意到它们指的是这样的事情:

    xmlns:resources="clr-namespace:MyResources.Resouce;assembly=MyResourcesSilverlight"
    

    这让我再次查看了 MyResourcesSilverlight 项目中生成的文件中的命名空间。果然,当对资源文件执行“运行自定义工具”时,它是在 MyResourcesSilverlight 命名空间而不是 MyResources 命名空间中生成它们。我将 MyResourcesSilverlight 项目的默认命名空间设置为 MyResources,然后再次执行“运行自定义工具”以重新生成自动生成的代码。尽管手动将自动生成的代码设置为公共的,我仍然不得不手动进入并将类构造函数从内部切换到公共。一旦我这样做了,事情似乎就开始起作用了。

    所以如果我总结一下,我会说看看以下内容:

    • 验证 XAML 文件正在使用的命名空间以及资源文件中自动生成的代码的命名空间。它们应该匹配。
    • 验证自动生成代码的构造函数是否公开。不要相信自定义工具。

    希望这可以帮助其他可能遇到类似问题的人。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2017-08-18
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多