.NET 中系统程序集的 CultureName

Posted

技术标签:

【中文标题】.NET 中系统程序集的 CultureName【英文标题】:CultureName of System assembly in .NET 【发布时间】:2015-04-29 07:46:59 【问题描述】:

在用 C# 编写一些代码处理程序集时,我注意到 Assembly 对象的字段值不一致(System 程序集的示例):

> typeof(string).Assembly.FullName
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

但是当直接访问AssemblyName对象的CultureName字段时,其值为空字符串:

> typeof(string).Assembly.GetName().CultureName
""

当我在 Linux (mono 3.99) 上运行相同的测试时,我得到了另一个结果:

> typeof(string).Assembly.GetName().CultureName
"neutral"

.NET 为什么会这样?我在 msdn 上找不到有关 AssemblyName 类中 CultureName 字段的默认值或含义的任何信息 空字符串。空字符串是否总是指“中性”文化名称?

【问题讨论】:

【参考方案1】:

CultureName 属性是在 .Net 4.5 中引入的,具有中性区域性的 Assembly 的该属性值必须等于空字符串,例如不变区域性的名称,因为 CultureName 使用CultureInfo 属性(source):

public String CultureName

    get
    
        return (_CultureInfo == null) ? null : _CultureInfo.Name;
    

但在 Mono 中,CultureName 属性有不同的实现 (source)。为什么不一样?我认为 Mono 的开发人员知道答案。

public string CultureName  
    get  
        if (cultureinfo == null) 
            return null; 
        if (cultureinfo.LCID == CultureInfo.InvariantCulture.LCID) 
            return "neutral"; 
        return cultureinfo.Name; 
     
 

因此,如果您想检查 AssemblyName 是否具有中性文化,请使用以下代码:

if (object.Equals(assemblyName.CultureInfo, CultureInfo.InvariantCulture))
 /* neutral culture */ 

【讨论】:

来源永远是寻找答案的最佳场所,谢谢!实际上,当您深入(查看CultureInfo)代码时,有一个片段,其中区域名称为null 时返回空字符串。

以上是关于.NET 中系统程序集的 CultureName的主要内容,如果未能解决你的问题,请参考以下文章

在发布模式下显示 .NET 程序集的堆栈跟踪中的行号

如何在 Windows Vista 和更高版本(Windows 7、2008)中查看 .NET 程序集的程序集版本?

获取 .NET 程序集的 AssemblyInformationalVersion 值?

获取 .NET 程序集的日期 [重复]

ASP .NET CORE 找不到带有自定义程序集的文件或程序集

.NET 4.0 无法解析对 System.Web.Extensions 程序集的引用