带有 .resx 资源的 Windows Phone 8.1 上的 MissingManifestResourceException

Posted

技术标签:

【中文标题】带有 .resx 资源的 Windows Phone 8.1 上的 MissingManifestResourceException【英文标题】:MissingManifestResourceException on Windows Phone 8.1 with .resx resources 【发布时间】:2014-10-01 11:19:47 【问题描述】:

我正在开发一个同样针对 android(Xamarin) 的 Windows Phone 8.1 应用

正如我在 PCL 上添加我的字符​​串资源 (.resx) 并在我的启动器项目中引用它们以在我的视图中使用它一样,这一切在 WP 8.1 silverlight 上都可以正常工作,但在我将项目配置为发布时在 WinRt 上运行良好并在设备上运行它,由于某种原因,我总是得到一个 MissingManifestResourceException。我已经尝试了解决这个问题的所有方法,但没有任何成功。

请注意,在模拟器上一切正常,当解决方案配置器设置为调试时,它也适用于设备和模拟器。这里唯一的组合是 device 和 Release。

应用源代码在Github。

我能够创建一个简单的项目来复制这个问题,基本上它是一个 WP 8.1 应用程序和一个带有嵌入式资源的 PCL 项目,Download Link

有人有什么想法吗?

编辑:在进行更多测试后,我尝试运行一个旧的 Windows 8.1 应用程序,该应用程序使用相同的本地化模型完成,并且出现了相同的问题,因此它似乎是工具问题而不是配置问题,因为 Windows 8.1 应用已上市,一切顺利。

【问题讨论】:

我认为您应该像在 Windows Store 应用程序中那样进行本地化/全球化,而不是像我们在 WP8.0 中那样...您应该使用将转换为 pri 的 Resources.resw 文件,这将加载。 问题是我的可移植视图模型使用资源文件,更改为 resw 意味着我的应用程序的其他模块无法使用任何全球化资源,而无需大量努力抽象资源。 我使用 DI 来定义位置服务和无处不在的本地化资源...并不复杂 我并没有说它很复杂,但它需要付出巨大的努力,因为您必须为 4 个平台实现,通过构造函数再传递一个服务(或在某个地方静态地传递),并且一如既往地可以容易出错。 XD 【参考方案1】:

我们的团队遇到了类似的问题,该问题被追踪到运行时,而不是 PCL、WinRT 组件或应用程序包。也就是说,资源存在于 PCL 程序集、应用程序包 resources.pri 文件中,但在运行时找不到。

这里有一个有效的 Microsoft Connect 报告:

https://connect.microsoft.com/VisualStudio/feedback/details/991028/issue-using-resx-files-on-winrt-apps-windows-phone-and-windows

我们的解决方法是让 WinRT 组件将我们自己的派生 ResourceManager 注入到每个引用的 PCL 的每个生成的资源类中,从而将调用重定向到 WinRT ResourceLoader。我写了一篇描述该解决方法的博文:

http://blogs.msdn.com/b/philliphoff/archive/2014/11/19/missingmanifestresourceexception-when-using-portable-class-libraries-in-winrt.aspx

【讨论】:

感谢您的回复。您的解决方案完美运行(win8 和 wp8.1);)。 MS 连接报告实际上也来自我。仍然困扰我的一件事是他们改变了什么来弹出这个错误。我必须对所有旧的 Win 8.1 应用程序执行此解决方法...再次非常感谢!【参考方案2】:

我今天查到了这个问题。在捆绑应用程序包时,不属于应用程序使用的语言的依赖项中的资源将被剥离。为防止这种情况发生,请将以下程序集级属性添加到您的应用程序中。

using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

【讨论】:

先试试这个更简单的解决方案。这对我有用。 仅供参考:不要忘记将 PCL 的中性语言设置为相同,否则此解决方案将不起作用。您可以通过修改 PCL 的 AssemblyInfo.cs 并添加以下行来做到这一点:[assembly: NeutralResourcesLanguage("en")]。或者右键项目->属性->库->程序集信息->中性语言。 imgur.com/XPEojAP 对于像我这样从 Xamarin.Forms 应用程序创建 UWP 应用程序并使用 PCL 获取字符串资源的人来说,这是要走的路。谢谢,你在这件事上浪费了很多时间,让我很开心。 添加到哪个程序集——UWP 应用程序集?资源组装?项目中的每个程序集? @WilliamJockusch 我只需要将它添加到具有资源的 PCL 程序集中。它在没有 UWP 程序集或其他任何属性的情况下工作。【参考方案3】:

我也有同样的行为。今天我创建了一个新的 PCL 库(使用另一个名称)并将 resx 文件复制到该项目中。我修改了所有引用,现在在我的 WinRt(Windows 商店)应用程序中一切正常!

可移植类库名称中有字符串“resources”。也许这就是问题所在!

【讨论】:

并非如此,因为在这里我可以复制创建新项目和解决方案的问题。请重新检查它,有时它在第一次工作但随后的部署出现相同的错误;)。我最终在social.msdn.microsoft.com/Forums/windowsapps/en-US/… 上提交了一个问题 它仍然可以在我的 Windows Store 应用程序中使用。不知道为什么这以前没有用。 你能告诉我你的 vs 环境吗? Visual Studio Premium 2013 更新 3。项目是 C# PCL(.NET 4.5.1、WP 8.1、WinStore 8.1),其名称中没有“资源”,并且没有文件包含“资源”(带有 '项目名称中的资源'我得到了一个 MissingManifestResourceException 但我没有尝试重现它)。如果我阅读了您的帖子标题和帖子内容,我不确定您是否在 Windows Store 应用程序或 Windows Phone 应用程序中获得了异常?我在我的 Windows 应用商店应用程序中遇到了异常。这可能是我们配置之间的差异——这也是我在回答中多次提到它的原因。 我在两个 xDD 上都遇到了异常,如果可以请尝试下载我的项目 (1drv.ms/1rLdoHwtest.rar) 并尝试一下;)【参考方案4】:

我能够在启动 DVD 示例时重现此问题,但不幸的是在我的项目中。我有一个注册 Windows 运行时组件后台任务的 WP Silverlight 8.1 项目,并且它们都使用可移植类库共享一些常见的本地化字符串作为资源 (.resx) 等等。调用任何属性以获取生成的 .Design.cs 类(仅 Release + Device)上的字符串时,后台任务会引发异常。

为了解决这个问题,我尝试直接使用 ResourceManager 和/或将 .resx 文件直接添加到后台任务中,但没有成功。

我最终将所需的字符串移植到 .resw 文件并在后台任务项目中通过 Windows.ApplicationModel.Resources.ResourceLoader 使用new "WinRT preferred" way。

在我看来,ResourceManager 在发布时不再与 Windows 运行时兼容。

这不是必须的答案,但总比没有好,因为我没有 50 点声望点来发表评论。

【讨论】:

您好,感谢您的发帖,我试图避免这种情况,因为它会破坏我以前拥有的所有 Windows 8 项目,但我将开始的新项目我肯定会使用 resw 来避免浪费更多时间。

以上是关于带有 .resx 资源的 Windows Phone 8.1 上的 MissingManifestResourceException的主要内容,如果未能解决你的问题,请参考以下文章

找不到资源文件“**/*.resx”。 (MSB3552) 在 VS for Mac 上

从 .resx 为 .NET Core 3.1 应用程序生成资源 dll

循环遍历 .resx 文件中的所有资源

如何继承资源文件(resx)

防止资源 [.resx] 文件预编译。 .NET 核心 2.0

大型项目中的资源 (resx) 维护