Xamarin:WinPhone上的'System.Resources.MissingManifestResourceException'

时间:2016-08-22 12:19:15

标签: xamarin localization xamarin.winphone

我在WinPhone应用中发现了本地化问题。我添加了几个资源并实现了本地化。它在模拟器中工作正常,但在电话上崩溃,异常抛出异常:mscorlib.ni.dll中的'System.Resources.MissingManifestResourceException'

任何帮助?

1 个答案:

答案 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团队的问题,他们正在研究它,希望很快就能解决!