我在 WinPhone 应用程序中发现了本地化问题。我添加了一些资源并实施了本地化。它在模拟器中运行良好,但在电话上崩溃并抛出异常异常:mscorlib.ni.dll 中的“System.Resources.MissingManifestResourceException”
有什么帮助吗?
我在 WinPhone 应用程序中发现了本地化问题。我添加了一些资源并实施了本地化。它在模拟器中运行良好,但在电话上崩溃并抛出异常异常:mscorlib.ni.dll 中的“System.Resources.MissingManifestResourceException”
有什么帮助吗?
多亏了一些谷歌搜索和一篇有用的博客文章,我设法解决了这个在 Xamarin.Forms 项目中间歇性发生的问题。
这是引导我找到解决方案的博客文章:http: //blog.tpcware.com/2016/06/xamarin-forms-localization/
基本上,使用 Xamarin.Forms 和 Windows Phone 在 Android 和 iOS 上访问资源的方式是不同的:
简而言之,我们需要在商店应用程序上运行时“自动”使用 ResourceLoader.GetString(...) 方法,同时在所有其他平台上继续使用常规 ResourceManager.GetString(...) 方法。并且因为在 Xamarin Forms 解决方案中我们使用了 RESX 类型的资源文件,所以我们还拥有自动生成的资源类。上面链接的帖子中包含的超级聪明的想法是“破解”资源类,将 ResourceManager 的派生类与重写的 GetString(...) 方法注入资源类“resourceMan”属性(有关此破解的更详细说明,你可以阅读这篇文章)。
我们需要像这样创建我们自己的 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));
进行这些更改后,现在一切都应该可以正常工作了。当然,这绝对是一个 hack,但我已经通知了 Xamarin.Forms 团队这个问题,他们正在调查它,所以希望它会很快得到解决!