在Windows Phone 8.1上使用.resx资源时出现MissingManifestResourceException异常

15
我正在开发一个Windows Phone 8.1应用程序,也针对Android(Xamarin)进行了目标设置。
像往常一样,我在PCL上添加了我的字符串资源(.resx),并在我的启动器项目中引用它们以在我的视图中使用。这在WP 8.1 silverlight上都可以正常工作,但在WinRt上,当我将项目配置为发布并在设备上运行时,出现MissingManifestResourceException的异常。我尝试了所有的解决此问题的方案,但都没有成功。
请注意,在模拟器上一切正常。当解决方案配置器设置为Debug时,它也适用于设备和模拟器。这里唯一的组合是设备和Release。
该应用程序的源代码位于Github
我能够创建一个简单的项目来复制此问题,基本上它是一个WP 8.1应用程序和一个带有嵌入式资源的PCL项目,Download Link 有人有任何想法吗?

编辑:经过更多测试后,我尝试运行一个我使用相同本地化模型制作的旧Windows 8.1应用程序,发现出现了相同的问题,因此似乎是工具问题而不是配置问题,因为Windows 8.1应用程序已经上市,一切都很顺利。


我认为你应该像Windows Store应用程序一样进行本地化/全球化,而不是像我们在WP8.0中所做的那样...你应该使用一个Resources.resw文件,它将被转换为pri,然后进行加载。 - saramgsilva
问题在于我的可移植视图模型使用资源文件,改用 resw 将意味着我的应用程序的其他模块无法使用任何全球化资源,除非在抽象资源方面付出巨大的努力。 - DVD
我在各处使用DI来定义位置服务和本地化资源...这并不复杂。 - saramgsilva
我并没有说这很复杂,但是需要付出巨大的努力,因为你必须为4个平台实现它,通过构造函数传递一个额外的服务(或者在某个静态位置上拥有它),而且总是容易出错。XD - DVD
4个回答

11

我们的团队遇到了类似的问题,这个问题被追踪到运行时而不是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组件注入到每个引用的PCL生成的Resources类中,使用我们自己派生的ResourceManager将调用重定向到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 Connect报告实际上也是我提交的,哈哈。仍然困扰着我的一件事是,他们更改了什么以使得这个错误弹出了。我不得不对我所有的旧Win 8.1应用程序做这个解决方法……再次感谢! - DVD

9
我今天解决了这个问题。在打包应用程序时,会剥离与应用程序使用的语言不相关的依赖资源。为了防止这种情况发生,请将以下程序集级别属性添加到您的应用程序中。
using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

先尝试这个更简单的解决方案。这对我有用。 - ezaspi
请注意:不要忘记将PCL的中性语言设置为相同,否则此解决方案将无法工作。您可以通过修改PCL的AssemblyInfo.cs并添加此行来实现:[assembly: NeutralResourcesLanguage("en")]。或右键单击项目->属性->库->程序集信息->中性语言。http://imgur.com/XPEojAP - Adam Ivancza
对于那些像我一样,从Xamarin.Forms应用程序创建UWP应用程序并使用PCL进行字符串资源的人来说,这是正确的方式。谢谢,你让我在这个问题上节省了很多时间,真是帮了我的大忙。 - Theos
添加到哪个程序集 - UWP 应用程序程序集?资源程序集?项目中的每个程序集? - William Jockusch
@WilliamJockusch 我只需要将其添加到具有资源的 PCL 组件中。在 UWP 组件或其他任何地方没有属性也可以工作。 - RandomEngy

0

我有同样的行为。今天我创建了一个新的PCL库(使用其他名称),并将resx文件复制到该项目中。我修改了所有引用,并且现在我的WinRt(Windows Store)应用程序完美地工作!

便携式类库名称中有字符串'resources',也许这就是问题所在!


这并不是因为我可以在这里创建新项目和解决方案来复制问题。请重新检查,有时它第一次就能工作,但随后的部署会出现相同的错误 ;)。最终我在http://social.msdn.microsoft.com/Forums/windowsapps/en-US/ea01b44b-f0d5-4ed1-a044-93cddfe88941/missingmanifestresourceexception-on-windows-phone-81-with-resx-resources?forum=wpdevelop上提交了一个问题。 - DVD
它仍然可以在我的Windows Store应用中工作。不知道为什么以前不起作用。 - dschüsä
1
Visual Studio Premium 2013 更新3。项目是一个C# PCL(.NET 4.5.1, WP 8.1, WinStore 8.1),名称中没有“资源”,也没有文件名包含“资源”(如果项目名称中包含“资源”,我会得到MissingManifestResourceException异常,但我没有尝试重现它)。如果我读了你的帖子标题和内容,我不确定你是在Windows Store应用程序还是在Windows Phone应用程序中遇到了异常?我在我的Windows Store应用程序中遇到了异常。这可能是我们配置之间的差异 - 这也是为什么我在我的答案中多次提到它的原因。 - dschüsä
我在两个 xDD 上都遇到了异常,如果可以,请尝试下载我的项目(http://1drv.ms/1rLdoHw test.rar)并尝试一下 ;) - DVD
您的应用程序在我的系统上运行良好。即使我第二次和第三次发布它... - dschüsä
显示剩余4条评论

0

我能够重现这个问题,无论是在DVD示例中还是在我的项目中。我有一个WP Silverlight 8.1项目,注册了Windows Runtime组件后台任务,它们都使用可移植类库共享一些常见的本地化字符串作为资源(.resx),以及其他一些东西。当调用任何属性以获取生成的.Design.cs类上的字符串时(仅限Release + Device),后台任务会抛出异常。

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

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

在我看来,ResourceManager在发布版中不再与Windows Runtime兼容。

虽然这不是必要的答案,但比没有评论的50个声望点更好。


嗨,感谢您的发布。我正在尝试避免这种情况,因为它会破坏我之前所有的Windows 8项目,但是对于我即将开始的新项目,我一定会使用resw来避免浪费更多时间。 - DVD

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