在调试问题时,我正在深入研究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吗?
答案 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
变量的对象的任何实例都必须是派生类。