Почему GetName в System.Reflection.Assembly, по-видимому, генерирует NotImplementedException при декомпиляции?
При отладке проблемы я копался в mscorlib и, в частности, в GetName()
в System.Reflection.Assembly
,
Глядя на код для метода в dotPeek, а также на исходный код для 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()
возвращает правильную версию DLL?
1 ответ
Это потому что Assembly
базовый класс, фактический объект, который вы получаете во время выполнения (в данном конкретном случае) RuntimeAssembly
который реализует этот метод.
В зависимости от того, как вы получаете Assembly
объект, есть различные действительные типы в игре, будь то для действительного кода времени выполнения или только для размышлений или чего-то еще.
Но Assembly
это базовый класс.
Я могу сказать это однозначно, потому что Assembly
класс является абстрактным, как видно из справочного источника:
public abstract class Assembly : _Assembly, IEvidenceFactory, ICustomAttributeProvider, ISerializable
И это также задокументировано:
[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
переменная должна быть производным классом.