MissingManifestResourceException,Silverlight应用程序引用其他项目中的resx文件

时间:2014-10-08 17:37:41

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

我很难让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上时,它会显示“资源___无法解析”。我怀疑这可能表明资源文件存在更大的问题。有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我最终解决了这个问题,但我仍然不能100%确定我所采取的措施。这就是我的所作所为:

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

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

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

这使我在MyResourcesSilverlight项目中生成的文件中的命名空间中看了两次。当然,在进行"运行自定义工具"在资源文件上,它是在MyResourcesSilverlight命名空间而不是MyResources命名空间中生成它们。我将MyResourcesSilverlight项目的默认命名空间设置为MyResources,然后执行"运行自定义工具"再次重新生成自动生成的代码。尽管手动设置自动生成的代码以创建公共事物,我仍然需要手动进入并将类构造函数从内部切换到公共。一旦我这样做,事情似乎开始奏效。

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

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

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