C# 可以在本地开发人员计算机上为en创建区域性

C# 可以在本地开发人员计算机上为en创建区域性,c#,.net,.net-4.5.2,C#,.net,.net 4.5.2,我刚刚将我们的应用程序部署到azure登台环境中,遇到了不支持en区域性的问题。经过一番挖掘,我发现没有这样的文化,我应该使用en-GB或en-US 但是,现在我的问题是。在我的本地开发机器上,我可以用en创建CultureInfo CultureInfo ci = new CultureInfo("en-EN"); Console.WriteLine("culture: "+ ci.ThreeLetterISOLanguageName); 输出区域性:eng 我还尝试使用CultureIn

我刚刚将我们的应用程序部署到azure登台环境中,遇到了不支持
en
区域性的问题。经过一番挖掘,我发现没有这样的文化,我应该使用
en-GB
en-US

但是,现在我的问题是。在我的本地开发机器上,我可以用
en
创建
CultureInfo

CultureInfo ci = new CultureInfo("en-EN"); 
Console.WriteLine("culture: "+ ci.ThreeLetterISOLanguageName);
输出
区域性:eng

我还尝试使用
CultureInfo.GetCultures(CultureTypes.AllCultures)枚举所有文化并且结果中没有相应的
en-en
区域性


那么,到底发生了什么,为什么我可以创建一个不应该存在的区域性?

如果您使用Windows 10,区域性行为已经改变:“未知”,但“可能存在”区域性(3个字母的iso)只会导致LCID 4096的“未知地区”区域性。 在Windows 10之前,这将导致异常(除非您安装了这样的自定义区域性)


如果您使用的是Windows 10,则区域性行为已更改:“未知”,但“可能存在”区域性(3个字母的iso)只会导致LCID为4096的“未知区域设置”区域性。 在Windows 10之前,这将导致异常(除非您安装了这样的自定义区域性)

作为缔约国:

从Windows 7或更高版本的.NET Framework 4或更高版本下运行的应用程序开始,该方法尝试从操作系统检索标识符为name的CultureInfo对象如果操作系统不支持该区域性,并且如果名称不是补充或替换区域性的名称,则该方法将抛出CultureNotFoundException异常

因此,基本上,您的操作系统将
en-en
作为现有区域性的替代名称(更可能是
en-US
),而它不在Azure VM上

解决方案是:使用真实的区域性名称(您可以找到)

,如下所示:

从Windows 7或更高版本的.NET Framework 4或更高版本下运行的应用程序开始,该方法尝试从操作系统检索标识符为name的CultureInfo对象如果操作系统不支持该区域性,并且如果名称不是补充或替换区域性的名称,则该方法将抛出CultureNotFoundException异常

因此,基本上,您的操作系统将
en-en
作为现有区域性的替代名称(更可能是
en-US
),而它不在Azure VM上


解决方案是:使用真实的文化名称(你可以找到)

你总是可以创建一个不存在的文化。你的意思是什么?如果我在我们的登台机器上运行上面的代码片段,我会得到一个异常,说不支持区域性(这是我所期望的),您总是可以创建一个不存在的区域性。这是什么意思?如果我在我们的登台机器上运行上述代码段,我会得到一个异常,表示不支持该区域性(这是我所期望的)
        try
        {


            // ok
            CultureInfo culture1 = new CultureInfo("foo");
            CultureInfo culture2 = new CultureInfo("xyz");
            CultureInfo culture3 = new CultureInfo("en-xy");

            // not ok - exception
            CultureInfo culture4 = new CultureInfo("foox");

        }
        catch (Exception exc)
        {

        }