我在WinPhone应用中发现了本地化问题。我添加了几个资源并实现了本地化。它在模拟器中工作正常,但在电话上崩溃,异常抛出异常:mscorlib.ni.dll中的'System.Resources.MissingManifestResourceException'
任何帮助?
答案 0 :(得分:1)
感谢一些谷歌搜索和一篇有用的博客文章,我设法解决了Xamarin.Forms项目间歇性发生的问题。
这篇博客文章引导我找到解决方案: http://blog.tpcware.com/2016/06/xamarin-forms-localization/
基本上,使用Xamarin.Forms和Windows Phone访问Android和iOS上的资源的方式不同:
为了简化,我们需要在Store应用程序上运行时“自动”使用ResourceLoader.GetString(...)方法,同时继续在所有其他平台上使用常规ResourceManager.GetString(...)方法。因为在Xamarin Forms解决方案中我们使用RESX类型的资源文件,我们也有自动生成的资源类。 上面链接的帖子中包含的超级聪明的想法是“破解”资源类注入ResourceManager的派生类和重写的GetString(...)方法到资源类“resourceMan”属性(有关此hack的更详细解释,你可以阅读帖子。)
我们需要像这样创建自己的ResourceManager版本,并使用反射将其交换为现有的ResourceManager:
public class WinRTResourceManager : ResourceManager
{
readonly ResourceLoader _resourceLoader;
private WinRTResourceManager(string baseName, Assembly assembly) : base(baseName, assembly)
{
_resourceLoader = ResourceLoader.GetForViewIndependentUse(baseName);
}
public static void InjectIntoResxGeneratedApplicationResourcesClass(Type resxGeneratedApplicationResourcesClass)
{
resxGeneratedApplicationResourcesClass
.GetRuntimeFields()
.First(m => m.Name == "resourceMan")
.SetValue(null, new WinRTResourceManager(
resxGeneratedApplicationResourcesClass.FullName,
resxGeneratedApplicationResourcesClass.GetTypeInfo().Assembly));
}
public override string GetString(string name, CultureInfo culture)
{
return _resourceLoader.GetString(name);
}
}
当应用程序第一次启动时,剩下要做的就是调用它:
WinRTResourceManager.InjectIntoResxGeneratedApplicationResourcesClass(typeof(AppResources));
进行这些更改后,一切都应该正常工作。 当然这绝对是一个黑客,但我已经通知了Xamarin.Forms团队的问题,他们正在研究它,希望很快就能解决!