为什么 System.Reflection.Assembly 中的 GetName 在反编译时似乎会抛出 NotImplementedException?

Why does GetName in System.Reflection.Assembly appear to throw a NotImplementedException when decompiled?

在调试问题时,我正在深入研究 mscorlib,特别是在 System.Reflection.Assembly 中的 GetName()

查看 dotPeek 和 reference source 中方法的代码,GetName() 的代码似乎没有任何内容并抛出 NotImplementedException:

#if FEATURE_CORECLR
    [System.Security.SecurityCritical] // auto-generated
#endif
    public virtual AssemblyName GetName()
    {
        return GetName(false);
    }

#if FEATURE_CORECLR
    [System.Security.SecurityCritical] // auto-generated
#endif
    public virtual AssemblyName GetName(bool copiedName)
    {
        throw new NotImplementedException();
    }

任何人都可以解释为什么这似乎抛出异常,但使用诸如 typeof(object).GetTypeInfo().Assembly.GetName().Version.ToString() returns 之类的代码行是 DLL 的正确版本吗?

那是因为 Assembly 是基础 class,您在运行时(在此特定设置中)返回的实际对象是 RuntimeAssembly 实施该方法。

根据您获取 Assembly 对象的方式,有不同的实际类型在起作用,无论是实际的运行时代码还是仅反射探查或诸如此类的东西。

但是Assembly是一个基数class。

我可以明确地说,因为 Assembly class 是抽象的,从 reference source:

可以明显看出
public abstract class Assembly : _Assembly, IEvidenceFactory, ICustomAttributeProvider, ISerializable

还有documented:

[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Assembly : System.Reflection.ICustomAttributeProvider, System.Runtime.InteropServices._Assembly, System.Runtime.Serialization.ISerializable, System.Security.IEvidenceFactory

因此,适合 Assembly 变量的对象的任何实例都必须是派生的 class。