Xamarin.Forms + .resx 字符串资源 - System.IO.FileNotFoundException:图像无效
Xamarin.Forms + .resx string resources - System.IO.FileNotFoundException: Invalid Image
我正在创建一个基于 C# 共享代码项目的 Xamarin.Forms 应用程序和另外两个用于实际 Android + iOS 应用程序的项目。
我现在想像文档中那样实现字符串本地化 here。因此,我在我的 .resx 文件解决方案中创建了一个 .net 标准 2.0 库项目,并在我的两个主要项目中引用了该项目,当然,我还执行了链接文章中描述的所有其他步骤。
当我现在想从我的应用程序项目之一访问我的任何字符串资源时,ResourceManager.GetString
抛出此异常:System.IO.FileNotFoundException: Invalid Image
示例代码就是那一行,但它也可以是任何其他字符串资源。
public static string global_copyright {
get {
return ResourceManager.GetString("global_copyright", resourceCulture);
}
}
我可以确认已找到并正确加载此库项目的程序集,因为我可以创建该项目中定义的其他 类 的实例。
现在我将这段代码直接放在 App() 构造函数的开头,就像那篇文章中描述的那样,以调试此类问题:
var assembly = typeof(AppResources).GetTypeInfo().Assembly;
foreach (var res in assembly.GetManifestResourceNames())
{
System.Diagnostics.Debug.WriteLine("found resource: " + res);
}
var test = AppResources.global_copyright;
第一行执行得很好,它告诉我在那个程序集中找到了一个资源文件。它的名字也是正确的。但是在最后一行它因该异常而崩溃。
我做错了什么?为什么 ResourceManager 无法从该程序集加载字符串资源?
Visual Studio 2017 (15.9.6) 与 Xamarin.Forms v3.4
由于还没有真正的答案,我想提出一个解决方法作为初步答案,直到有人找到更好的答案。
首先,问题仍然存在于 Visual Studio 2019 (16.1.2) Xamarin.Forms v3.6
我发现它的发生是因为在 Visual Studio 异常设置中我检查了在所有 "Common Language Runtime Exceptions" 上中断。当我禁用该设置时,可以毫无问题地调试应用程序并且正确加载资源字符串。
接下来,我发现它似乎是 ResourceManager 的内部异常,无论出于何种原因冒泡到我自己的代码中。引发此异常时,只需按 F5 继续调试(必须执行两次,但仅在您第一次访问资源时执行)并且应用程序继续 运行 正常。
所以有三种可能的解决方法:
- 在异常设置
中禁止在 "Common Language Runtime Exceptions" 上中断
- 在异常设置中,勾选 "Common Language Runtime Exceptions" 但仅禁用 "System.IO.FileNotFoundException" 中断。
- 当抛出该异常时,只需使用 F5 继续调试
我正在创建一个基于 C# 共享代码项目的 Xamarin.Forms 应用程序和另外两个用于实际 Android + iOS 应用程序的项目。
我现在想像文档中那样实现字符串本地化 here。因此,我在我的 .resx 文件解决方案中创建了一个 .net 标准 2.0 库项目,并在我的两个主要项目中引用了该项目,当然,我还执行了链接文章中描述的所有其他步骤。
当我现在想从我的应用程序项目之一访问我的任何字符串资源时,ResourceManager.GetString
抛出此异常:System.IO.FileNotFoundException: Invalid Image
示例代码就是那一行,但它也可以是任何其他字符串资源。
public static string global_copyright {
get {
return ResourceManager.GetString("global_copyright", resourceCulture);
}
}
我可以确认已找到并正确加载此库项目的程序集,因为我可以创建该项目中定义的其他 类 的实例。
现在我将这段代码直接放在 App() 构造函数的开头,就像那篇文章中描述的那样,以调试此类问题:
var assembly = typeof(AppResources).GetTypeInfo().Assembly;
foreach (var res in assembly.GetManifestResourceNames())
{
System.Diagnostics.Debug.WriteLine("found resource: " + res);
}
var test = AppResources.global_copyright;
第一行执行得很好,它告诉我在那个程序集中找到了一个资源文件。它的名字也是正确的。但是在最后一行它因该异常而崩溃。 我做错了什么?为什么 ResourceManager 无法从该程序集加载字符串资源?
Visual Studio 2017 (15.9.6) 与 Xamarin.Forms v3.4
由于还没有真正的答案,我想提出一个解决方法作为初步答案,直到有人找到更好的答案。
首先,问题仍然存在于 Visual Studio 2019 (16.1.2) Xamarin.Forms v3.6
我发现它的发生是因为在 Visual Studio 异常设置中我检查了在所有 "Common Language Runtime Exceptions" 上中断。当我禁用该设置时,可以毫无问题地调试应用程序并且正确加载资源字符串。
接下来,我发现它似乎是 ResourceManager 的内部异常,无论出于何种原因冒泡到我自己的代码中。引发此异常时,只需按 F5 继续调试(必须执行两次,但仅在您第一次访问资源时执行)并且应用程序继续 运行 正常。
所以有三种可能的解决方法:
- 在异常设置
- 在异常设置中,勾选 "Common Language Runtime Exceptions" 但仅禁用 "System.IO.FileNotFoundException" 中断。
- 当抛出该异常时,只需使用 F5 继续调试