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

时间:2017-12-21 10:39:29

标签: c# reflection mscorlib

在调试问题时,我正在深入研究mscorlib,特别是在GetName()的{​​{1}}。

查看dotPeek和reference source方法的代码,System.Reflection.Assembly的代码似乎没有任何内容,并抛出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(); } 之类的代码行会返回正确版本的DLL吗?

1 个答案:

答案 0 :(得分:3)

因为Assembly是基类,所以在运行时(在此特定设置中)返回的实际对象是 实现的RuntimeAssembly那种方法。

根据您获取Assembly对象的方式,可以使用不同的实际类型,无论是实际运行时代码还是仅反射探测器等等。

但是Assembly是基类。

我可以毫不含糊地说这是因为Assembly类是抽象的,从https://mega.nz/#!o7xDGKiS!K90BfxBiaRNVMkY9SPox8bRNm3rwNPjbQcaEC3wSGjM可以看出:

public abstract class Assembly : _Assembly, IEvidenceFactory, ICustomAttributeProvider, ISerializable

它也是reference source

[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变量的对象的任何实例都必须是派生类。