为什么 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。
在调试问题时,我正在深入研究 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。