System.Global.CultureNotFoundException 在某些系统上而不是其他系统上

System.Global.CultureNotFoundException on some systems but not others

我们收到客户的请求,将海地克里奥尔语 resx 文件添加到我们的应用程序中。我们得到了翻译,我去插入它们,但我立即发现浏览器很少支持 ht 作为 language/locale 代码。 Chrome 不会让你在任何地方输入它。 IE 11 允许您将其作为自定义代码输入。只有 Edge 和 Firefox 提供了它。

但让我感到困惑的是,当我进入插入了这些 resx 文件的调试系统,并使用浏览器访问该站点时,我在以下行中得到 System.Global.CultureNotFoundException:

CultureInfo ci = CultureInfo.CreateSpecificCulture(cultureName);

但是如果我使用我们的发布版本转到另一个系统,没有 有 resx 文件,则没有错误。显然我也没有得到任何海地克里奥尔语翻译,但是当出现 ht 时,同样的代码不会爆炸。

我执行了相同的 powershell 命令来列出两个系统上支持的语言,海地克里奥尔语不在两个系统的列表中。

[system.Globalization.CultureInfo]::GetCultures('AllCultures')

当浏览器显示无法识别的代码时,是否会悄悄地退回到系统语言,这是某种发布模式构建的东西吗?据我所知,我的测试系统之间的唯一区别是 release mode/no ht resx 和 debug mode/with ht resx.

我不明白为什么我在两个地方都没有得到相同的异常...

谢谢

有很多优化,这里可能的罪魁祸首是 Just-in-time compiler。如果它检测到任何它可以归类为 "dead code" 的内容,它会毫不犹豫地将其删除。

当我尝试编写在具有 2 GiB 限制的 x32 系统上强制出现 OOM 异常的代码时,我 运行 进入了那个问题:如果有问题的部分被检测为 "dead code",我真的无法强迫 OOM。一个简单的输出顺序解决了这个问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OOM_32_forced
{
    class Program
    {
        static void Main(string[] args)
        {
            //each short is 2 byte big, Int32.MaxValue is 2^31.
            //So this will require a bit above 2^32 byte, or 2 GiB
            short[] Array = new short[Int32.MaxValue];

            /*need to actually access that array
            Otherwise JIT compiler and optimisations will just skip
            the array definition and creation */
            foreach (short value in Array)
                Console.WriteLine(value);
        }
    }
}

当您的应用 具有语言环境代码的 resx 文件 但系统无法识别时,似乎会出现 System.Global.CultureNotFoundException 异常。

利用 IE 11 的功能输入您想要的任何奇怪的自定义代码,我添加了 xx-xx 并将其放在列表的顶部。当然,我没有 xx-xx.

的任何 resx 文件

以 Accept-Language header 开头并以 xx-xx 开头的站点请求不会抛出 System.Global.CultureNotFoundException 异常;它只是悄悄地移动到列表中的下一个。

我的开发站点和其他发布版本之间的区别是我的开发站点在构建中有 .ht.resx 个文件,而其他质量检查站点没有