Следующий код IL создает экземпляр типа с именем (fnptr)*
(токен 0x2000000 - недействительный, модуль mscorlib.dll).
ldtoken method void* ()*
call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
Какая цель этого типа? Возможно ли создать экземпляр этого типа в С# без написания кода IL, возможно, с отражением? Module.ResolveType на токене вызывает исключение ArgumentOutOfRangeException.
Edit:
Очистить тип (fnptr)
- это внутреннее представление типа CLR типа указателя метода IL, хотя при удалении последнего *
он просто возвращает IntPtr
.
Изменить # 2:
(fnptr)
происходит от функции, которая видна в SSCLI typestring.cpp:
// ...or function pointer else if (ty.IsFnPtrType()) { // Don't attempt to format this currently, it may trigger GC due to fixups. tnb.AddName(L"(fnptr)"); }
Почему базовый fnptr возвращает IntPtr, можно увидеть в файле typehandle.cpp:
OBJECTREF TypeHandle::GetManagedClassObject() const {
[...]
switch(GetInternalCorElementType()) { case ELEMENT_TYPE_ARRAY: case ELEMENT_TYPE_SZARRAY: case ELEMENT_TYPE_BYREF: case ELEMENT_TYPE_PTR: return ((ParamTypeDesc*)AsTypeDesc())->GetManagedClassObject(); case ELEMENT_TYPE_VAR: case ELEMENT_TYPE_MVAR: return ((TypeVarTypeDesc*)AsTypeDesc())->GetManagedClassObject(); // for this release a function pointer is mapped into an IntPtr. This result in a loss of information. Fix next release case ELEMENT_TYPE_FNPTR: return TheIntPtrClass()->GetManagedClassObject(); default: _ASSERTE(!"Bad Element Type"); return NULL; } } }
Итак, похоже, они забыли исправить это.